從零開始搭建物聯網平台(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的訂閱頁面查看是否成功訂閱了系統消息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM