前言

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. FDA周五发布的药物安全警示信息相对会较少地被媒体传播

    The Friday Effect: Firm Lobbying, the Timing of Drug Safety Alerts, and Drug Side Effects 周五发布的药物安全警 ...

  2. disabled_button

    根据题目提示,是前端的知识 进入页面,flag按钮灰了按不下去 右键检查发现按钮地方的样式,发现有一个disabled,这里就直接把他删掉点击回车就可以点击了

  3. 打造我的 Windows 开发环境

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  4. NLP技术如何为搜索引擎赋能

    在全球化时代,搜索引擎不仅需要为用户提供准确的信息,还需理解多种语言和方言.本文详细探讨了搜索引擎如何通过NLP技术处理多语言和方言,确保为不同地区和文化的用户提供高质量的搜索结果,同时提供了基于Py ...

  5. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇

    1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试,想必大家都已 ...

  6. 使用MVVM Toolkit简化WPF开发

    最近. NET 8 的 WPF 推出了 WPF File Dialog改进,这样无需再引用 Win32 命名空间就可以实现文件夹的选择与存储了,算是一个很方便的改进了.顺手写了一个小的 WPF 程序, ...

  7. Meissel–Lehmer 算法

    前言 推荐先行阅读我的blog文章----Min_25 筛 什么是Meissel–Lehmer 算法 Meissel-Lehmer 算法是一种基于 \(ϕ\) 函数的的快速计算前缀质数个数(当然也可以 ...

  8. C# 12 Blazor入门教程

    Blazor简介 Blazor 是由Microsoft开发的一款基于.NET的开源交互式Web UI框架.Blazor使开发人员能够使用C#和HTML建立全堆栈的单页应用程序,并避免使用JavaScr ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (140)-- 算法导论11.4 5题

    五.用go语言,考虑一个装载因子为a的开放寻址散列表.找出一个非零的a值,使得一次不成功查找的探查期望数是一次成功查找的探查期望数的 2 倍.这两个探查期望数可以使用定理11.6 和定理 11.8 中 ...

  10. 快速上手Prompt,让你的LLMs更智能

    前言 在当前社会中,随着AIGC的盛行,使用好prompt可以让自己更上一层楼.今天,我将通过星火大模型重新认识prompt设计,并与大家分享一些使用技巧. 如果你想体验星火大模型的强大魅力,请登录h ...