MQTT通信协议
定位:轻量级,面向物联网的应用。
主题订阅
通过主题进行分类的,本质上就是一个UTF-8的字符串,反斜杠代表层级
building-b/floor-5:代表B楼5层的设备。
+/floor-5:代表任何一个楼的5层的设备。
building-b/*:代表B楼所有的设备。
“sensors/temperature/home/kitchen”类似这种主题。
服务质量等级MQTT QoS
级别0:尽力而为。消息发送者会想尽办法发送消息,但是遇到意外并不会重试。
级别1:至少一次。消息接收者如果没有知会或者知会本身丢失,消息发送者会再次发送以保证消息接收者至少会收到一次,当然可能造成重复消息。
级别2:恰好一次。保证这种语义肯待会减少并发或者增加延时,不过丢失或者重复消息是不可接受的时候,级别2是最合适的。
级别2所提供的不重不丢很多情况下是最理想的,不过往返多次的确认一定对并发和延迟带来影响。级别1提供的至少一次语义在日志处理这种场景下是完全OK的,所以像Kafka这类的系统利用这一特点减少确认从而大大提高了并发。级别0适合鸡肋数据场景,食之无味弃之可惜,就这么着吧。
消息类型
MQTT拥有14种不同的消息类型:
CONNECT:客户端连接到MQTT代理
CONNACK:连接确认
PUBLISH:新发布消息
PUBACK:新发布消息确认,是QoS 1给PUBLISH消息的回复
PUBREC:QoS 2消息流的第一部分,表示消息发布已记录
PUBREL:QoS 2消息流的第二部分,表示消息发布已释放
PUBCOMP:QoS 2消息流的第三部分,表示消息发布完成
SUBSCRIBE:客户端订阅某个主题
SUBACK:对于SUBSCRIBE消息的确认
UNSUBSCRIBE:客户端终止订阅的消息
UNSUBACK:对于UNSUBSCRIBE消息的确认
PINGREQ:心跳
PINGRESP:确认心跳
DISCONNECT:客户端终止连接前优雅地通知MQTT代理
后面我们会给出具体的例子。
MQTT代理
市面上有相当多的高质量MQTT代理,其中mosquitto是一个开源的轻量级的C实现,完全兼容了MQTT 3.1和MQTT 3.1.1。下面我们就以mosquitto为例演示一下MQTT的使用。环境是百度开放云的云服务器以及Ubuntu 14.04.1 LTS,简单起见MQTT代理和客户端都安装在同一台云服务器上了。
首先SSH到云服务器,安装mosquitto以及搭配的客户端:apt-get install mosquitto
apt-get install mosquitto-clients
现在在云端模拟云服务,订阅某办公楼5层的温度作为主题:
mosquitto_sub -d -t 'floor-5/temperature'
Received CONNACK
Received SUBACK
Subscribed (mid: 1): 0
然后另外打开一个SSH连接,模拟温度计发送温度消息:
mosquitto_pub -d -t 'floor-5/temperature' -m '15'
Received CONNACK
Sending PUBLISH (d0, q0, r0, m1, 'floor-5/temperature', ... (2 bytes))
此时回到第一个SSH客户端可以看到信息已经接收到了,之后便是心跳消息:
Received PUBLISH (d0, q0, r0, m0, 'floor-5/temperature', ... (2 bytes))
15
Sending PINGREQ
Received PINGRESP
需要注意的是mosquitto客户端默认使用QoS 0,下面我们使用QoS 2订阅这个主题:
mosquitto_sub -d -q 2 -t 'floor-5/temperature'
Received CONNACK
Received SUBACK
Subscribed (mid: 1): 2
切换到另外SSH连接然后在这个主题里面发送温度消息:
mosquitto_pub -d -q 2 -t 'floor-5/temperature' -m '15'
Received CONNACK
Sending PUBLISH (d0, q2, r0, m1, 'floor-5/temperature', ... (2 bytes))
Received PUBREC (Mid: 1)
Sending PUBREL (Mid: 1)
Received PUBCOMP (Mid: 1)
此时回到第一个SSH客户端可以看到信息已经接收到了,以及相应的多次握手消息:
Received PUBLISH (d0, q2, r0, m1, 'floor-5/temperature', ... (2 bytes))
Sending PUBREC (Mid: 1)
Received PUBREL (Mid: 1)
15
Sending PUBCOMP (Mid: 1)
至此我们初步了解了MQTT的基本知识,祝大家在物联网的世界里面玩得开心!
mqtt是我实际用到的一个通信协议,这个协议蛮好的,可以跨网段通信,不需要vpn
起个引导作用也挺好的
对于mqtt这里只做了很简短的介绍