$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的訂閱頁面查看是否成功訂閱了系統消息。