什么是MQTT
MQTT 协议 是基于发布/订阅模式的物联网通信协议,构建于TCP/IP协议之上。凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山:
broker和client
前面提到,MQTT是基于发布订阅模式的,client从角色上,可以分为publisher 和 subscriber,一个client可以同时作为publisher 和 subscriber,也可以只扮演其中一个角色。publisher可以发布一条消息,subscriber可以订阅一条消息,具体要订阅什么类型的消息,用topic来标记。以下图为例,speed就是topic,汽车是publisher,手机和服务器是subscriber。topic可以有多种类型,比如汽车的油量也可以作为topic。client之间并不会直接通信,他们通过中间媒介: broker。
broker 可以理解为http 中的 server,它用来处理 client 之间的消息,它将publisher发布的消息进行筛选,并转发给订阅了这条消息的subscribers
MQTT的实现
由于MQTT分为broker和client,因此实现上也分为 broker 和 client 实现。
client实现
python: Paho Python client
Node.js/浏览器 (mqtt.js)[https://github.com/mqttjs/MQTT.js]
Arduino (PubsubClient)[https://pubsubclient.knolleary.net/]
broker 实现
broker的实现有 Mosquitto, hiveMQ, Aedes等,相关详情可以查看 http://www.steves-internet-guide.com/mqtt-hosting-brokers-and-servers/
发布订阅 topic
前面说到,client可以是发布者和订阅者,那么要订阅哪些消息类型,则由topic来决定。topic是用来给broker过滤消息用的,当一个publisher 发布了一个消息时,broker就可以根据订阅了这个topic的subscriber,然后把这条消息通知到他们。
topic的命名规则与url的命名有点像,通过'/'来划分topic的层级:
topic的命名规则比较宽松,包含至少一个字符即可,甚至/
也是一个合法的topic,另外topic是大小写敏感的,home
和Home
是两个不同的topic。
topic还支持通配符。
Qos
Qos即消息服务质量,MQTT 设计了 3 个 QoS 等级。
QoS 0:消息最多传递一次,如果当时客户端不可用,则会丢失该消息。
QoS 1:消息传递至少 1 次,可能会出现消息重复。
QoS 2:消息仅传送一次。
显然,服务质量的 级别越高,需要ack的次数就越多,流程越复杂,系统资源消耗越大。应用程序可以根据自己的网络场景和业务需求,选择合适的 QoS 级别。
** 参考 **