从零开始搭建物联网平台(4):订阅系统主题获取设备上下线消息

$SYS-系统主题

先来看一段EMQ对于系统主题的介绍:EMQ 消息服务器周期性发布自身运行状态、MQTT 协议统计、客户端上下线状态到 $SYS/ 开头系统主题。$SYS 主题路径以 “$SYS/brokers/{node}/” 开头,’${node}’ 是 Erlang 节点名称

系统主题主要包括一下几大部分:
               1 :服务器版本、启动时间与描述消息
               2 :MQTT 客户端上下线状态消息
               3 :系统统计消息

详细的介绍请看EMQ官方文档:http://www.emqtt.com/docs/v2/guide.html#sys,就目前来说呢好像只有上下线状态有点用,另外两个以后要是用到了在详细说明。

客户端上下线状态消息的$SYS 主题前缀为: $SYS/brokers/${node}/clients/,可选择具体客户端${clientid}/connected的上下线消息,也可以选择所有设备的上下线消息:#,这里选择接收说有设备的上下线消息,那么需要订阅的主题为$SYS/brokers/emq@127.0.0.1/clients/#

修改访问控制规则

EMQ默认情况下只有本地的dashboard才能订阅系统消息,因此还需要对EMQ配置做一些修改。方法很简单,以linux系统为例,首先进入到/etc/emqttd/目录下,找到acl.conf文件, 使用vim打开编辑

在文本末尾增加{allow, all, subscribe, ["$SYS/brokers/+/clients/#"]}.  这一行的意思就是允许所有设备订阅$SYS/brokers/+/clients/#主题,也就是所有设备都能获取到其他设备的上下线消息,这里只是为了测试方便,以后为了安全考虑这部分可能会做出修改,保存退出,使用emqttd restart命令重启mqtt服务,至此控制访问规则的编辑完成。

测试代码

这里我使用python进行编写,用的了paho-mqtt库实现mqtt通信,因为代码不是很复杂,暂时先不展看说明paho-mqtt的使用。通过订阅$SYS/brokers/emq@127.0.0.1/clients/#主题即可接收到其他设备上下线的消息

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe("$SYS/brokers/emq@127.0.0.1/clients/#")

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client(client_id='python_test')
client.username_pw_set('admin', '123456')  # 设置连接用户名
client.on_connect = on_connect
client.on_message = on_message

client.connect("123.207.87.193", 1883, 60)

client.loop_forever()

运行这段代码,然后呢使用EMQ提供的websocket方式新建一个连接然后断开,看一下在控制台是否能够接收到上下线消息。如果成功将收到分别是上线和下线两条消息,不成功的话那就先在Dashboard的订阅页面查看是否成功订阅了系统消息。

原文地址:https://www.cnblogs.com/FanMLei/p/10500986.html