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 - ...
随机推荐
- mysql 代码适配 postgresql 适配改写,优化案例(行转列 + 标量子查询改写)
最近在适配个MySQL应用的项目,各种SQL改成PG兼容的语法真的是脑壳痛,今天遇到个有意思的案例. 原 MySQL SQL语句: SELECT DISTINCT l.MALL_NAME '项目', ...
- BABYRE
一道SMC,第一次做 主函数的伪代码,judge函数是关键函数,不过啥都没有 发现 judge 方法是判断的主要逻辑,在第 15 行时调用判断. 但是静态分析时不能生成 judge 的伪代码. 原因是 ...
- musl中strlen源码实现和分析
最近在学习<C 和指针>的第 6 章指针部分,在 6.12 章节看到了 strlen 函数的实现,联想到最近有在看 musl 的源码,于是就把 musl 中 strlen 的源码认真地分析 ...
- 最小的k个数 (3.20 leetcode每日打卡)
输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = 2 输 ...
- R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析
很久很久以前给大家写过决策树,非常简单明了的算法.今天给大家写随机(生存)森林,随机森林是集成了很多个决策数的集成模型.像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思 ...
- Vue05-Vuex
01. 什么是状态管理 在开发中,我们的应用程序需要处理各种各样的数据,这些数据需要保存在我们应用程序的某一个位置,对于这些数据的管理我们就称之为 状态管理. 在Vue开发中,我们使用组件化的开发方式 ...
- vue禁止浏览器F5进行刷新和监听浏览器刷新事件
项目中有个这样的需求: 进入视频播放页后,添加一个标识,为了防止用户一次播放多个视频,当离开该页面后,如果是从当前正在播放的视频页面离开的,则离开播放页时清除标识,如果是不是则不清除,并且禁止用户按F ...
- 管易云与网易互客对接集成发货单查询2.0=>编辑订单
管易云与网易互客对接集成发货单查询2.0=>编辑订单 对接源平台:管易云 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌,先后开发了C-ERP.EC-OMS.EC-WMS.E店管家.BBC ...
- 聊聊分布式 SQL 数据库Doris(九)
优化器的作用是优化查询语句的执行效率,它通过评估不同的执行计划并选择最优的执行计划来实现这一目标. CBO: 一种基于成本的优化器,它通过评估不同查询执行计划的成本来选择最优的执行计划.CBO会根据数 ...
- 2023年奔走的总结---吉特日化MES 制药项目 篇二
书接上文,反正今年也就折腾一下了,索性好好整理一下思绪写写文章,当做工作笔记.今年工作中遇到了各种各样的事情,可能是由于今年项目压力像无头苍蝇一样瞎撞,也打发一下按耐不住的心.本篇将记录一下<吉 ...