本文介紹如何調用Go語言的Paho MQTT類庫,將裝置接入阿里雲物聯網平台,並進行訊息收發。
使用前必讀
本文操作步驟以普通使用者權限為例。如果您在操作過程中涉及到管理員權限才能執行的操作,可嘗試使用sudo
命令執行。
前提條件
已在物聯網平台控制台,對應執行個體下,建立產品和裝置,並擷取MQTT接入網域名稱和裝置認證資訊(ProductKey、DeviceName和DeviceSecret)。具體操作,請參見:
準備開發環境
安裝Go語言套件。
蘋果電腦安裝命令:
brew install go
Ubuntu電腦安裝命令:
sudo apt-get install golang-go
Windows電腦請從Golang官網下載安裝包安裝。
說明在中國內地境內,Golang官網需在VPN環境下訪問。
下載Go語言Paho MQTT庫
請訪問Eclipse Paho Downloads瞭解Paho專案和支援的開發語言詳情。
使用以下命令下載Go語言版本的Paho MQTT庫和相關依賴的庫:
go get github.com/eclipse/paho.mqtt.golang
go get github.com/gorilla/websocket
go get golang.org/x/net/proxy
接入物聯網平台
下載MqttSign.go,複擷取阿里雲提供的計算MQTT串連參數所需的源碼檔案MqttSign.go。
MqttSign.go檔案定義了用於計算裝置接入物聯網平台的MQTT串連參數的函數,您開發的裝置端接入物聯網平台程式需調用該函數,函數說明如下:
原型:
type AuthInfo struct { password, username, mqttClientId string; } func calculate_sign(clientId, productKey, deviceName, deviceSecret, timeStamp string) AuthInfo;
功能:
用於計算裝置接入物聯網平台的MQTT串連參數username、password和mqttClientId。
輸入參數:
參數
類型
說明
productKey
String
裝置所屬產品的ProductKey,該裝置在物聯網平台上的身份認證資訊之一。
deviceName
String
裝置名稱,該裝置在物聯網平台上的身份認證資訊之一。
deviceSecret
String
裝置密鑰,該裝置在物聯網平台上的身份認證資訊之一。
clientId
String
裝置端ID。可以設定為64字元以內的字串。建議設定為實際裝置的SN碼或MAC地址。
timeStamp
String
目前時間的毫秒值時間戳記。
輸出參數:
該函數的傳回值為
AuthInfo
結構體,包含以下參數:參數
類型
說明
username
String
MQTT串連所需的使用者名稱。
password
String
MQTT串連所需的密碼。
mqttClientId
String
MQTT用戶端ID。
添加實現裝置接入物聯網平台的程式檔案。
您需編寫程式調用MqttSign.go計算MQTT串連參數,實現接入物聯網平台和通訊。
開發說明和程式碼範例如下:
設定裝置資訊。
// set the device info, include product key, device name, and device secret var productKey string = "a1Zd7n5***" var deviceName string = "testdevice" var deviceSecret string = "UrwclDV33NaFSmk0JaBxNTqgSrJW****" // set timestamp, clientid, subscribe topic and publish topic var timeStamp string = "1528018257135" var clientId string = "192.168.****" var subTopic string = "/" + productKey + "/" + deviceName + "/user/get"; var pubTopic string = "/" + productKey + "/" + deviceName + "/user/update";
設定MQTT串連資訊。
調用MqttSign.go中定義的calculate_sign函數,根據傳入的參數clientId、 productKey、deviceName、deviceSecret和timeStamp計算出username、password和mqttClientId,並將這些資訊都包含在opts中。
// set the login broker url var raw_broker bytes.Buffer raw_broker.WriteString("tls://") raw_broker.WriteString(productKey) raw_broker.WriteString(".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883") opts := MQTT.NewClientOptions().AddBroker(raw_broker.String()); // calculate the login auth info, and set it into the connection options auth := calculate_sign(clientId, productKey, deviceName, deviceSecret, timeStamp) opts.SetClientID(auth.mqttClientId) opts.SetUsername(auth.username) opts.SetPassword(auth.password) opts.SetKeepAlive(60 * 2 * time.Second) opts.SetDefaultPublishHandler(f)
重要對於舊版公用執行個體,代碼
raw_broker.WriteString(".iot-as-mqtt.cn-shanghai.aliyuncs.com:1883")
中的地區代碼(cn-shanghai),需設定為您的物聯網平台裝置所在地區代碼。地區代碼錶達方法,請參見地區列表。對於新版公用執行個體和企業版執行個體,代碼
opts := MQTT.NewClientOptions().AddBroker(raw_broker.String());
中的raw_broker.String()
需設定為${MQTT接入地址}:1833
。例如,opts := MQTT.NewClientOptions().AddBroker("iot-***.mqtt.iothub.aliyuncs.com:1883");
擷取MQTT接入地址的具體操作,請參見查看新版公用執行個體和企業版執行個體終端節點資訊。
執行個體的詳細說明,請參見執行個體概述。
調用MQTT的Connect()函數接入物聯網平台。
// create and start a client using the above ClientOptions c := MQTT.NewClient(opts) if token := c.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) } fmt.Print("Connect aliyun IoT Cloud Success\n");
調用Publish介面發布訊息。需指定發布訊息的目標Topic和訊息payload。
// publish 5 messages to pubTopic("/a1Zd7n5****/deng/user/update") for i := 0; i < 5; i++ { fmt.Println("publish msg:", i) text := fmt.Sprintf("ABC #%d", i) token := c.Publish(pubTopic, 0, false, text) fmt.Println("publish msg: ", text) token.Wait() time.Sleep(2 * time.Second) }
通訊Topic介紹,請參見什麼是Topic。
調用Subscribe介面訂閱Topic,接收雲端下發的訊息。
// subscribe to subTopic("/a1Zd7n5***/deng/user/get") and request messages to be delivered if token := c.Subscribe(subTopic, 0, nil); token.Wait() && token.Error() != nil { fmt.Println(token.Error()) os.Exit(1) } fmt.Print("Subscribe topic " + subTopic + " success\n");
關於裝置、伺服器和物聯網平台的通訊方式介紹,請參見物聯網平台通訊方式概述。
編譯專案。
範例程式碼
使用Demo代碼程式接入物聯網平台。
下載範例程式碼包,並提取檔案。
aiot-go-demo中包含以下檔案:
檔案
說明
MqttSign.go
該檔案包含以MQTT方式接入物聯網平台的串連參數計算代碼。iot.go運行時,會調用該檔案中定義的calculate_sign函數,計算出串連參數username、password和mqttClientId。
iot.go
該檔案包含裝置與物聯網平台串連和通訊的邏輯代碼。
x509
物聯網平台的根憑證,是裝置接入物聯網平台的必須認證。
說明裝置通過MQTT協議雲網關接入物聯網平台時,裝置身份可以由自訂認證認證。具體步驟,請參見步驟一:產生自訂認證。
在iot.go中,修改裝置資訊為您的裝置資訊。
可使用Linux vi等工具修改iot.go檔案:
將productKey、deviceName和deviceSecret替換為您的裝置認證資訊。
(可選)替換timeStamp和clientId。clientId的值可以替換為您的實際裝置的SN碼和MAC地址。
這兩個參數值不替換也能接入物聯網平台,但實際使用時,建議您替換為實際資訊。
修改裝置接入物聯網平台的MQTT串連資訊。詳細說明,請參見上文接入物聯網平台的步驟2。
在命令列裡使用以下命令運行iot.go:
go run iot.go MqttSign.go
運行成功,接入物聯網平台的本地日誌如下:
clientId192.168.****deviceNametestdeviceproductKeya1Zd7n5****timestamp1528018257135 1b865320fc183cc747041c9faffc9055fc45**** Connect aliyun IoT Cloud Sucess Subscribe topic /a1Zd7n5****/testdevice/user/get success publish msg: 0 publish msg: ABC #0 publish msg: 1 publish msg: ABC #1 publish msg: 2 publish msg: ABC #2 publish msg: 3 publish msg: ABC #3 publish msg: 4 publish msg: ABC #4 publish msg: 5 publish msg: ABC #5
登入物聯網平台控制台,可查看裝置狀態和日誌。
錯誤碼
如果裝置通過MQTT協議接入物聯網平台失敗,請根據錯誤碼排查問題。服務端錯誤碼說明,請參見錯誤排查。