轻量级发布订阅协议MQTT介绍。
MQTT协议
MQTT(消息队列遥测传输)是一个应用层协议,基于TCP/IP协议。使用发布-订阅模式用户客户端和其他端的通讯。
客户端可订阅一个或多个主题/topic, #用于多个主题, +用于单个.
广泛应用于物联网领域。
通常使用1883端口作为默认端口,如果开启SSL,TCP端口是8883。
服务等级
常用服务等级分为3级,级别越高,性能损耗越大,但同时可靠性越高。
- QoS = 0 - means one delivery at most,The receiver gets the message either once or not at all.
- QoS = 1 - means one delivery at least. 可能存在重复消息
- QoS = 2 - means one delivery exactly.
保活
MQTT客户端可以一直保持连接状态,即使不发布或接受任何消息。
但是Broker需要追踪哪些客户端还在连接,所以需要知道何时发送Last Will and Testament (LWT)消息给客户端。
这时候用到了keepalive时间,即每次客户端接受或发送一个消息时,broker重置一个计时器,如果计时器超过1.5倍的保活(keepalive)时间,则标记客户端为已断开并处理LWT。
为阻止低频率消息客户端被断开连接,broker会在计时器到达keepalive时间时发送PINGREQ包到客户端,如果收到客户端的PINGRESP回包,会重置计时器到0,代表客户端仍处于连接状态。
客户端
最常用的客户端应该是paho,对应各种常见语言的版本及安卓版,可以去官方仓库查找。
- Python: paho.mqtt.python
- Go:paho.mqtt.golang
- Java: paho.mqtt.java
GUI
- MQTT Explore
- MQTTX
Python客户端
pip install paho-mqtt
对于python客户端,连接时会遇到错误码,对应关系如下:
- 0: Connection successful
- 1: Connection refused - incorrect protocol version
- 2: Connection refused - invalid client identifier
- 3: Connection refused - server unavailable
- 4: Connection refused - bad username or password
- 5: Connection refused - not authorised
Java客户端
从mqtt收发必须实现接口IMqttClient,Paho库自带:
- MqttAsyncClient:异步实现
- MqttClient: 同步实现
用法
既然是订阅,最常用到的就是topic,其中通配符主题用 # 表示。
Server实现
扩展阅读
- MQTT
- Eclipse MQTT演示服务: mqtt.eclipse.org