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 - ...
随机推荐
- 题解 CF916C
题目大意: 要求构造一张图,并让该图满足以下条件: 有 \(n\) 个点,\(m\) 条边. 每条边的边权范围是 \([1,10^9]\). 图中从 \(1\) 到 \(n\) 的最短路径长度是个质数 ...
- Vue 2.x源码学习:应用初始化大致流程
内容乃本人学习Vue2源码的一点笔记,若有错误还望指正. 源码版本: vue: 2.6 vue-loader: 13.x vue-template-compiler: 2.6 相关学习笔记: 数据响应 ...
- Android app的暗黑模式适配实现
原文地址: Android app的暗黑模式适配实现 - Stars-One的杂货小窝 很久之前放在草稿箱的一篇简单笔记,是之前蓝奏云批量下载工具Android版本实现暗黑主题的适配记录 本文所说的这 ...
- 一个简单案例的Vue2.0源码
本文学习vue2.0源码,主要从new Vue()时发生了什么和页面的响应式更新2个维度了解Vue.js的原理.以一个简单的vue代码为例,介绍了这个代码编译运行的流程,在流程中原始DOM的信息会被解 ...
- Optional源码分析(涉及Objects源码和Stream源码)
研究Optional源码之前先谈一谈Objects源码. 主要代码: @ForceInline public static <T> T requireNonNull(T obj) { if ...
- GHOST 系统安装教程 轻松一键,系统恢复到最佳状态
硬盘安装系统 安装前准备 1.保证能够正常进入系统: 2.下载Ghost系统镜像文件: 3.下载镜像安装器: 安装步骤 1.下载Ghost系统镜像"Win7_x64_Pure_5.07.GH ...
- FolkMQ 内存型消息中间件,v1.0.21 发布
简介 采用 "多路复用" + "内存运行" + "快照持久化" + "Broker 集群模式"(可选)+ 基于 Sock ...
- cocos2d-Js 各类碰撞检测
这里总结一下点.圆.矩形之间的简单碰撞检测算法(矩形不包括旋转状态) 点和圆的碰撞检测: 1.计算点和圆心的距离 2.判断点与圆心的距离是否小于圆的半径 isCollision: function(p ...
- IIS下使用SSL证书
IIS下使用SSL证书 本文介绍windowsServer下SSL证书配置及IIS站点配置 1. 生成SSL证书 在阿里云申请免费SSL证书 登录阿里云管理控制台,打开SSL证书管理 选择免费证 ...
- 基于python的cat1模块的AT指令串口通信解析
一 前记 使用cat1模块做产品的过程中,遇到了不少问题.其中很重要的一个就是怎么测试单个模块的好坏.这里笔者专门写了一个工具,来测试cat1模块的是否好用,这里做一个分享吧. 二 源码解析 这个 ...