概述:
MQTT-SN 协议是 MQTT 的直系亲属,它使用 UDP 进行通信,标准的端口是 1884。MQTT-SN 的主要目的是为了适应受限的设备和网络,比如一些传感器,只有很小的内存和 CPU,TCP 对于这些设备来说非常奢侈。还有一些网络,比如 ZIGBEE,报文的长度在 300 字节以下,无法承载太大的数据包。所以 MQTT-SN 的数据包更小巧。
MQTT-SN 的官方标准下载地址: http://mqtt.org/new/wp-content/uploads/2009/06/MQTT-SN_spec_v1.2.pdf
MQTT-SN 与 MQTT对比,使用一张图介绍
有关QoS,MQTT-SN新增增加了哑客户端(QoS :-1)支持:
,一,网关的查询和发现
1,MQTT-SN客户端无须提前知道网关地址,接收网关的周期性广播好了,或直接广播一条网关查询;接收广播+主动查询,就够了,2,MQTT-SN对客户端/网关的乱入和丢失,处理的很好,备用网关在主网关挂掉之后即可转换为主网关,针对客户端而言,直接更新一个新的网关地址就可以
3,存在的若干网关可以互相协调彼此之间角色,互为主备stand-by,出现问题,主机下线维护,从机升级主机
二:清理会话
和MQTT 3.1协议类似,在上一次的客户端成功连接时在CONNECT中设置了清理会话标志clean session为false,遗嘱特性Will也为true,再次连接时,那么服务器为其缓存订阅数据和遗嘱数据是否已经被删除,对客户端不透明,因为就算是服务器因内存压力等清理了缓存,但没有通知到客户端,会造成订阅、遗嘱的误解。
三:主题标识符(Topic id)
确切来说,MQTT-SN协议存在三种格式主题名称(topic name),可由消息标志位包含TopicIdType属性决定:
0b01:预分配的主题标识符(topic id),16位自然数,0-65535范围
0b10:预分配的短主题名称(short topic name),只有两个字符表示
0b00:正常主题名称(topic name),可直接附加在REGISTER/SUBSCRIBE/WILLTOPICUPD消息对应字段中
所有主题被替换成标识符,在发布PUBLISH消息时,直接使用被指定的主题标识符topic id、short topic name即可。
四:MQTT-SN运行的协议栈
MQTT-SN可以运行在不同的无线协议上,只要可以满足MQTT-SN 所定义即可:支持双向数据传输和网关即可,MQTT-SN完全可以运行在其上面。
MQTT-SN可以在ZigBee、Bluetooth、RF、UDP、6loWPAN等底层协议层面运行。
五:配置参数
etc/plugins/emq_sn.conf:
mqtt.sn.port = 1884
mqtt.sn.advertise_duration = 900
mqtt.sn.gateway_id = 1
mqtt.sn.username = mqtt_sn_user
mqtt.sn.password = abc
启动:
./bin/emqttd_ctl plugins load emq_sn