為了加深理解,本文是翻譯文章。原文地址
Paho GO Client | |
語言 | GO |
協議 | EPL AND EDL |
官網地址 | http://www.eclipse.org/paho/ |
API類型 | Asynchronous |
描述
回到2013年10月,我轉到了關於其他Paho MQTT客戶端庫的編寫,並選擇了作為一種新的語言去學習GO,還有什么比寫一個MQTT客戶端更好的方法去學習?該項目始於兩個同事,病在2014年1月提交,並且作為開源項目持續更新的現在。
Paho GO 庫還包含一個可以作為獨立讀寫MQTT的包。
PAho Go 庫目前是0.9版本,即將釋放1.0的穩定版本,由於被商業和開源項目采用(例如Gobot ),該項目被積極的維護。
特性
MQTT3.1 | ![]() |
Qos 0 | ![]() |
|
MQTT3.1.1 | ![]() |
Qos 1 | ![]() |
|
LWT | ![]() |
Q0s 2 | ![]() |
|
SSL/TLS | ![]() |
Authentication | ![]() |
|
Automatic Reconnect | ![]() |
Throttling | ![]() |
使用
安裝
假設你有一個Go的開發環境,你有一個很簡單的方法獲取Paho Go庫並運行;
go get git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.golang.git
如下會將庫下載到你的$GOPATH/src 目錄下,你就可以在你的項目下添加到你的Import列表下使用該庫:
git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.golang.git
連接
opts := mqtt.NewClientOptions().AddBroker("tcp://broker.hivemq.com:1883").SetClientID("sample") c := mqtt.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) }
為了連接到MQTT代理,你必須提供兩個必要的參數:代理的URL和使用的客戶端ID。為此,我們創建了一個新的ClientOptions結構體實例,該結構體包含代理的Url和客戶端ID。在ClientOptions結構體上操作的方法們返回一個可更改的結構體指針,這使你可以將方法連在一塊。
參考了Paho Java 庫,Paho Go 庫允許你在完成操作時很容易的接受一個token,該token可以被用來指示操作是否完成。token.Wait()是個阻塞函數,只有在操作完成時才返回。token.WaitTimeout()會在操作完成后等待幾毫秒后返回。
連接到MQTT3.1或MQTT3.1.1
opts := mqtt.NewClientOptions().AddBroker("tcp://broker.hivemq.com:1883").SetClientID("sample") opts.SetProtocolVersion(4) c := mqtt.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) }
Paho Go 庫默認使用MQTT3.1.1協議連接代理,如果失敗他會自動回調並使用MQTT3.1協議連接。SetProtocolVersion()方法允許你明確的設置連接協議,4是3.1.1,3是3.1。如果顯示設置,那么回調機制是禁用的。
使用LWT(臨終遺囑)連接
LWT:該協議提供了檢測方式,利用KeepAlive機制在客戶端異常斷開時發現問題。因此當客戶端電量耗盡、崩潰或者網絡斷開時,消息代理會采取相應措施。
客戶端會向任意點的消息代理發送“臨終遺囑”(LWT)信息,當消息代理檢測到客戶端離線(連接並未關閉),就會發送保存在特定主題上的 LWT 信息,讓其它客戶端知道該節點已經意外離線。
opts := mqtt.NewClientOptions().AddBroker("tcp://broker.hivemq.com:1883").SetClientID("sample") opts.SetWill("my/will/topic", "Goodbye", 1, true) c := mqtt.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) }
Paho Go庫有兩個方法設置LWT。SetWill()和SetBinaryWill(),這兩個方法都有四個參數。兩個方法中的第一個參數都是字符串型的LWT訂閱。第二個參數是消息體(payload),在SetWill()中是一個字符創型,在SetBinaryWill()中是byte數組。第三個參數是消息的qos類型,第四個參數是LWT的是否保持連接布爾值。
使用用戶名/密碼連接
opts := mqtt.NewClientOptions().AddBroker("tcp://broker.hivemq.com:1883").SetClientID("sample") opts.SetUsername("username") opts.SetPassword("password") c := mqtt.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) }
發布
c.Publish("test/topic", 1, false, "Example Payload") if token := c.Publish("test/topic", 1, false, "Example Payload"); token.Wait() && token.Error() != nil { fmt.Println(token.Error()) }
上述中,c是mqtt.NewClient()返回的mqtt.Client。發布 使用4個參數;發布消息的字符串型的topic,消息的qos質量,是否保持消息連接的bool,或者既可以是字符串形式也可以是byte數組的消息體(payload)。並且我示范了如何使用和不適用token進行消息發布。
發布保留連接信息
c.Publish("test/topic", 1, true, "Example Payload")
訂閱
var msgRcvd := func(client *mqtt.Client, message mqtt.Message) { fmt.Printf("Received message on topic: %s\nMessage: %s\n", message.Topic(), message.Payload()) } if token := c.Subscribe("example/topic", 0, msgRcvd); token.Wait() && token.Error() != nil { fmt.Println(token.Error()) }
Subscribe()使用3個參數,一個訂閱的字符串形式的topic,訂閱的qos質量和一個在接受到匹配訂閱消息時的函數回調。回調函數必須有一個func(*mqtt.Client,mqtt.Message)的結構。當回調函數為空(nil)的時候,在庫接受到消息后會調用客戶端的默認消息處理程序(如果設置)。可以在結構體ClientOptions的SetDefaultPublishHandler()中設置。
取消訂閱
c.Unsubscribe("example/topic") if token := c.Unsubscribe("example/topic"); token.Wait() && token.Error() != nil { fmt.Println(token.Error()) }
Unsubscribe()可以接受多余一個的取消訂閱的topic的參數,每個topic使用單獨的字符串型數組參數分開。
斷開連接
c.Disconnect(250)
Disconnect()使用一個參數,該參數為線程中結束任何工作的毫秒數。
使用SSL/TLS
opts := mqtt.NewClientOptions().AddBroker("ssl://iot.eclipse.org:8883").SetClientID("sample") c := mqtt.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) }
你可以非常簡單的通過改變代理URL來連接到具有SSL/TLS的代理;ssl,tls或者tcps都被client支持並且安全的連接。此處假設你連接的是使用系統已知證書的代理。如果你使用自我簽名的證書你需要使用 TLS。使用ClientOptions的SetTlSConfig()配置。Paho Go庫的Sample文件夾中有此示例代碼。