调研报告之MQTT协议

标签: 无 分类: 未分类 创建时间:2021-06-22 10:54:38 更新时间:2023-10-20 11:23:28

1.前言

MQTT(MessageQueueing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是由IBM公司推出的一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。由于其开放、简单和易于实现所以能够应用在资源受限的环境中,对于M2M和物联网应用程序来说是一个相当不错的选择。 至于我为什么要研究这个东西,主要是因为我服务于一家物联网公司,主要的产品就是生产传感器,然后获取数据,进行分析,计算和展示,而设备的协议就是MQTT协议,又因为我的后端技术栈是java,我就想有没有java现成的开源软件可以拿来直接用,于是就有了这篇文章。

以智能家居为例,智能家居中智能灯光控制,可以使用XMPP协议控制灯的开关;智能家居的电力供给,发电厂的发动机组的监控可以使用DDS协议;当电力输送到千家万户时,电力线的巡查和维护,可以使用MQTT协议;家里的所有电器的电量消耗,可以使用AMQP协议,传输到云端或家庭网关中进行分析;最后用户想把自家的能耗查询服务公布到互联网上,那么可以使用REST/HTTP来开放API服务。

还有就是一些比较常听的协议的关系:

NB-IoT,LORA,WIFI,蓝牙,zigbee,4G都是物理层的,这几个都需要芯片模组支持(硬件支持)
而MQTT,COAP,HTTP都是应用层协议,这些需要开发服务器,或者对接云平台厂商(软件支持)
所以(MQTT,COAP,HTTP)是居于(NB-IoT,LORA,WIFI,蓝牙,zigbee,4G)的上层协议

物理层的协议,我觉得应该算是传输协议,而应用层的协议,我觉得可以归结为通讯协议,就像参考文章6中说的,

物联网的通信环境有Ethernet, Wi-Fi, RFID, NFC(近距离无线通信), Zigbee, 6LoWPAN(IPV6低速无线版本),Bluetooth, GSM, GPRS, GPS, 3G, 4G等网络,而每一种通信应用协议都有一定适用范围。AMQP、JMS、REST/HTTP都是工作在以太网,COAP协议是专门为资源受限设备开发的协议,而DDS和MQTT的兼容性则强很多。
参考文章:
1.深度分析IOT的七大通信协议 这里介绍一下七种常用的物联网协议:REST/HTTP(松耦合服务调用)、CoAP协议、MQTT协议(低带宽)、DDS协议(高可靠性、实时)、AMQP协议(互操作性)、XMPP协议(即时通信)、JMS
2.MQTT 入门介绍 对MQTT的协议内容和作用,有一个整体的介绍
3.MQTT 协议 emqx官网,有对mqtt协议的介绍,也有示例:在 Flutter 项目中使用 MQTT、Android 使用 Kotlin 连接 MQTT、ESP8266 连接到免费的公共 MQTT 服务器、在树莓派上使用 MQTT 、如何在 Python 中使用 MQTT、如何在 Golang 中使用 MQTT、如何在 Vue 项目中使用 MQTT、使用 WebSocket 连接 MQTT 服务器、如何在 Electron 项目中使用 MQTT
4.MQTT协议规范 阿里云物联网平台,主要接收两种协议,一种是MQTT协议,一种是CoAP协议,还有就是使用HTTP协议,这里主要就是介绍,如何使用开放协议,接入到阿里云的物联网平台
5.NB-IoT,LORA,wifi,蓝牙,zigbee,MQTT,COAP之间的关系 这个关于MQTT和物理层的协议倒是让我有了一定的区分,一个是应用层的协议,一个是物理层的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层;OSI七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。
6.IOT(物联网)的七大通信协议

2.常见的开源服务器

主流的可能就是mosquitto还有EMQX这两种了吧,至于两者有什么性能的差异,其实我是看不出来的,都是靠别人进行说明的,对于刚入门的人来说,到底说的清两者之间的差异吗?不好说。我觉得提供的EMQX功能更加的丰富吧,还可以加钱,获得更高更优质的服务。

参考文章:
1.物联网MQTT协议分析和开源Mosquitto部署验证
2.常见MQTT服务器搭建与试用 这里介绍了三种MQTT服务器:EMQX、Mosquitto、Apollo,主要介绍了EMQX的windows端搭建和测试。
3.【经验分享】如何搭建本地MQTT服务器(Windows ),并进行上下行调测 EMQTT
4.EMQ X | 百万级的开源MQTT消息服务器(搭建一个私有MQTT服务器)
5.36氪首发 | 面向物联网时代打造开源基础软件,「EMQ」获高瓴创投领投近1.5亿元B轮融资 这个是一个宣传文章,我就不说了,反正就是很厉害就对了。
6.2020 年常见 MQTT 客户端工具比较 客户端工具主要有:MQTT X、Mosquitto CLI、MQTT.fx、MQTT Explorer、MQTT Box、mqtt-spy、MQTT Lens、MQTT WebSocket Toolkit
7.MQTT物联网服务器搭建工具:EMQ Broker与Mosquitto Broker 这里说是比较,其实就是没有比较,就是两种不同的MQTT服务器搭建的过程

4.emqx

emqx 是一个提供mqtt协议的服务端,使用的人还是挺多的,大疆的无人机也是使用的这个东西进行的。安装和启动emqx服务器,这个部分我在另外一篇文章中进行说明好了。

参考文章:
1. emqx /emqx emqx的源码地址,star有8k之多,但是这个star的东西吧,不好说,比如我就是喜欢star,不管这个有没有用,好不好用,我自己会不会用,我只要看到了,了解到了,准备要用了,就会star,而且不取消。
2.安装 这里有详细的安装和配置步骤

3.Mosquitto

参考文章:
1.Mosquitto搭建mqtt服务器 教程
2. eclipse /mosquitto Eclipse Mosquitto 的开源地址,star有4.9k

3.和java技术的整合

根据参考资料,主要有两类,一类是Paho Java,一类是mqtt-client

参考文章:
1.java实现mqtt服务端_EMQ X MQTT 服务器 v4.1-beta.1 发布 - 支持 Java 等多语言扩展
2.Mqtt的broker技术选型
3.Java 连接 MQTT 服务器 使用mqtt-client这个maven依赖,进行服务器连接。
4.MQTT Java 客户端库 这是EMQX提供的使用 Paho Java 这个库的示例,在文章的最后,说是Paho Java还在适配MQTT v5.0版本中
5.【微信小程序控制硬件①】 全网首发,借助 emq 消息服务器带你如何搭建微信小程序的mqtt服务器,轻松控制智能硬件! 这一篇的系列教程,也算是一个入门教程,就是如何使用微信小程序,结合websocket,加上mqtt等的协议,实现的可以通过微信小程序,控制智能家居的功能。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。