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 - ...
随机推荐
- offline RL | IQL:通过 sarsa 式 Q 更新避免 unseen actions
题目:Offline Reinforcement Learning with Implicit Q-Learning,Sergey Levine 组,2022 ICLR,5 6 8. pdf 版本:h ...
- SQL与NoSQL数据库选型及实际业务场景探讨
在企业系统架构设计中,选择合适的数据库类型是一项关键决策.本文将对比SQL和NoSQL数据库的特点,分析它们在数据模型.可扩展性.一致性与事务.查询复杂性与频率,以及性能与延迟等方面的优势和劣势.同时 ...
- fianl详解(适合新手)
final 1.final是Java语言中的一个关键字 2.final表示最终的,不可变的. 3.final可以修饰变量以及方法,还有类等 4.final修饰的变量? 5.final修饰的方法? 6. ...
- C# 对象与JSON字符串互相转换
一.JSON字符串转对象(反序列化) 1.使用Newtonsoft.Json 反序列化字符串转换为指定类型 (T) JsonConvert.DeserializeObject<T>(jso ...
- BASE和最终一致性
四种性质: 基本可用性,软状态,强一致性,弱一致性 更据更新数据后各进程访问到数据的时间和方式不同: 如何实现各种类型的一致性: 对于HBase数据库来讲:
- vue3组合式api生命周期
生命周期钩子函数 Vue3:https://cn.vuejs.org/api/composition-api-lifecycle.html Vue2:https://v2.cn.vuejs.org/v ...
- 数字孪生与GIS结合,为智慧交通带来的改变
在当代社会,交通问题已经成为城市发展中的一个重要挑战.交通拥堵.安全隐患.环境污染等问题给人们的出行带来了许多不便和困扰.然而,随着数字孪生技术与地理信息系统(GIS)的融合,我们迎来了智慧交通的新时 ...
- 【笔记】负载均衡Robbin之不同服务使用不同的策略
裂开裂开,搞这么久忘记导入依赖 妈卖批 又不报错 还能让我玩 我以为全部导入了. 话不多说,开始演示. 介绍 给不同的服务 配置 不同的 负载均衡策略 这里使用 用户模块 进行访问其它两个模块的con ...
- 文心一言大模型-function Calling的应用
"大模型的函数调用"(Large Model Function Calling)是一个涉及到在大型人工智能模型,如 GPT-4 或类似的高级深度学习模型中使用函数调用的概念.在这种 ...
- MySQL面试题:一条SQL语句在MySQL中执行过程全解析
一 .MySQL 基础架构分析 介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图. 连接/线程处理(连接器): 身份认证和权限相关(如连接处理.授权认证.安全等等). 查询缓存: 执行查询语句的 ...