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