全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
消息队列 MQ

C# 接入示例

更新时间:2018-01-23 21:00:41

本文主要介绍如何使用 C# 客户端收发 MQTT 消息,并给出示例代码供前期开发测试参考。

注意:

本文给出的示例均基于 Eclipse Paho C# SDK 实现,SDK 下载请参见 MQTT 接入准备。如使用其他第三方的客户端,请适当修改。

1. 资源创建

使用 MQ 提供的 MQTT 服务,首先需要核实应用中使用的 Topic 资源是否已经创建。如果没有,请先去控制台创建 Topic,Group ID 等资源。

创建资源时需要根据需求选择对应的 Region,例如 MQTT 需要使用华北2的接入点,那么 Topic 等资源就在华北2 创建。资源创建具体请参见创建资源

注意: MQTT 使用的多级子 Topic 不需要创建,代码里直接使用即可,没有限制。

2. 环境准备

本示例使用 C# 语言编写, C# 客户端依赖的添加可以自行搜索。可以直接使用 NuGet 包管理器安装,或者自行根据源码编译,具体源码编译请参考 paho 官方文档。本文档介绍直接使用包管理器安装项目依赖。

Install-Package M2Mqtt -Version 4.3.0

3. MQTT 收发消息

本段示例代码演示如何使用 MQTT C# 客户端发送和接收消息。需要注意此文档仅仅给出建立连接,收发消息并关闭连接的一个简单过程。实际应用集成应处理客户端断线重连等情况,尽可能保证客户端连接稳定,不要频繁创建客户端重新连接。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;

namespace MQTTDemo
{
    class MQTTDoNetDemo
    {
        static void Main(string[] args)
        {
            //此处填写购买得到的 MQTT 接入点域名
            String brokerUrl = "XXX.mqtt.aliyuncs.com";
            //此处填写阿里云帐号 AccessKey
            String accessKey = "XXXXXX";
            //此处填写阿里云帐号 SecretKey
            String secretKey = "XXXXXX";
            //此处填写在 MQ 控制台创建的 Topic,作为 MQTT 的一级 Topic
            String parentTopic = "XXXXX";
            //此处填写客户端 ClientId,需要保证全局唯一,其中前缀部分即 GroupId 需要先在 MQ 控制台创建
            String clientId = "GID_XXXX@@@XXXX";
            MqttClient client = new MqttClient(brokerUrl);
            client.MqttMsgPublishReceived += client_recvMsg;
            client.MqttMsgPublished += client_publishSuccess;
            client.ConnectionClosed += client_connectLose;
            String userName = accessKey;
            //计算签名
            String passWord = HMACSHA1(secretKey, clientId.Split('@')[0]);
            client.Connect(clientId, userName,passWord,true,60);
            //订阅 Topic,支持多个 Topic,以及多级 Topic
            string[] subTopicArray = { parentTopic+"/subDemo1", parentTopic+"/subDemo2/level3" };
            byte[] qosLevels = { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE };
            client.Subscribe(subTopicArray, qosLevels);
            client.Publish(parentTopic + "/subDemo1", Encoding.UTF8.GetBytes("hello mqtt"),MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE,false);
            //发送 P2P 消息,二级 topic 必须是 p2p,三级 topic 是接收客户端的 clientId
            client.Publish(parentTopic + "/p2p/"+clientId, Encoding.UTF8.GetBytes("hello mqtt"), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false);
            System.Threading.Thread.Sleep(10000);
            client.Disconnect();
        }
        static void client_recvMsg(object sender, MqttMsgPublishEventArgs e)
        {
            // access data bytes throug e.Message
            Console.WriteLine("Recv Msg : Topic is "+e.Topic+" ,Body is "+Encoding.UTF8.GetString(e.Message));
        }
        static void client_publishSuccess(object sender, MqttMsgPublishedEventArgs e)
        {
            // access data bytes throug e.Message
            Console.WriteLine("Publish Msg  Success");
        }
        static void client_connectLose(object sender, EventArgs e)
        {
            // access data bytes throug e.Message
            Console.WriteLine("Connect Lost,Try Reconnect");
        }
        public static string HMACSHA1(string key, string dataToSign)
        {
            Byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(key);
            HMACSHA1 hmac = new HMACSHA1(secretBytes);
            Byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(dataToSign);
            Byte[] calcHash = hmac.ComputeHash(dataBytes);
            String calcHashString = Convert.ToBase64String(calcHash);
            return calcHashString;
        }
    }
}
本文导读目录