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

前言
MQTT 协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低、占用带宽低、即时通讯等优点,使其在物联网、小型设备、移动应用等方面有较广泛的应用,在工业物联网中,MQTT也有广泛的应用。
Step By Step 步骤
搭建一个 MQTT 服务器
- 见本人其它文章《手把手教你在 Windows 环境中搭建 MQTT 服务器》
创建一个 .Net Framework Console 项目,命名为 MQTTSample
添加 NuGet 包
<package id="MQTTnet" version="4.3.1.873" targetFramework="net48" />
<package id="MQTTnet.Extensions.WebSocket4Net" version="4.3.1.873" targetFramework="net48" />
注:在添加这两个包时,会自动添加其它依赖包
在 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();
} }
}
}
编译并运行测试
打开一个 CMD 命令窗口,姑且称为 CMD1,定位到
MQTTSample.exe所有目录,如cd D:\MQTTSample\MQTTSample\bin\Debug
运行以下命令,运行
MQTT 接收订阅消息客户端MQTTSample.exe subscribe
注:这个时候,还没有运行
MQTT 发布消息客户端,MQTT 接收订阅消息客户端还没有显示接收的消息重新打开一个 CMD 命令窗口,姑且称为 CMD2,定位到
MQTTSample.exe所有目录运行以下命令,运行
MQTT 发布消息客户端MQTTSample.exe publish
注:此时,按照程序设定,
MQTT 发布消息客户端每隔 1 秒不断发布消息:this is a test message此时,CMD1 窗口的
MQTT 接收订阅消息客户端也会不停地显示其接收的消息:this is a test message至此,说明此 "MQTT 通信" 程序的两个不同客户端成功利用 MQTT 服务器进行通信
C# 完美实现物联网 MQTT 数据通信的更多相关文章
- 物联网MQTT协议分析和开源Mosquitto部署验证
在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...
- 物联网 MQTT 服务质量级别
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 翻译人:Tnecesoc,该成员来自云+社区翻译社 消息队列遥测传输(MQTT)是一种客户端服务器发布 / 订阅消息传输协议.它轻量,开放, ...
- Paho -物联网 MQTT C Cient的实现和详解
概述 在文章Paho - MQTT C Cient的实现中,我介绍了如何使用Paho开源项目创建MQTTClient_pulish客户端.但只是简单的介绍了使用方法,而且客户端的结果与之前介绍的并 ...
- ESP系列MQTT数据通信
1.使用一个深圳四博智联科技有限公司的NODEMCU开发板. 2.下载MQTT的SDK压缩包,请查看附件. 3.用官方提供的Eclipse打开MQTT的sdk开发包. 4.打开include文件夹中的 ...
- 纯vue3实现的svg可视化web组态编辑器。主要用于物联网mqtt实时系统图
vue就是边做这个项目边学的 代码可能有点乱 还望各位大神勿喷 如果代码对您有帮助 麻烦辛苦帮我点个star 预览地址 https://svg.yaolunmao.top 如何使用 # 克隆项目 gi ...
- MQTT物联网通讯协议入门
目录 一.MQTT协议概念 发布/订阅机制 MQTT客户端 Broker代理(服务器) MQTT消息结构 二.MQTT协议实现原理 MQTT连接 MQTT消息发布 MQTT订阅机制 MQTT订阅确认 ...
- 常见MQTT服务器搭建[转载]
简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠的网络的进行远程传感器和控制设备通 ...
- 百万级开源MQTT消息服务器 搭建
下载地址:http://emqtt.com/downloads 文档地址:http://emqtt.com/docs/v2/index.html 开始使用EMQ 2.0 消息服务器简介EMQ (Erl ...
- 常见MQTT服务器搭建与试用
常见MQTT服务器搭建与试用 简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠 ...
- 阿里云物联网套件(iot)设备间通信(M2M)在web端的实践
之前通过nodejs连接到阿里云物联网mqtt,后又用浏览器连接,总结一下: 由于项目是SPA,使用webpack,关键代码: 同样使用mqtt.js之前先install: npm install - ...
随机推荐
- 使用OSS搭建私有云内网yum仓库的方法
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 使用OSS搭建私有云内网yum仓库的方法 文字&图片内容已脱敏 #.前几天接到一个搭建内网yum源的任务.刚接 ...
- Ubantu使用n升级Node提示权限不够
升级Node时,常见以下问题: 使用 n stable 时提示权限不够 (base) zibuyu@ubuntu:~/Desktop/luffy$ n stable installing : node ...
- AntDesignBlazor示例——创建列表页
本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考. 示例代码仓库:https://gitee.com/known/AntDesignDemo 1. 学习目标 使用 ...
- 汇报工作与众不同:在PPT中展示Datainside动态图表
题目要求了解在PPT中展示Datainside动态图表,下面是关于该主题的详细介绍. 内容可视化:概念与定义 内容可视化(Data Visualization)是将数据以图形或其他视觉形式呈现的过程, ...
- CLion安装与配置教程
一.下载并安装CLion 1.下载 1.官网: Download CLion 2.注意: 这里建议使用2021.1.3版本之前,为之后的使用便利而做打算. (这里以Windows系统为例,其他系统类似 ...
- 第一次使用 GoLand 启动 运行 Go 项目
一.开始之前确保已经安装 go语言环境 二.新建项目 三.选择项目路径 四.在该目录下手动创建 bin,src两个文件夹 bin 用来存放编译后的 .exe 文件 src 我们的工程的开发文件存放的点 ...
- 解密Prompt系列21. LLM Agent之再谈RAG的召回信息密度和质量
话接上文的召回多样性优化,多路索引的召回方案可以提供更多的潜在候选内容.但候选越多,如何对这些内容进行筛选和排序就变得更加重要.这一章我们唠唠召回的信息密度和质量.同样参考经典搜索和推荐框架,这一章对 ...
- 【scikit-learn基础】--『预处理』之 正则化
数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...
- SpringBoot 异步编程浅谈
1. 需求背景 当我们需要提高系统的并发性能时,我们可以将耗时的操作异步执行,从而避免线程阻塞,提高系统的并发性能.例如,在处理大量的并发请求时,如果每个请求都是同步阻塞的方式处 理,系统的响应时间会 ...
- Kernel Memory 入门系列:快速开始
Kernel Memory 入门:Quick Start 了解了用户问答和文档预处理的流程之后,我们就可以直接开始使用Kernel Memory了. 1. 安装 项目中只需要通过NuGet安装Micr ...