本文介绍如何使用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协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见错误排查。