MQTT客戶端庫-Paho GO

爲了加深理解,本文是翻譯文章。原文地址

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()會在操做完成後等待幾毫秒後返回。函數

鏈接到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機制在客戶端異常斷開時發現問題。所以當客戶端電量耗盡、崩潰或者網絡斷開時,消息代理會採起相應措施。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()使用一個參數,該參數爲線程中結束任何工做的毫秒數。

使用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文件夾中有此示例代碼。

相關文章
相關標籤/搜索