func main() { flag.Parse() done := make(chan bool) c := &service.Client{} msg := message.NewConnectMessage() msg.SetVersion(3) msg.SetCleanSession(true) msg.SetClientId(clientID) msg.SetKeepAlive(300) if err := c.Connect("tcp://127.0.0.1:1883", msg); err != nil { panic(err) } pub := message.NewPublishMessage() pub.SetTopic([]byte(*topic)) pub.SetQoS(0) pub.SetPayload([]byte(*payload)) if err := c.Publish(pub, nil); err != nil { panic(err) } fmt.Println("waiting", 1) <-done }
func pub(c *service.Client, msg *message.PublishMessage) error { log.Printf("on publish: topic=%s payload=%s\n", string(msg.Topic()), string(msg.Payload())) pub := message.NewPublishMessage() pub.SetTopic([]byte("a/b/c/response")) pub.SetQoS(0) pub.SetPayload([]byte("Hi MQTT Server")) return c.Publish(pub, nil) }
func newPublishMessageLarge(qos byte) *message.PublishMessage { msg := message.NewPublishMessage() msg.SetTopic([]byte("test")) msg.SetPayload(make([]byte, 1024)) msg.SetQoS(qos) return msg }
func (smq *SurgeMQ) Send(msgbytes []byte) { msg := message.NewPublishMessage() msg.SetTopic([]byte(smq.subject)) msg.SetPayload(msgbytes) msg.SetQoS(0) smq.client.Publish(msg, nil) }
func newPublishMessage(pktid uint16, qos byte) *message.PublishMessage { msg := message.NewPublishMessage() msg.SetPacketId(pktid) msg.SetTopic([]byte("abc")) msg.SetPayload([]byte("abc")) msg.SetQoS(qos) return msg }
func main() { flag.Parse() c := service.Client{} msg := message.NewConnectMessage() msg.SetWillQos(1) msg.SetVersion(4) msg.SetCleanSession(true) msg.SetClientId([]byte("surgemq")) msg.SetKeepAlive(10) msg.SetWillTopic([]byte("will")) msg.SetWillMessage([]byte("send me home")) msg.SetUsername([]byte("surgemq")) msg.SetPassword([]byte("verysecret")) // Connects to the remote server at 127.0.0.1 port 1883 str := *addr + ":" + *port c.Connect("tcp://"+str, msg) // Creates a new SUBSCRIBE message to subscribe to topic "abc" submsg := message.NewSubscribeMessage() submsg.AddTopic([]byte("abc"), 0) // Subscribes to the topic by sending the message. The first nil in the function // call is a OnCompleteFunc that should handle the SUBACK message from the server. // Nil means we are ignoring the SUBACK messages. The second nil should be a // OnPublishFunc that handles any messages send to the client because of this // subscription. Nil means we are ignoring any PUBLISH messages for this topic. c.Subscribe(submsg, onCompleteFunc, onPublishFunc) // Creates a new PUBLISH message with the appropriate contents for publishing pubmsg := message.NewPublishMessage() pubmsg.SetTopic([]byte("abc")) pubmsg.SetPayload(make([]byte, 1024)) pubmsg.SetQoS(0) // Publishes to the server by sending the message c.Publish(pubmsg, onCompleteFunc) // Disconnects from the server jklog.L().Infoln("disconnected.") for { time.Sleep(5000 * time.Millisecond) // c.Publish(pubmsg, onCompleteFunc) } c.Disconnect() }
func startFanPublisher(t testing.TB, cid int, wg *sync.WaitGroup) { now := time.Now() runClientTest(t, cid, wg, func(svc *service.Client) { select { case <-done: case <-time.After(time.Second * time.Duration(subscribers)): glog.Infof("(surgemq%d) Timed out waiting for subscribe response", cid) return } cnt := messages sent := 0 payload := make([]byte, size) msg := message.NewPublishMessage() msg.SetTopic(topic) msg.SetQoS(qos) for i := 0; i < cnt; i++ { binary.BigEndian.PutUint32(payload, uint32(cid*cnt+i)) msg.SetPayload(payload) err := svc.Publish(msg, nil) if err != nil { break } sent++ } since := time.Since(now).Nanoseconds() statMu.Lock() totalSent += int64(sent) totalSentTime += int64(since) if since > sentSince { sentSince = since } statMu.Unlock() glog.Debugf("(surgemq%d) Sent %d messages in %d ns, %d ns/msg, %d msgs/sec", cid, sent, since, int(float64(since)/float64(cnt)), int(float64(sent)/(float64(since)/float64(time.Second)))) select { case <-done2: case <-time.Tick(time.Second * time.Duration(nap*publishers)): glog.Errorf("Timed out waiting for messages to be received.") } }) }
func pinger() { p = &netx.Pinger{} if err := p.AddIPs(serverIPs); err != nil { log.Fatal(err) } cnt := 0 tick := time.NewTicker(time.Duration(pingInterval) * time.Second) for { if cnt != 0 { <-tick.C } res, err := p.Start() if err != nil { log.Fatal(err) } for pr := range res { if !serverQuiet { log.Println(pr) } // Creates a new PUBLISH message with the appropriate contents for publishing pubmsg := message.NewPublishMessage() if pr.Err != nil { pubmsg.SetTopic([]byte(fmt.Sprintf("/ping/failure/%s", pr.Src))) } else { pubmsg.SetTopic([]byte(fmt.Sprintf("/ping/success/%s", pr.Src))) } pubmsg.SetQoS(0) b, err := pr.GobEncode() if err != nil { log.Printf("pinger: Error from GobEncode: %v\n", err) continue } pubmsg.SetPayload(b) // Publishes to the server s.Publish(pubmsg, nil) } p.Stop() cnt++ } }
func (this *rnode) rinsert(topic []byte, msg *message.PublishMessage) error { // If there's no more topic levels, that means we are at the matching rnode. if len(topic) == 0 { l := msg.Len() // Let's reuse the buffer if there's enough space if l > cap(this.buf) { this.buf = make([]byte, l) } else { this.buf = this.buf[0:l] } if _, err := msg.Encode(this.buf); err != nil { return err } // Reuse the message if possible if this.msg == nil { this.msg = message.NewPublishMessage() } if _, err := this.msg.Decode(this.buf); err != nil { return err } return nil } // Not the last level, so let's find or create the next level snode, and // recursively call it's insert(). // ntl = next topic level ntl, rem, err := nextTopicLevel(topic) if err != nil { return err } level := string(ntl) // Add snode if it doesn't already exist n, ok := this.rnodes[level] if !ok { n = newRNode() this.rnodes[level] = n } return n.rinsert(rem, msg) }
func (this *Session) RetainMessage(msg *message.PublishMessage) error { this.mu.Lock() defer this.mu.Unlock() this.rbuf = make([]byte, msg.Len()) this.Retained = message.NewPublishMessage() if _, err := msg.Encode(this.rbuf); err != nil { return err } if _, err := this.Retained.Decode(this.rbuf); err != nil { return err } return nil }
func init() { p = &sync.Pool{ New: func() interface{} { return make([]interface{}, 1, 1) }, } MessagePool = &sync.Pool{ New: func() interface{} { tmp_msg := message.NewPublishMessage() tmp_msg.SetQoS(message.QosAtLeastOnce) return tmp_msg }, } }
func (this *Session) Init(msg *message.ConnectMessage) error { this.mu.Lock() defer this.mu.Unlock() if this.initted { return fmt.Errorf("Session already initialized") } this.cbuf = make([]byte, msg.Len()) this.Cmsg = message.NewConnectMessage() if _, err := msg.Encode(this.cbuf); err != nil { return err } if _, err := this.Cmsg.Decode(this.cbuf); err != nil { return err } if this.Cmsg.WillFlag() { this.Will = message.NewPublishMessage() this.Will.SetQoS(this.Cmsg.WillQos()) this.Will.SetTopic(this.Cmsg.WillTopic()) this.Will.SetPayload(this.Cmsg.WillMessage()) this.Will.SetRetain(this.Cmsg.WillRetain()) } this.topics = make(map[string]byte, 1) this.id = string(msg.ClientId()) this.Pub1ack = newAckqueue(defaultQueueSize) this.Pub2in = newAckqueue(defaultQueueSize) this.Pub2out = newAckqueue(defaultQueueSize) this.Suback = newAckqueue(defaultQueueSize) this.Unsuback = newAckqueue(defaultQueueSize) this.Pingack = newAckqueue(defaultQueueSize) this.initted = true return nil }
func ExampleClient() { // Instantiates a new Client c := &Client{} // Creates a new MQTT CONNECT message and sets the proper parameters msg := message.NewConnectMessage() msg.SetWillQos(1) msg.SetVersion(4) msg.SetCleanSession(true) msg.SetClientId([]byte("surgemq")) msg.SetKeepAlive(10) msg.SetWillTopic([]byte("will")) msg.SetWillMessage([]byte("send me home")) msg.SetUsername([]byte("surgemq")) msg.SetPassword([]byte("verysecret")) // Connects to the remote server at 127.0.0.1 port 1883 c.Connect("tcp://127.0.0.1:1883", msg) // Creates a new SUBSCRIBE message to subscribe to topic "abc" submsg := message.NewSubscribeMessage() submsg.AddTopic([]byte("abc"), 0) // Subscribes to the topic by sending the message. The first nil in the function // call is a OnCompleteFunc that should handle the SUBACK message from the server. // Nil means we are ignoring the SUBACK messages. The second nil should be a // OnPublishFunc that handles any messages send to the client because of this // subscription. Nil means we are ignoring any PUBLISH messages for this topic. c.Subscribe(submsg, nil, nil) // Creates a new PUBLISH message with the appropriate contents for publishing pubmsg := message.NewPublishMessage() pubmsg.SetTopic([]byte("abc")) pubmsg.SetPayload(make([]byte, 1024)) pubmsg.SetQoS(0) // Publishes to the server by sending the message c.Publish(pubmsg, nil) // Disconnects from the server c.Disconnect() }
func TestServiceSubRetain(t *testing.T) { runClientServerTests(t, func(c *Client) { rmsg := message.NewPublishMessage() rmsg.SetRetain(true) rmsg.SetQoS(0) rmsg.SetTopic([]byte("abc")) rmsg.SetPayload([]byte("this is a test")) tmgr, _ := topics.NewManager("mem") err := tmgr.Retain(rmsg) require.NoError(t, err) done := make(chan struct{}) sub := newSubscribeMessage(1) c.Subscribe(sub, func(msg, ack message.Message, err error) error { unsub := newUnsubscribeMessage() return c.Unsubscribe(unsub, func(msg, ack message.Message, err error) error { close(done) return nil }) }, func(msg *message.PublishMessage) error { require.Equal(t, msg.Topic(), []byte("abc")) require.Equal(t, msg.Payload(), []byte("this is a test")) return nil }) select { case <-done: case <-time.After(time.Millisecond * 100): require.FailNow(t, "Timed out waiting for subscribe response") } }) }
func startMeshClient(t testing.TB, cid int, wg *sync.WaitGroup) { runClientTest(t, cid, wg, func(svc *service.Client) { done2 := make(chan struct{}) cnt := messages expected := publishers * cnt received := 0 sent := 0 now := time.Now() since := time.Since(now).Nanoseconds() sub := newSubscribeMessage("test", 0) svc.Subscribe(sub, func(msg, ack message.Message, err error) error { subs := atomic.AddInt64(&subdone, 1) if subs == int64(publishers) { close(done) } return nil }, func(msg *message.PublishMessage) error { if received == 0 { now = time.Now() } received++ //glog.Debugf("(surgemq%d) messages received=%d", cid, received) since = time.Since(now).Nanoseconds() if received == expected { close(done2) } return nil }) select { case <-done: case <-time.After(time.Second * time.Duration(publishers)): glog.Infof("(surgemq%d) Timed out waiting for subscribe response", cid) return } payload := make([]byte, size) msg := message.NewPublishMessage() msg.SetTopic(topic) msg.SetQoS(qos) go func() { now := time.Now() for i := 0; i < cnt; i++ { binary.BigEndian.PutUint32(payload, uint32(cid*cnt+i)) msg.SetPayload(payload) err := svc.Publish(msg, nil) if err != nil { break } sent++ } since := time.Since(now).Nanoseconds() statMu.Lock() totalSent += int64(sent) totalSentTime += int64(since) if since > sentSince { sentSince = since } statMu.Unlock() glog.Debugf("(surgemq%d) Sent %d messages in %d ns, %d ns/msg, %d msgs/sec", cid, sent, since, int(float64(since)/float64(cnt)), int(float64(sent)/(float64(since)/float64(time.Second)))) }() select { case <-done2: case <-time.Tick(time.Second * time.Duration(nap*publishers)): glog.Errorf("Timed out waiting for messages to be received.") } statMu.Lock() totalRcvd += int64(received) totalRcvdTime += int64(since) if since > rcvdSince { rcvdSince = since } statMu.Unlock() glog.Debugf("(surgemq%d) Received %d messages in %d ns, %d ns/msg, %d msgs/sec", cid, received, since, int(float64(since)/float64(cnt)), int(float64(received)/(float64(since)/float64(time.Second)))) }) }