全部產品
Search
文件中心

IoT Platform:Paho-MQTT Go接入樣本

更新時間:Jun 30, 2024

本文介紹如何調用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

接入物聯網平台

  1. 下載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串連參數usernamepasswordmqttClientId

    • 輸入參數:

      參數

      類型

      說明

      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。

  2. 添加實現裝置接入物聯網平台的程式檔案。

    您需編寫程式調用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 productKeydeviceNamedeviceSecrettimeStamp計算出usernamepasswordmqttClientId,並將這些資訊都包含在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");
                                      

    關於裝置、伺服器和物聯網平台的通訊方式介紹,請參見物聯網平台通訊方式概述

  3. 編譯專案。

範例程式碼

使用Demo代碼程式接入物聯網平台。

  1. 下載範例程式碼包,並提取檔案。

    aiot-go-demo中包含以下檔案:

    檔案

    說明

    MqttSign.go

    該檔案包含以MQTT方式接入物聯網平台的串連參數計算代碼。iot.go運行時,會調用該檔案中定義的calculate_sign函數,計算出串連參數usernamepasswordmqttClientId

    iot.go

    該檔案包含裝置與物聯網平台串連和通訊的邏輯代碼。

    x509

    物聯網平台的根憑證,是裝置接入物聯網平台的必須認證。

    說明

    裝置通過MQTT協議雲網關接入物聯網平台時,裝置身份可以由自訂認證認證。具體步驟,請參見步驟一:產生自訂認證

  2. iot.go中,修改裝置資訊為您的裝置資訊。

    可使用Linux vi等工具修改iot.go檔案:

    • productKeydeviceNamedeviceSecret替換為您的裝置認證資訊。

    • (可選)替換timeStampclientIdclientId的值可以替換為您的實際裝置的SN碼和MAC地址。

      這兩個參數值不替換也能接入物聯網平台,但實際使用時,建議您替換為實際資訊。

    • 修改裝置接入物聯網平台的MQTT串連資訊。詳細說明,請參見上文接入物聯網平台的步驟2。

  3. 在命令列裡使用以下命令運行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

    登入物聯網平台控制台,可查看裝置狀態和日誌。

    • 選擇裝置管理 > 裝置,可看到該裝置的狀態顯示為線上
    • 選擇監控營運 > Log Service,可查看雲端作業記錄裝置本地日誌日誌。詳細內容,請參見雲端作業記錄裝置本地日誌

錯誤碼

如果裝置通過MQTT協議接入物聯網平台失敗,請根據錯誤碼排查問題。服務端錯誤碼說明,請參見錯誤排查