前言

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

Step By Step 步骤

  1. 搭建一个 MQTT 服务器

  2. 创建一个 .Net Framework Console 项目,命名为 MQTTSample

  3. 添加 NuGet 包

    <package id="MQTTnet" version="4.3.1.873" targetFramework="net48" />
    <package id="MQTTnet.Extensions.WebSocket4Net" version="4.3.1.873" targetFramework="net48" />

    注:在添加这两个包时,会自动添加其它依赖包

  4. 在 Program.cs 编写 MQTT 通信(重点看注释

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MQTTnet;
    using MQTTnet.Client;
    using MQTTnet.Packets;
    using MQTTnet.Protocol;
    using System.Security.Authentication;
    using MQTTnet.Formatter;
    using MQTTnet.Extensions.WebSocket4Net;
    using System.Threading; namespace MQTTSample
    {
    internal class Program
    {
    static async Task Main(string[] args)
    {
    // 设计两个参数,是为了可以打开两个 CMD 客户端进行测试
    if (args[0] == "publish")
    {
    Console.WriteLine("Publish message...");
    await PublishMessage();
    }
    else
    {
    Console.WriteLine("Receive message...");
    await SubscribeTopic();
    }
    } // 循环不断地发布消息
    private static async Task PublishMessage()
    {
    var i = 0;
    while (i <= 1000)
    {
    var mqttFactory = new MqttFactory(); using (var mqttClient = mqttFactory.CreateMqttClient())
    {
    // 1. 连接 MQTT 服务器
    var mqttClientOptions = new MqttClientOptionsBuilder()
    .WithTcpServer("192.168.3.233", 1883) // MQTT 服务器IP+端口
    .WithClientId("publish_client") // 客户端名称
    //.WithProtocolVersion(MqttProtocolVersion.V500)
    //.WithCleanSession()
    .Build(); var response = await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); Console.WriteLine($"The MQTT client is connected. IsConnected: [{mqttClient.IsConnected}]");
    Console.WriteLine(response.ResultCode); // 2. 发布消息
    // 2.1 在名为 topic2 的主题上发布消息 this is a test message
    var applicationMessage = new MqttApplicationMessageBuilder()
    .WithTopic("topic2")
    .WithPayload("this is a test message")
    .Build(); // 2.2 异步发布消息
    await mqttClient.PublishAsync(applicationMessage, CancellationToken.None); // 3. 断开连接
    await mqttClient.DisconnectAsync(); Console.WriteLine("MQTT application message is published.");
    } i++;
    Thread.Sleep(1000);
    }
    } // 订阅消息
    // 订阅一次就可以,不需要循环
    // 当订阅的主题有发布消息时,这个程序就可以接收到
    private static async Task SubscribeTopic()
    {
    var mqttFactory = new MqttFactory(); using (var mqttClient = mqttFactory.CreateMqttClient())
    {
    // 1. 设置连接 MQTT 服务器的属性
    var mqttClientOptions = new MqttClientOptionsBuilder()
    .WithTcpServer("192.168.3.233", 1883)
    .WithClientId("subscribe_client")
    //.WithCleanSession()
    .Build(); // 2. 定义一个事件,当订阅的主题有发布消息时,接收并打印消息
    // 2.1 这段代码必须写在连接 MQTT 服务器的代码之前,才能确保可以接收到消息
    mqttClient.ApplicationMessageReceivedAsync += e =>
    {
    Console.WriteLine("Received application message.");
    Console.WriteLine(e.ApplicationMessage.Topic);
    Console.WriteLine(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
    Console.WriteLine("==================="); return Task.CompletedTask;
    }; // 3. 连接 MQTT 服务器
    await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); // 4. 订阅名为 topic2 的主题的消息
    var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder()
    .WithTopicFilter(
    f =>
    {
    f.WithTopic("topic2")
    .WithExactlyOnceQoS(); //即精准一次
    })
    .Build(); await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None); Console.WriteLine("MQTT client subscribed to topic."); // 5. 离开时才断开连接
    Console.WriteLine("Press enter to exit.");
    Console.ReadLine();
    } }
    }
    }
  5. 编译并运行测试

    1. 打开一个 CMD 命令窗口,姑且称为 CMD1,定位到 MQTTSample.exe 所有目录,如

      cd D:\MQTTSample\MQTTSample\bin\Debug
    2. 运行以下命令,运行 MQTT 接收订阅消息客户端

      MQTTSample.exe subscribe

      注:这个时候,还没有运行 MQTT 发布消息客户端MQTT 接收订阅消息客户端 还没有显示接收的消息

    3. 重新打开一个 CMD 命令窗口,姑且称为 CMD2,定位到 MQTTSample.exe 所有目录

    4. 运行以下命令,运行 MQTT 发布消息客户端

      MQTTSample.exe publish

      注:此时,按照程序设定,MQTT 发布消息客户端 每隔 1 秒不断发布消息:this is a test message

    5. 此时,CMD1 窗口的 MQTT 接收订阅消息客户端 也会不停地显示其接收的消息:this is a test message

    6. 至此,说明此 "MQTT 通信" 程序的两个不同客户端成功利用 MQTT 服务器进行通信

