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月提交,並且作為開源項目持續更新的現在。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM