【MQTT】常见问题
MQTT常见问题
总结在物联网开发过程中,使用MQTT需要注意的一些问题。
ClientID属性
每个MQTT客户端连接MQTT的服务端的时候,一定要设置一个容易辨别的clientid属性,用来唯一标识客户端,不建议使用默认生成的随机clientid,没有任何语义信息。
保留消息
当mqtt的客户端不在线时,可以通过发送保留消息,使得客户端上线后能收到该保留消息。如果发送的是普通消息,且会话已失效,则消息会丢失。但是保留消息有一个问题,同一个Topic下,最多只保留一个消息,新的保留消息会替换旧的保留消息。
clear_session设置
MQTT的客户端将clear_session=true时,客户端在连接上MQTT服务端时,MQTT服务端会清除之前与客户端的会话信息。反之,如果设置成false,则不清理会话,那么即使MQTT客户端掉电下线了,在会话没有过期的这段时间内,MQTT服务端也会保留收到的消息,当客户端重新上线时能收到离线期间丢失的消息。大家需要根据业务需要,合理的设置clear_session值。
注意:如果设置clear_session=false,不清理会话,一定要将MQTT的clientid设置成一个唯一不变的值,因为MQTT服务端通过clientid来识别是哪个客户端的会话。
如何确定客户端上线和下线
2种方法:
1、EMQX中,可以通过监听系统主题接受某个客户端的上线和下线消息。
2、自定义设备上线和下线消息,如果设备突然掉线,可以通过遗嘱消息来确定下线。
服务器集群时如何订阅主题
使用EMQX作为MQTT服务端时,如果服务器是多副本部署,那么为了保证设备的一个mqtt消息只会被一个服务器消费,则服务器订阅主题的时候一定要使用共享订阅,通过在订阅的主题前面增加前缀来实现。
前缀格式 | 示例 | 前缀 | 真实主题名 |
---|---|---|---|
带群组格式 | $share/abc/t/1 | $share/abc/ | t/1 |
不带群组格式 | $queue/t/1 | $queue/ | t/1 |
带群租的 $share/abc/t/1,其中abc表示组名,订阅者属于abc组,abc组内只会有一个订阅者收到消息。不带群组,就相当于订阅者在一个默认组内,该组内只会存在一个订阅者收到消息。