简单案例
1.1 设备
上位机(客户端)、代理(服务端)、传感器(客户端)001、002、003。
1.2 要求
上位机可以知道所有传感器的状态是在线还是离线。
1.3 分析
采用MQTT协议,利用遗嘱和保留消息搭配可以简单实现这个功能。配置如下:
- 上位机:
- 订阅主题 "s/#",QoS = 0。
- 传感器:
- 遗嘱主题为对应传感器ID号 "s/00X",遗嘱内容 "0",QoS = 0,retain = 1。
- 网络断开重连成功时,发布消息:主题 "s/00X",消息内容 "1",QoS = 0,retain = 1。
实现思路:
- 主题:每个传感器使用一个不同的主题防止冲突,这里选用设备编号"00X",前面再统一加上"s/"代表状态信息。上位机订阅带通配符的主题"s/#"接收所有的状态信息,通过主题中的设备编号区分不同设备。
- 消息内容:一个字节,用"0"表示离线,"1"表示在线
- 遗嘱:内容设置为"0",这样每次传感器网络断开时,代理都会发布遗嘱通知上位机传感器离线。retain = 1 保证在上位机网络断开时,重连后可以立即获取到传感器状态。(问题:此时即使传感器在线,上位机每次连接都仍会收到传感器离线的保留消息)
- 为了解决第3步的问题,传感器每次网络重连成功时,发布在线消息,并设置 retain = 1。此时在线消息会替换掉保留消息,如果上位机重连,收到的保留消息将会是在线。如果传感器离线,代理发布遗嘱时会自动更新保留消息为离线。
- 当QoS = 0时,通过遗嘱和保留消息已经可以满足需求。若设置Qos1、QoS2,反而会造成收到多条过时的状态消息,意义不大。