MQTT协议学习(八):简单实现设备状态获取

简单案例

1.1 设备

上位机(客户端)、代理(服务端)、传感器(客户端)001、002、003。

1.2 要求

上位机可以知道所有传感器的状态是在线还是离线。

1.3 分析

采用MQTT协议,利用遗嘱和保留消息搭配可以简单实现这个功能。配置如下:

  • 上位机:
    • 订阅主题 "s/#"QoS = 0
  • 传感器:
    • 遗嘱主题为对应传感器ID号 "s/00X",遗嘱内容 "0"QoS = 0retain = 1
    • 网络断开重连成功时,发布消息:主题 "s/00X",消息内容 "1"QoS = 0retain = 1

实现思路:

  1. 主题:每个传感器使用一个不同的主题防止冲突,这里选用设备编号"00X",前面再统一加上"s/"代表状态信息。上位机订阅带通配符的主题"s/#"接收所有的状态信息,通过主题中的设备编号区分不同设备。
  2. 消息内容:一个字节,用"0"表示离线,"1"表示在线
  3. 遗嘱:内容设置为"0",这样每次传感器网络断开时,代理都会发布遗嘱通知上位机传感器离线。retain = 1 保证在上位机网络断开时,重连后可以立即获取到传感器状态。(问题:此时即使传感器在线,上位机每次连接都仍会收到传感器离线的保留消息)
  4. 为了解决第3步的问题,传感器每次网络重连成功时,发布在线消息,并设置 retain = 1。此时在线消息会替换掉保留消息,如果上位机重连,收到的保留消息将会是在线。如果传感器离线,代理发布遗嘱时会自动更新保留消息为离线。
  5. QoS = 0时,通过遗嘱和保留消息已经可以满足需求。若设置Qos1、QoS2,反而会造成收到多条过时的状态消息,意义不大。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容