Paho-MQTT C#接入示例

本文介绍如何使用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
    ...

    登录物联网平台控制台在对应实例下,可查看设备状态和日志。

    • 选择设备管理 > 设备,可看到该设备的状态显示为在线
    • 选择监控运维 > 日志服务,可查看云端运行日志设备本地日志日志。详细内容,请参见云端运行日志设备本地日志

错误码

如果设备通过MQTT协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见错误排查