翼度科技»论坛 编程开发 .net 查看内容

C# 完美实现物联网 MQTT 数据通信

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21

前言

MQTT 协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低、占用带宽低、即时通讯等优点,使其在物联网、小型设备、移动应用等方面有较广泛的应用,在工业物联网中,MQTT也有广泛的应用。
Step By Step 步骤


  • 搭建一个 MQTT 服务器

  • 创建一个 .Net Framework Console 项目,命名为 MQTTSample
  • 添加 NuGet 包
    1. [/code]注:在添加这两个包时,会自动添加其它依赖包
    2. [*]在 Program.cs 编写 MQTT 通信(重点看[b]注释[/b])
    3. [code]using System;
    4. using System.Collections.Generic;
    5. using System.Linq;
    6. using System.Text;
    7. using System.Threading.Tasks;
    8. using MQTTnet;
    9. using MQTTnet.Client;
    10. using MQTTnet.Packets;
    11. using MQTTnet.Protocol;
    12. using System.Security.Authentication;
    13. using MQTTnet.Formatter;
    14. using MQTTnet.Extensions.WebSocket4Net;
    15. using System.Threading;
    16. namespace MQTTSample
    17. {
    18.         internal class Program
    19.         {
    20.                 static async Task Main(string[] args)
    21.                 {
    22.                         // 设计两个参数,是为了可以打开两个 CMD 客户端进行测试
    23.                         if (args[0] == "publish")
    24.                         {
    25.                                 Console.WriteLine("Publish message...");
    26.                                 await PublishMessage();
    27.                         }
    28.                         else
    29.                         {
    30.                                 Console.WriteLine("Receive message...");
    31.                                 await SubscribeTopic();
    32.                         }   
    33.                 }
    34.                 // 循环不断地发布消息
    35.                 private static async Task PublishMessage()
    36.                 {
    37.                         var i = 0;
    38.                         while (i <= 1000)
    39.                         {
    40.                                 var mqttFactory = new MqttFactory();
    41.                                 using (var mqttClient = mqttFactory.CreateMqttClient())
    42.                                 {
    43.                                         // 1. 连接 MQTT 服务器
    44.                                         var mqttClientOptions = new MqttClientOptionsBuilder()
    45.                                                 .WithTcpServer("192.168.3.233", 1883)         // MQTT 服务器IP+端口
    46.                                                 .WithClientId("publish_client")                 // 客户端名称
    47.                                                 //.WithProtocolVersion(MqttProtocolVersion.V500)
    48.                                                 //.WithCleanSession()
    49.                                                 .Build();
    50.                                         var response = await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
    51.                                         Console.WriteLine($"The MQTT client is connected. IsConnected: [{mqttClient.IsConnected}]");
    52.                                         Console.WriteLine(response.ResultCode);
    53.                                         // 2. 发布消息
    54.                                         // 2.1 在名为 topic2 的主题上发布消息 this is a test message
    55.                                         var applicationMessage = new MqttApplicationMessageBuilder()
    56.                                                 .WithTopic("topic2")
    57.                                                 .WithPayload("this is a test message")
    58.                                                 .Build();
    59.                                         // 2.2 异步发布消息
    60.                                         await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
    61.                                         // 3. 断开连接
    62.                                         await mqttClient.DisconnectAsync();
    63.                                         Console.WriteLine("MQTT application message is published.");
    64.                                 }
    65.                                 i++;
    66.                                 Thread.Sleep(1000);
    67.                         }
    68.                 }
    69.                 // 订阅消息
    70.                 // 订阅一次就可以,不需要循环
    71.                 // 当订阅的主题有发布消息时,这个程序就可以接收到
    72.                 private static async Task SubscribeTopic()
    73.                 {
    74.                         var mqttFactory = new MqttFactory();
    75.                         using (var mqttClient = mqttFactory.CreateMqttClient())
    76.                         {
    77.                                 // 1. 设置连接 MQTT 服务器的属性
    78.                                 var mqttClientOptions = new MqttClientOptionsBuilder()
    79.                                         .WithTcpServer("192.168.3.233", 1883)
    80.                                         .WithClientId("subscribe_client")
    81.                                         //.WithCleanSession()
    82.                                         .Build();
    83.                                 // 2. 定义一个事件,当订阅的主题有发布消息时,接收并打印消息
    84.                                 // 2.1 这段代码必须写在连接 MQTT 服务器的代码之前,才能确保可以接收到消息
    85.                                 mqttClient.ApplicationMessageReceivedAsync += e =>
    86.                                 {
    87.                                         Console.WriteLine("Received application message.");
    88.                                         Console.WriteLine(e.ApplicationMessage.Topic);
    89.                                         Console.WriteLine(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
    90.                                         Console.WriteLine("===================");
    91.                                         return Task.CompletedTask;
    92.                                 };
    93.                                
    94.                                 // 3. 连接 MQTT 服务器
    95.                                 await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
    96.                                 // 4. 订阅名为 topic2 的主题的消息
    97.                                 var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder()
    98.                                 .WithTopicFilter(
    99.                                         f =>
    100.                                         {
    101.                                                 f.WithTopic("topic2")      
    102.                                                  .WithExactlyOnceQoS();                //即精准一次
    103.                                         })
    104.                                 .Build();
    105.                                 await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);
    106.                                 Console.WriteLine("MQTT client subscribed to topic.");
    107.                                 // 5. 离开时才断开连接
    108.                                 Console.WriteLine("Press enter to exit.");
    109.                                 Console.ReadLine();
    110.                         }
    111.                 }
    112.         }
    113. }
    复制代码
  • 编译并运行测试

    • 打开一个 CMD 命令窗口,姑且称为 CMD1,定位到 MQTTSample.exe 所有目录,如
      1. cd D:\MQTTSample\MQTTSample\bin\Debug
      复制代码
    • 运行以下命令,运行 MQTT 接收订阅消息客户端
      1. MQTTSample.exe subscribe
      复制代码
      注:这个时候,还没有运行 MQTT 发布消息客户端,MQTT 接收订阅消息客户端 还没有显示接收的消息
    • 重新打开一个 CMD 命令窗口,姑且称为 CMD2,定位到 MQTTSample.exe 所有目录
    • 运行以下命令,运行 MQTT 发布消息客户端
      1. MQTTSample.exe publish
      复制代码
      注:此时,按照程序设定,MQTT 发布消息客户端 每隔 1 秒不断发布消息:this is a test message
    • 此时,CMD1 窗口的 MQTT 接收订阅消息客户端 也会不停地显示其接收的消息:this is a test message
    • 至此,说明此 "MQTT 通信" 程序的两个不同客户端成功利用 MQTT 服务器进行通信


来源:https://www.cnblogs.com/JackyGz/Undeclared/17959221
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具