C# 完美实现物联网 MQTT 数据通信的更多相关文章

  1. 物联网MQTT协议分析和开源Mosquitto部署验证

    在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...

  2. 物联网 MQTT 服务质量级别

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 翻译人:Tnecesoc,该成员来自云+社区翻译社 消息队列遥测传输(MQTT)是一种客户端服务器发布 / 订阅消息传输协议.它轻量,开放, ...

  3. Paho -物联网 MQTT C Cient的实现和详解

    概述   在文章Paho - MQTT C Cient的实现中,我介绍了如何使用Paho开源项目创建MQTTClient_pulish客户端.但只是简单的介绍了使用方法,而且客户端的结果与之前介绍的并 ...

  4. ESP系列MQTT数据通信

    1.使用一个深圳四博智联科技有限公司的NODEMCU开发板. 2.下载MQTT的SDK压缩包,请查看附件. 3.用官方提供的Eclipse打开MQTT的sdk开发包. 4.打开include文件夹中的 ...

  5. 纯vue3实现的svg可视化web组态编辑器。主要用于物联网mqtt实时系统图

    vue就是边做这个项目边学的 代码可能有点乱 还望各位大神勿喷 如果代码对您有帮助 麻烦辛苦帮我点个star 预览地址 https://svg.yaolunmao.top 如何使用 # 克隆项目 gi ...

  6. MQTT物联网通讯协议入门

    目录 一.MQTT协议概念 发布/订阅机制 MQTT客户端 Broker代理(服务器) MQTT消息结构 二.MQTT协议实现原理 MQTT连接 MQTT消息发布 MQTT订阅机制 MQTT订阅确认 ...

  7. 常见MQTT服务器搭建[转载]

    简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠的网络的进行远程传感器和控制设备通 ...

  8. 百万级开源MQTT消息服务器 搭建

    下载地址:http://emqtt.com/downloads 文档地址:http://emqtt.com/docs/v2/index.html 开始使用EMQ 2.0 消息服务器简介EMQ (Erl ...

  9. 常见MQTT服务器搭建与试用

    常见MQTT服务器搭建与试用   简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠 ...

  10. 阿里云物联网套件(iot)设备间通信(M2M)在web端的实践

    之前通过nodejs连接到阿里云物联网mqtt,后又用浏览器连接,总结一下: 由于项目是SPA,使用webpack,关键代码: 同样使用mqtt.js之前先install: npm install - ...

随机推荐

  1. 用友U8与MES系统API接口对接案例分析

    企业数字化转型:轻易云数据集成平台助力 U8 ERP+MES 系统集成 为什么选择数字化转型? 领导层对企业资源规划(ERP)的深刻理解促使了数字化转型的启动. 采用精确的"N+5" ...

  2. 提升效率,打通万里牛ERP与下游用友U8财务软件的无缝对接

    一.对接流程 1.1 销售/售后流程 在万里牛订单出库后,通过轻易云数据集成平台将数据推送至用友U8销售订单和销售出库单,这些单据可以进行关联操作. 当万里牛售后单完成退货入库后,通过数据集成平台将数 ...

  3. SQL Server 自动增长清零的方法

    方法一: truncate table TableName 删除表中的所有的数据的同时,将自动增长清零.如果有外键参考这个表,这个方法会报错(即便主键表和外键表都已经没有数据),请参考方法2. 方法二 ...

  4. [ABC263G] Erasing Prime Pairs

    Problem Statement There are integers with $N$ different values written on a blackboard. The $i$-th v ...

  5. 三种方式查询三级分类Tree

    话不多说,直接上代码 方式一:for循环嵌套一下 /** * 查询三级分类 * * @return */ @Override public List<GoodsType> findNode ...

  6. 基于Docker Desktop搭建Kafka集群并使用Java编程开发

    一.引言 前段时间因课业要求使用Docker Desktop 部署Kafka集群并编写生产者消费者程序,折磨了我好几天,在查找大量资料后终于是把整个集群搭建完成了.现在我想要分享其中搭建的历程,希望能 ...

  7. Codeforces Round #426 (Div. 2) A. The Useless Toy

    A. The Useless Toy time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. C++中数字与字符串之间的转换(转载自http://www.cnblogs.com/luxiaoxun/)

    C++中数字与字符串之间的转换   1.字符串数字之间的转换(1)string --> char *   string str("OK");   char * p = str ...

  9. python操作elasticsearch-全文检索、拼写纠错、补全提示

    1.首先安装elasticsearch包 pip install elasticsearch (一般会包含新旧版本,如果想要特定的版本,比如5.x 可以在后面加5数字) ""&qu ...

  10. Scrapy-settings.py常规配置

    # Scrapy settings for scrapy_demo project # # For simplicity, this file contains only settings consi ...