全部產品
Search
文件中心

IoT Platform:Paho-MQTT C#接入樣本

更新時間:Jun 30, 2024

本文介紹如何使用C#語言的Paho MQTT類庫接入阿里雲物聯網平台,並進行物模型資料通訊。

前提條件

已在物聯網平台中,建立了產品和裝置,並在產品的功能定義頁簽下,定義一個LightSwitch屬性。

請參見建立產品單個建立裝置單個添加物模型

背景資訊

Paho提供的MQTT C#開原始碼中,已包含Visual Studio解決方案工程。工程中的每個專案針對不同的.NET平台,可產生對應的類庫。

本樣本中,在工程中建立一個控制台應用專案, 調用Paho的MQTT類庫串連阿里雲物聯網平台。

準備開發環境

本樣本使用的作業系統和開發工具:

  • 作業系統:Windows10

  • 整合式開發環境:Visual Studio 2019

安裝開發環境:

  1. 下載Visual Studio 2019社區版,並解壓縮。

  2. 開啟Visual Studio Installer,選擇.NET案頭開發,單擊安裝

下載Paho用戶端

下載Paho MQTT for C#原始碼,其中包含Visual Studio解決方案工程檔案M2Mqtt.sln。您可使用該工程檔案開發自己的裝置端,具體操作,請參見下文的接入物聯網平台

您也可訪問Eclipse Paho,查看Paho原始碼的更多使用說明。

編寫本樣本Demo時,使用master分支,commit idb2e64bc4485721a0bd5ae805d9f4917e8d040e81

接入物聯網平台

  1. 下載MqttSign.cs,擷取阿里雲提供的計算MQTT串連參數所需的源碼。

    MqttSign.cs檔案中,定義了MqttSign類,類說明如下:

    • 原型:

      class MqttSign
    • 功能:

      用於計算裝置接入物聯網平台的MQTT串連參數usernamepasswordclientid

    • 成員:

      類型定義

      方法描述

      public bool

      calculate(String productKey, String deviceName, String deviceSecret)

      根據裝置的productKeydeviceNamedeviceSecret計算出MQTT串連參數usernamepasswordclientid

      public String

      getUsername()

      用於擷取MQTT建連參數username

      public String

      getPassword()

      用於擷取MQTT建連參數password

      public String

      getClientid()

      用於擷取MQTT建連參數clientid

  2. 開啟Visual Studio,匯入Paho原始碼中的Visual Studio解決方案檔案M2Mqtt.sln,並建立一個應用專案。

  3. 將步驟1中下載的MqttSign.cs檔案匯入到應用專案中。

  4. 在應用專案中,添加實現裝置接入物聯網平台的程式檔案。

    您需編寫程式調用MqttSign.cs中的MqttSign類計算MQTT串連參數,實現接入物聯網平台和通訊。

    開發說明和程式碼範例如下:

    • 計算MQTT串連參數。

      調用MqttSign.cs中的MqttSign計算MQTT串連參數。

      String productKey = "a1X2bEn****";
      String deviceName = "example1";
      String deviceSecret = "ga7XA6KdlEeiPXQPpRbAjOZXwG8y****";
      
      // 計算MQTT串連參數。
      MqttSign sign = new MqttSign();
      sign.calculate(productKey, deviceName, deviceSecret);
      
      Console.WriteLine("username: " + sign.getUsername());
      Console.WriteLine("password: " + sign.getPassword());
      Console.WriteLine("clientid: " + sign.getClientid());
    • 調用Paho MQTT用戶端串連物聯網平台。

      // 使用Paho串連阿里雲物聯網平台。
      int port = 443;
      String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com";
      
      MqttClient mqttClient = new MqttClient(broker, port, true, MqttSslProtocols.TLSv1_2, null, null);
      mqttClient.Connect(sign.getClientid(), sign.getUsername(), sign.getPassword());
      
      Console.WriteLine("Broker: " + broker + " Connected");
      說明

      修改代碼String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com";中值為對應執行個體下裝置的接入網域名稱。

      公用執行個體和企業版執行個體接入網域名稱的格式說明,請參見查看執行個體終端資訊

    • 裝置上報資料到物聯網平台。

      以下範例程式碼上報物模型屬性LightSwitch。

      // Paho MQTT訊息發布。
      String topic = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post";
      String message = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}";
      mqttClient.Publish(topic, Encoding.UTF8.GetBytes(message));

      物模型通訊資料格式,請參見裝置屬性、事件、服務

      如果您要使用自訂Topic通訊,請參見什麼是Topic

    • 訂閱Topic,接收物聯網平台下發資料。

      以下樣本中,訂閱的是上報屬性值後,物聯網平台返回應答訊息的Topic。

      // Paho MQTT訊息訂閱。
      String topicReply = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply";
      
      mqttClient.MqttMsgPublishReceived += MqttPostProperty_MqttMsgPublishReceived;
      mqttClient.Subscribe(new string[] { topicReply }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
      ...
      private static void MqttPostProperty_MqttMsgPublishReceived(object sender, uPLibrary.Networking.M2Mqtt.Messages.MqttMsgPublishEventArgs e)
      {
          Console.WriteLine("reply topic  :" + e.Topic);
          Console.WriteLine("reply payload:" + e.Message.ToString());
      }

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

  5. 編譯專案。

樣本Demo

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

  1. 下載Demo程式碼封裝,然後解壓到檔案夾aiot-csharp-demo

    檔案夾aiot-csharp-demo\paho.mqtt.m2mqtt-master\aiot-csharp-demo中,包含了裝置接入物聯網平台,並上報物模型屬性的完整程式。

    檔案

    說明

    MqttSign.cs

    阿里雲提供的MQTT建連參數產生原始碼。Program.cs運行時,會調用該檔案中定義的MqttSign()函數,計算出串連參數usernamepasswordclientId

    Program.cs

    該檔案包含裝置與物聯網平台串連,並上報屬性資料的邏輯代碼。

  2. 開啟Visual Studio 2019社區版 , 選擇開啟專案或解決方案,開啟aiot-csharp-demo\paho.mqtt.m2mqtt-master\M2Mqtt.sln檔案。

    Visual Studio中即可匯入aiot-csharp-demo專案檔。

  3. Program.cs中,修改裝置資訊為您的裝置資訊。

    • 替換以下代碼中productKeydeviceNamedeviceSecret的值為您的裝置認證資訊。

      String productKey = "${ProductKey}";
      String deviceName = "${DeviceName}";
      String deviceSecret = "${DeviceSecret}";
    • 修改代碼String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com";中的接入網域名稱。詳細說明,請參見上文“接入物聯網平台”中的步驟4。

  4. aiot-csharp-demo設為啟動專案,然後運行,將裝置接入物聯網平台。

    接入物聯網平台

    接入成功後,本地日誌中包含串連成功、資料上報成功和訂閱訊息成功的內容。

    ...
    broker: a1X2bEn****.iot-as-mqtt.cn-shanghai.aliyuncs.com Connected
    ...
    publish: {"id":"1","version":"1.0","params":{"LightSwitch":0}}
    ...
    subscribe: /sys/a1X2bEn****/example1/thing/event/property/post_reply
    ...

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

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

錯誤碼

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