Paho GO Client | |
語言 | GO |
協議 | EPL AND EDL |
官網地址 | http://www.eclipse.org/paho/ |
API類型 | Asynchronous |
回到2013年10月,我轉到了關於其餘Paho MQTT客戶端庫的編寫,並選擇了做爲一種新的語言去學習GO,還有什麼比寫一個MQTT客戶端更好的方法去學習?該項目始於兩個同事,病在2014年1月提交,而且做爲開源項目持續更新的如今。git
Paho GO 庫還包含一個能夠做爲獨立讀寫MQTT的包。golang
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列表下使用該庫:eclipse
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結構體上操做的方法們返回一個可更改的結構體指針,這使你能夠將方法連在一塊。tcp
參考了Paho Java 庫,Paho Go 庫容許你在完成操做時很容易的接受一個token,該token能夠被用來指示操做是否完成。token.Wait()是個阻塞函數,只有在操做完成時才返回。token.WaitTimeout()會在操做完成後等待幾毫秒後返回。函數
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:該協議提供了檢測方式,利用KeepAlive機制在客戶端異常斷開時發現問題。所以當客戶端電量耗盡、崩潰或者網絡斷開時,消息代理會採起相應措施。spa
客戶端會向任意點的消息代理髮送「臨終遺囑」(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()使用一個參數,該參數爲線程中結束任何工做的毫秒數。
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文件夾中有此示例代碼。