项目作者: ysugimoto

项目描述 :
MQTT5 implementation by golang
高级语言: Go
项目地址: git://github.com/ysugimoto/gqtt.git
创建时间: 2018-07-11T09:58:03Z
项目社区:https://github.com/ysugimoto/gqtt

开源协议:MIT License

下载


gqtt

MQTT5 broker/client implementation by golang.

See OASIS’s spec: http://docs.oasis-open.org/mqtt/mqtt/v5.0/cs02/mqtt-v5.0-cs02.html

Requirement

  • Go1.12 or later

Installation

This packages uses go mod, so you need to enable it as export GO111MODULE=on in your environment.

Usage

To debug message passing, set export DEBUG=1 before start processes.

Broker

Simple broker with accept hook message example:

  1. package main
  2. import (
  3. "context"
  4. "github.com/ysugimoto/gqtt"
  5. "github.com/ysugimoto/gqtt/message"
  6. )
  7. func main() {
  8. server := gqtt.NewBroker(":9999")
  9. ctx := context.Background()
  10. // Start server inside goroutine
  11. go server.ListenAndServe(ctx)
  12. // Hooks of messages
  13. for evt := range server.MessageEvent {
  14. switch e := evt.(type) {
  15. // Client subscribed
  16. case *message.Subscribe:
  17. log.Println("Received SUBSCRIBE event: ", e.GetType())
  18. // Client connected
  19. case *message.Connect:
  20. log.Println("Received CONNECT event", e.GetType())
  21. // Client published message
  22. case *message.Publish:
  23. log.Println("Received PUBLISH event", e.GetType())
  24. }
  25. }
  26. <-ctx.Done()
  27. }

Client

Simple connect (with authentication) -> subscribe -> publish example.
The auth challenge during connect phase is new of MQTT5 spec.

  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "time"
  6. "context"
  7. "github.com/ysugimoto/gqtt"
  8. "github.com/ysugimoto/gqtt/message"
  9. )
  10. func main() {
  11. client := gqtt.NewClient("mqtt://localhost:9999")
  12. defer client.Disconnect()
  13. ctx := context.Background()
  14. // Connect with authenticate
  15. auth := gqtt.WithLoginAuth("admin", "admin")
  16. if err := client.Connect(ctx, auth); err != nil {
  17. log.Fatal(err)
  18. }
  19. // Subscribe topic
  20. if err := client.Subscribe("gqtt/example", message.QoS2); err != nil {
  21. log.Fatal(err)
  22. }
  23. ticker := time.NewTicker(3 * time.Second)
  24. for {
  25. select {
  26. case <-client.Closed:
  27. log.Println("connection closed")
  28. return
  29. case <-ctx.Done():
  30. log.Println("context canceled")
  31. return
  32. case msg := <-client.Message:
  33. log.Printf("published message received: %s\n", string(msg.Body))
  34. case <-ticker.C:
  35. log.Printf("message publish")
  36. if err := client.Publish("gqtt/example", []byte("Hello, MQTT5!"), gqtt.WithQoS(message.QoS2)); err != nil {
  37. return
  38. }
  39. }
  40. }
  41. }

See more examples in detail.

Features

This package now implements partial features. See following checks:

  • QoS0 message
  • QoS1 message (but not persistent storage, only store on memory)
  • QoS2 message (but not persistent storage, only store on memory)
  • Retain message (but not persistent storage, only store on memory)
  • Will message
  • Wildcard topics
  • User Property
  • MQTT over WebSocket
  • Connect redirection
  • Request/Response feature
  • Auth challenge (now experimental. Only basic/login auth with admin/admin)
  • Distirbuted brokers

LICENSE

MIT

Author

Yoshiaki Sugimoto

This package is still under development. PR is welcome :-)