C# 使用MQTT 协议实现通讯

news/2024/11/23 3:43:08/

 1.什么是MQTT 协议

 MQTT 协议的全称是 Message Queuing Telemetry Transport,翻译为消息队列传输探测,它是 ISO 标准下的一种基于发布 - 订阅模式的消息协议,它是基于 TCP/IP 协议簇的,它是为了改善网络设备硬件的性能和网络的性能来设计的。MQTT 一般多用于 IoT 即物联网上,广泛应用于工业级别的应用场景,比如汽车、制造、石油、天然气等。

2.MQTT 协议优缺点

优点: 

  1. 更加简单:MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;
  2. 网络稳定:工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;
  3. 轻量级:小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;适合低带宽,数据量较小的应用;
  4. 易于实现:MQTT协议的服务端程序已经非常成熟,PHP,JAVA,Python,C,C#等系统语言都可以来向MQTT发送相关消息;
  5. 开放性:源代码开放,都可以用,也进一步推动了MQTT的发展,百度云、阿里云、中国移动onenet等几乎所有的开放性物联网平台都支持MQTT;

缺点:

  1. 不支持文件和AV
  2. 不支持与第三方HTTP集成
  3. 不支持负载分配
  4. 不支持用户管理界面
  5. 不支持点对点通信,并且使用标准的MQTT协议
  6. 不支持群组通信或群组管理,而是实现群组成员的管理

3. MQTT client 和MQTT server 理解

1. MQTT client : 向server 订阅对应的主题消息内容,并获取到订阅的相关主题消息或者发布相关的主题消息给server。

2. MQTT server :主要用于与多个客户端保持连接,并处理client (客户端)的发布和订阅等逻辑。一般很少直接从server (服务端)发布消息给客户端(如果要发布消息,可以使用 mqttServer.Publish(appMsg); 直接发布消息给client),多数情况下server 都是转发client 已订阅主题消息给对应的client,在系统中起到一个中介的作用。

 4.MQTT 协议与TCP/IP 协议的联系

  1. MQTT 协议是属于应用层的协议
  2. TCP/IP 协议是属于传输层的协议 

5.MQTT Serve和MQTT Client 发布和订阅消息测试

1.首先下载MQTT Serve 测试工具HslCommunication

1.1 开启一个MQTT 服务端

 1.2 再开启一个测试的客户端,并连接进来

1.3 开启我们的写的客户端,端口号同样是1883 

 1.4 在服务端可以到看,2个客户端连接进来了

 2. 进行消息发布和订阅测试

 2.1 客户端1,订阅一个主题消息为香蕉的主题。客户端2,订阅一个主题消息为苹果的主题。怎么理解这个测试呢?就是当消息的发布者,在发布消息的时候,如果主题是香蕉,服务端就会把这个消息只发给客户端1,而客户端2则不会收到主题消息为香蕉的消息。明白了吧!

2.2 客户端2开始发布主题消息

 2.3 客户端1 发布主题消息

 2.3 服务端向客户端发布消息

总结:

1.服务端也能向客户端发布消息,但服务端的作用一般是用于消息的转发。并把对应的主题消息转发给对应的客户端。

2.客户端可以做为消息的订阅者,也可以做为消息的发布者

源代码已上传到 CSDN 为开发者提供的开源项目创新服务平台 gitcode

 参考文献:

https://zhuanlan.zhihu.com/p/268113708

https://zhuanlan.zhihu.com/p/342874157

https://blog.csdn.net/panwen1111/article/details/79245161

https://blog.csdn.net/yuming/article/details/125834921


http://www.ppmy.cn/news/22945.html

相关文章

Mongodb搭建并使用

1、配置文件 1.1、添加pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency> </dependencies> 1.2、配置连接&#xff0c;账号密码可以自己…

【Python入门第二天】Python入门

Python 安装 已经安装软件的小伙伴要检查是否已在 Windows PC 上安装了 python&#xff0c;请在开始栏中寻找 Python 或者直接在命令提示符窗口输入Python按回车&#xff0c;如果已经安装就会出现你的安装信息。 如果有小伙伴还没有安装环境或者编辑器&#xff0c;可以转到这里…

JavaScript 异步编程

JavaScript 异步编程 Javascript语言的执行环境是"单线程"&#xff08;single thread&#xff09;。 所谓"单线程"&#xff0c;就是指一次只能完成一件任务。如果有多个任务&#xff0c;就必须排队&#xff0c;前面一个任务完成&#xff0c;再执行后面一…

谷粒商城:认证服务准备+60s短信验证

gatewa服务路由配置 - id: gulimall_auth_routeuri: lb://gulimall-auth-serverpredicates:- Hostauth.gulimall.com nginx改变 将静态资源全部转移 gulimall-auth-server启动类 SpringBootApplication EnableFeignClients EnableDiscoveryClient public class GulimallAut…

冒泡排序——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰考试了呀&#xff0c;考的是计算机基础&#xff0c;希望不大......不过这些都不是问题&#xff0c;这不能阻止我对C语言的热情&#xff0c;那现在&#xff0c;就让我们进入冒泡排序的世界吧&#xff0c;我在写数组这篇博客的时候就…

c# 面试题 2023-2-6

1.POP、OOP、AOP区别。AOP解决什么问题 2.AOP的实现 3.装箱和拆箱 4.抽象类和接口的区别和使用场景 5.锁:乐观锁,悲观锁 举例说明应用场景 6.什么是死锁&#xff1f;如何保证你实现的锁结果不发生死锁 7.数组和链表的区别 8.WebAPI 和 webservice的区别 9.什么是线…

小程序抽象节点(插槽获取组件数据)

在开发过程中&#xff0c;封装组件经常会遇到这一种场景&#xff0c;例如这里我要封装一个swiper组件&#xff0c;但是不同的使用位置&#xff0c;布局结构样式这些需要不同的展现方式&#xff0c;这里我们就会使用插槽&#xff0c;在vue中我们可以使用slot-scope来获取组件的数…

软件工程——软件测试方法

软件测试是在软件投入生产性运行之前&#xff0c;对软件需求分析、设计规格说明和编码的最终复审&#xff0c;是软件质量控制的关键步骤。 软件开发过程是一个自顶向下、逐步细化的过程&#xff0c;而测试过程则是依相反的顺序安排的自底向上、逐步集成的过程。 一、白盒测试…