• 从零开始搭建物联网平台(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的订阅页面查看是否成功订阅了系统消息。

  • 相关阅读:
    java线程池源码阅读
    websocketcometd源码阅读基于注解初始化(三)
    websocketcometd源码阅读与spring整合初始化(四)
    cometd源码阅读初始化(二)
    cometd源码阅读WebSocketTransport普通消息处理过程(八)
    websocketcometd源码阅读transport(五)
    一.安装软件
    GitHub一篇文章系列
    JavaJVM调优jstack找出最耗cpu的线程&定位问题代码
    Git总目录
  • 原文地址:https://www.cnblogs.com/FanMLei/p/10500986.html
Copyright © 2020-2023  润新知