最近项目中涉及到MQTT相关内容,在此对相关内容做个基础的梳理。
MQTT官网: https://mqtt.org/
MQTT是用于物联网(IoT)的OASIS标准消息传递协议。它被设计为一种非常轻量级的发布/订阅消息传输,非常适合连接代码占用空间小、网络带宽最小的远程设备。MQTT目前广泛应用于汽车、制造、电信、石油和天然气等行业。
MQTT是一种 发布/订阅
机制的通讯架构:
MQTT的服务器(Broker)和常见的HTTP服务器这些区别蛮大的。常见的HTTP服务器是有具体的业务逻辑功能的,所以服务器需要自行编写代码;而MQTT服务器只负责客户端接入和消息分发等工作,这些工作都是由MQTT协议标准规定好的,并不包含具体应用中的业务逻辑。MQTT客户端即可以是消息的发布者也可以是消息的接收者,所以真正的业务逻辑只和客户端有关。
MQTT中的消息都有各自的topic,客户端发布消息时要声明消息的topic,客户端作为消息接收者的话需要订阅topic。服务器在收到消息时会将其推送给已经订阅了的客户端。目前大多数情况下服务器不用手动建立topic,而是会在收到未被使用过的topic的消息时自动记录。
MQTT中有个QoS机制来控制消息传递的质量:QoS0 - 最多交付一次;QoS1 - 至少交付一次;QoS2 - 只交付一次。发布和订阅时都有QoS参数,如果发布方的QoS比较小则以发布方的Qos为准。
MQTT除了上面的一些机制,最终还是为用来传递消息的,其消息格式最少需要有两个字节的头部消息:
第一个字节用于表达消息类型以及一些标识符;第二个字节用于表达接下来数据的长度。长度字段的 最高Bit为1 用来表示还需要再一个字节来表达长度,依此类推,最多可以用四个字节来表达消息长度,最大可以表示的长度为 256MB - 1Byte:
MQTT目前流行的 3.1.1
和 5.0
两个协议标准,协议是向下兼容的。另外还有 MQTT-SN
标准,设计上主要用于性能受限的一些设备中,协议格式上和前两者有一些区别。
MQTT比较简单,网上教程也非常多,比如下面链接就对相关的各种内容都介绍的比较详尽:
《MQTT 最全教程:从入门到精通 | EMQ》https://www.emqx.com/zh/mqtt-guide
MQTT在实际使用时往往是嵌入在应用程序代码中来使用的,不过很多时候也需要一些软件进行通讯测试使用,下面列出一些比较常用的软件。
MQTTX
主页:https://mqttx.app/zh
项目地址:https://github.com/emqx/MQTTX
Web客户端:https://mqttx.app/zh/web
命令行工具:https://mqttx.app/zh/cli
MQTT Explorer
主页:https://mqtt-explorer.com/
项目地址:https://github.com/thomasnordquist/MQTT-Explorer
MQTT因为服务器并不涉及具体的业务逻辑,所有很多情况下并不需要手动搭建服务器,很多云服务提供商都有提供MQTT服务,如果要测试使用的话通常使用免费的服务就够用了。当然也有一些本地的MQTT服务器软件可以用。
EMQX
主页:https://www.emqx.io/zh
项目地址:https://github.com/emqx/emqx
下载后解压得到程序,使用下面方式运行程序:
# 启动
.\bin\emqx start
# 查询运行状态
.\bin\emqx ctl status
# 停止
.\bin\emqx stop
EMQX启动后可以从浏览器打开管理面板 http://localhost:18083/
,默认用户名 admin
和默认密码 public
:
Eclipse Mosquitto
主页:https://mosquitto.org/
项目地址:https://github.com/eclipse/mosquitto
NanoMQ
主页:https://nanomq.io/
项目地址:https://github.com/emqx/nanomq
VerneMQ
主页:https://vernemq.com/
项目地址:https://github.com/vernemq/vernemq
大多数时候在应用程序中使用MQTT都是作为客户端来使用的,作为客户端使用最出名的项目就是 Eclipse Paho
了:
https://eclipse.dev/paho/
可以看到支持非常多的语言。
上面项目中对于JavaScript的支持仅限于Websocket通讯,而目前JS不光用在前端中,在后端也很流行,这时候可以使用下面的库在作为全功能的MQTT客户端使用:
https://github.com/mqttjs/MQTT.js
另外如果有作为服务器使用的需求的话我个人觉得使用Golang比较不错,下面是几个流行的库:
https://github.com/mochi-mqtt/server
https://github.com/DrmagicE/gmqtt
https://github.com/fhmq/hmq
MQTT比较简单,基本上有个服务器,找个客户端软件测试下消息收发就可以开始使用了。