全部产品
阿里云办公

.NET 接入示例

更新时间:2018-10-16 19:41:12

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

注意:

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

1. 资源创建

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

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

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

2. 环境准备

.NET SDK 依赖的添加可以自行搜索。可以直接使用 NuGet 包管理器安装,或者自行根据源码编译,具体源码编译请参考 paho 官方文档。本文档介绍直接使用包管理器安装项目依赖。

  1. Install-Package M2Mqtt -Version 4.3.0

3. MQTT 收发消息

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using uPLibrary.Networking.M2Mqtt;
  9. using uPLibrary.Networking.M2Mqtt.Messages;
  10. namespace MQTTDemo
  11. {
  12. class MQTTDoNetDemo
  13. {
  14. static void Main(string[] args)
  15. {
  16. //此处填写购买得到的 MQTT 接入点域名
  17. String brokerUrl = "XXX.mqtt.aliyuncs.com";
  18. //此处填写阿里云帐号 AccessKey
  19. String accessKey = "XXXXXX";
  20. //此处填写阿里云帐号 SecretKey
  21. String secretKey = "XXXXXX";
  22. //此处填写在 MQ 控制台创建的 Topic,作为 MQTT 的一级 Topic
  23. String parentTopic = "XXXXX";
  24. //此处填写客户端 ClientId,需要保证全局唯一,其中前缀部分即 GroupId 需要先在 MQ 控制台创建
  25. String clientId = "GID_XXXX@@@XXXX";
  26. MqttClient client = new MqttClient(brokerUrl);
  27. client.MqttMsgPublishReceived += client_recvMsg;
  28. client.MqttMsgPublished += client_publishSuccess;
  29. client.ConnectionClosed += client_connectLose;
  30. String userName = accessKey;
  31. //计算签名
  32. String passWord = HMACSHA1(secretKey, clientId.Split('@')[0]);
  33. client.Connect(clientId, userName,passWord,true,60);
  34. //订阅 Topic,支持多个 Topic,以及多级 Topic
  35. string[] subTopicArray = { parentTopic+"/subDemo1", parentTopic+"/subDemo2/level3" };
  36. byte[] qosLevels = { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE };
  37. client.Subscribe(subTopicArray, qosLevels);
  38. client.Publish(parentTopic + "/subDemo1", Encoding.UTF8.GetBytes("hello mqtt"),MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE,false);
  39. //发送 P2P 消息,二级 topic 必须是 p2p,三级 topic 是接收客户端的 clientId
  40. client.Publish(parentTopic + "/p2p/"+clientId, Encoding.UTF8.GetBytes("hello mqtt"), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false);
  41. System.Threading.Thread.Sleep(10000);
  42. client.Disconnect();
  43. }
  44. static void client_recvMsg(object sender, MqttMsgPublishEventArgs e)
  45. {
  46. // access data bytes throug e.Message
  47. Console.WriteLine("Recv Msg : Topic is "+e.Topic+" ,Body is "+Encoding.UTF8.GetString(e.Message));
  48. }
  49. static void client_publishSuccess(object sender, MqttMsgPublishedEventArgs e)
  50. {
  51. // access data bytes throug e.Message
  52. Console.WriteLine("Publish Msg Success");
  53. }
  54. static void client_connectLose(object sender, EventArgs e)
  55. {
  56. // access data bytes throug e.Message
  57. Console.WriteLine("Connect Lost,Try Reconnect");
  58. }
  59. public static string HMACSHA1(string key, string dataToSign)
  60. {
  61. Byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(key);
  62. HMACSHA1 hmac = new HMACSHA1(secretBytes);
  63. Byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(dataToSign);
  64. Byte[] calcHash = hmac.ComputeHash(dataBytes);
  65. String calcHashString = Convert.ToBase64String(calcHash);
  66. return calcHashString;
  67. }
  68. }
  69. }