func receiver(rs rs, cc *mqtt.ClientConn, mu *sync.Mutex) error { for { if ok := rs.Advance(); !ok { return rxerr(rs.Err()) } m1 := rs.Value() mu.Lock() cc.Publish(&proto.Publish{ Header: proto.Header{Retain: false}, TopicName: string(m1.Topic), Payload: proto.BytesPayload(m1.Payload), }) mu.Unlock() } }
func pub(i int) { topic := fmt.Sprintf("loadtest/%v", i) var cc *mqtt.ClientConn if cc = connect(); cc == nil { return } for i := 0; i < *messages; i++ { cc.Publish(&proto.Publish{ Header: proto.Header{QosLevel: proto.QosAtMostOnce}, TopicName: topic, Payload: proto.BytesPayload([]byte("loadtest payload")), }) } cc.Disconnect() }
func decode(cc *mqtt.ClientConn, src *net.UDPAddr, pkt []byte) { // Parse packet code := pkt[0] groupId := pkt[1] nodeId := pkt[2] & 0x1f ack := 0 // really need to decode pkt[2] data := pkt[3:] // Record the groupId -> addr mapping newGroup := saveGroupToAddr(groupId, src) // If this is a new group subscribe to the topic if newGroup { sub := []proto.TopicQos{ {Topic: fmt.Sprintf("/rf/%d/+/tx", groupId), Qos: proto.QosAtMostOnce}, {Topic: fmt.Sprintf("/rf/%d/+/tb", groupId), Qos: proto.QosAtMostOnce}, } cc.Subscribe(sub) } // Create the topic if code > RF_Debug && code != RF_BootReply { log.Printf("Dropping UDP packet due to unprocessable code=%d", code) log.Printf("%#v", pkt[0:9]) return } // handle boot protocol rxrb := "rx" kind := "" switch code { case RF_Pairing: rxrb = "rb" kind = "pairing" case RF_BootReq: rxrb = "rb" kind = "boot" } // handle packets with no source node id switch code { case RF_DataPush, RF_DataReq, RF_AckBcast, RF_BootReply, RF_Debug: nodeId = 0 } // finally the topic topic := fmt.Sprintf("/rf/%d/%d/%s", groupId, nodeId, rxrb) // Create the payload payload, _ := json.Marshal(RFMessage{ AsOf: time.Now().UnixNano() / 1000000, // Javascript time: milliseconds Base64: base64.StdEncoding.EncodeToString(data), Kind: kind, }) // Send it off cc.Publish(&proto.Publish{ Header: proto.Header{QosLevel: proto.QosLevel(ack)}, TopicName: topic, Payload: proto.BytesPayload(payload), }) // Log message, if appropriate if code == 9 { log.Printf("JeeUDP: %s", data) } log.Printf("MQTT PUB %s code=%d len=%d", topic, code, len(pkt)) }