MQTT(Message Queuing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。
手机app,路由器,智能开关,智能插座,空气净化器,智能扫地机,智能锁都是mqtt客户端,一方面发布信息,同时订阅信息。
Mqtt协议实施要点:
1、mqtt节点。
服务器建立Mqttd作为消息broker。而每一个手机APP,每一台物联网设备,都是作为mqtt client客户端。
2、消息级别分三类。
发布者通过设置PUBLISH报文中的QoS标志位,对于客户端发布的消息提供三种服务质量等级,如下:
QoS=0,协议对此等级应用信息不要求回应确认,也没有重发机制,这类信息可能会发生消息丢失或重复,取决于TCP/IP提供的尽最大努力交互的数据包服务。
用作数据采集时,请设置QoS=0。
最少一次(At least once delivery):QoS=1,确保信息到达,但消息重复可能发生,发送者如果在指定时间内没有收到PUBACK控制报文,应用信息会被重新发送。
控制开关指令,QoS=1。设备IO状态变化上报(手工操作导致IO变化),QoS=1。
仅仅一次(Exactlyonce delivery):QoS=2,最高级别的服务质量,消息丢失和重复都是不可接受的。此消息的效率只有QoS=0的1%。小奇物联暂时不会使用此消息类型。
3、节点状态维护。
MQTT协议利用KeepAlive机制在客户端异常断开时发现问题。当客户端断开时(例如:电量耗尽、系统崩溃或者网络断开),代理服务器会采取相应措施通过相关订阅节点。
客户端设置“临终遗嘱”(LWT)信息后,当代理服务器检测到客户端离线后,就会发送保存在特定主题上的 LWT 信息,让其它订阅该主题的客户端知道该节点已经意外离线。每个设备节点必须发布LWT,APP节点和admin节点都要订阅。
wifi模块的订阅或发布mqtt topic消息,是由MCU通过串口发送AT指令来控制wifi模块完成的。Wifi模块+MCU组成一个mqtt client(节点)。MCU单片机是实际的功能节点,是插座、空气净化器等功能模块的主控CPU。
broker服务器只对设备和APP之间的消息进行中转,不进行识别处理。比如,APP远程开关插座消息,空气净化器采集的环境数据等,只转发不识别或存储。
服务器作为管理节点,需要维护设备的在线/离线状态,同时协助app和device建立通信。
Mqtt的 ClientID,由各client自行生成,比如app,就用user_id作为mqtt clientID。
各设备则用设备的mac地址作为clientID。
发布mqtt消息时,设备publish时,要让retain=1。App进行publish时,则让retain=0。
不管是app还是device,进行mqtt client连接的时候要设置:clean Session=true,这样离线消息就不会缓存,不能缓存离线消息,因为我们是要实时远程控制设备。
Admin实体协助建立device和app通信的过程也称为设备绑定过程,如下:
- device上电后,主动订阅admin相应的devid管理频道消息。
- App上电,主动订阅自己的user_id控制频道。app作为owner发起设备绑定请求,发起绑定前,主动订阅此设备的login和logout频道。
- Admin收到bind消息后,通过devid管理频道,将owner的频道告之device,device往此频道发送data消息。
- Admin不回复app绑定成功或失败。因为admin也不清楚,app收到device的data消息,就说明绑定成功,可以控制了。设备收到bind消息后,要立刻publish一条data消息,告之app。