Paho GO Client | |
語言 | GO |
協議 | EPL AND EDL |
官網地址 | http://www.eclipse.org/paho/ |
API類型 | Asynchronous |
描述
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庫並運行;
1
|
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
連接
1
2
3
4
5
6
|
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
1
2
3
4
5
6
7
|
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 信息,讓其它客戶端知道該節點已經意外離線。
1
2
3
4
5
6
7
|
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的是否保持連接布爾值。
使用用戶名/密碼連接
1
2
3
4
5
6
7
8
|
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())
}
|
發布
1
2
3
4
5
|
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進行消息發布。
發布保留連接信息
1
|
c.Publish(
"test/topic"
, 1, true,
"Example Payload"
)
|
訂閱
1
2
3
4
5
6
7
|
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()中設置。
取消訂閱
1
2
3
4
5
|
c.Unsubscribe(
"example/topic"
)
if
token := c.Unsubscribe(
"example/topic"
); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
}
|
Unsubscribe()可以接受多於一個的取消訂閱的topic的參數,每個topic使用單獨的字符串型數組參數分開。
斷開連接
1
|
c.Disconnect(250)
|
Disconnect()使用一個參數,該參數為線程中結束任何工作的毫秒數。
使用SSL/TLS
1
2
3
4
5
6
|
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文件夾中有此示例代碼。