本文介紹如何使用C#語言的Paho MQTT類庫接入阿里雲物聯網平台,並進行物模型資料通訊。
前提條件
已在物聯網平台中,建立了產品和裝置,並在產品的功能定義頁簽下,定義一個LightSwitch屬性。
背景資訊
Paho提供的MQTT C#開原始碼中,已包含Visual Studio解決方案工程。工程中的每個專案針對不同的.NET平台,可產生對應的類庫。
本樣本中,在工程中建立一個控制台應用專案, 調用Paho的MQTT類庫串連阿里雲物聯網平台。
準備開發環境
本樣本使用的作業系統和開發工具:
作業系統:Windows10
整合式開發環境:Visual Studio 2019
安裝開發環境:
下載Visual Studio 2019社區版,並解壓縮。
開啟Visual Studio Installer,選擇.NET案頭開發,單擊安裝。
下載Paho用戶端
下載Paho MQTT for C#原始碼,其中包含Visual Studio解決方案工程檔案M2Mqtt.sln。您可使用該工程檔案開發自己的裝置端,具體操作,請參見下文的接入物聯網平台。
您也可訪問Eclipse Paho,查看Paho原始碼的更多使用說明。
編寫本樣本Demo時,使用master分支,commit id為b2e64bc4485721a0bd5ae805d9f4917e8d040e81
。
接入物聯網平台
下載MqttSign.cs,擷取阿里雲提供的計算MQTT串連參數所需的源碼。
MqttSign.cs檔案中,定義了
MqttSign
類,類說明如下:原型:
class MqttSign
功能:
用於計算裝置接入物聯網平台的MQTT串連參數username、password和clientid。
成員:
類型定義
方法描述
public bool
calculate(String productKey, String deviceName, String deviceSecret)
根據裝置的productKey、deviceName和deviceSecret計算出MQTT串連參數username、password和clientid。
public String
getUsername()
用於擷取MQTT建連參數username。
public String
getPassword()
用於擷取MQTT建連參數password。
public String
getClientid()
用於擷取MQTT建連參數clientid。
開啟Visual Studio,匯入Paho原始碼中的Visual Studio解決方案檔案M2Mqtt.sln,並建立一個應用專案。
將步驟1中下載的MqttSign.cs檔案匯入到應用專案中。
在應用專案中,添加實現裝置接入物聯網平台的程式檔案。
您需編寫程式調用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()); }
關於裝置、伺服器和物聯網平台的通訊方式介紹,請參見物聯網平台通訊方式概述。
編譯專案。
樣本Demo
使用Demo代碼程式接入物聯網平台。
下載Demo程式碼封裝,然後解壓到檔案夾aiot-csharp-demo。
檔案夾aiot-csharp-demo\paho.mqtt.m2mqtt-master\aiot-csharp-demo中,包含了裝置接入物聯網平台,並上報物模型屬性的完整程式。
檔案
說明
MqttSign.cs
阿里雲提供的MQTT建連參數產生原始碼。Program.cs運行時,會調用該檔案中定義的MqttSign()函數,計算出串連參數username、password和clientId。
Program.cs
該檔案包含裝置與物聯網平台串連,並上報屬性資料的邏輯代碼。
開啟Visual Studio 2019社區版 , 選擇開啟專案或解決方案,開啟aiot-csharp-demo\paho.mqtt.m2mqtt-master\M2Mqtt.sln檔案。
Visual Studio中即可匯入aiot-csharp-demo專案檔。
在Program.cs中,修改裝置資訊為您的裝置資訊。
替換以下代碼中productKey、deviceName和deviceSecret的值為您的裝置認證資訊。
String productKey = "${ProductKey}"; String deviceName = "${DeviceName}"; String deviceSecret = "${DeviceSecret}";
修改代碼
String broker = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com";
中的接入網域名稱。詳細說明,請參見上文“接入物聯網平台”中的步驟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 ...
登入物聯網平台控制台,可查看裝置狀態和日誌。
錯誤碼
如果裝置通過MQTT協議接入物聯網平台失敗,請根據錯誤碼排查問題。服務端錯誤碼說明,請參見錯誤排查。