MQTT研究之EMQ:【EMQX使用中的一些問題記錄(4)】


最近比較忙,有些關於EMQ的使用問題,沒有時間記錄了,趁這個周末抽點時間,將最近遇到的,覺得比較有價值的一個問題,分享給大家吧。

 

這里是針對前面的一篇博客,做的一個深入研究,關於訂閱系統總線判斷設備上線還是下線的補充研究。基於報文內容進行分析連接的細分信息,有一定的幫助。

 

 

1. 正常的連接

應用服務能夠訂閱到來自$SYS/brokers/+/clients/+/connected主題的數據。如下:這里能看到設備連接到那個EMQX節點,且知道設備端的配置信息,例如用戶名,是否cleansession,clientId等等。這里有一個能反應出設備正常連接的狀態字段connack,值為0表示正常連接上了。

Qos : 0, Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res10","connack":0,"ipaddress":"10.95.177.137","keepalive":60,"proto_name":"MQTT","proto_ver":4,"ts":1573542651092,"username":"water"}

當連接斷開時(前提是連接正常的連接進來了,即$SYS/brokers/+/clients/+/connected的主題上進來的數據,對應connack的值為0),訂閱了$SYS/brokers/+/clients/+/disconnected主題的應用服務,會收到報文如下。這里會發現,報文內容顯示了clientId,username以及斷開的原因和具體時間點。這里重點要說的是reason字段。下面這個報文顯示斷開的原因是normal,即正常斷開,我這里是基於MQTT.fx模擬的客戶端,點擊了disconnect按鈕實現的。

Qos : 0, Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/disconnected, ClientId: emqXmonitor
Sub : {"clientid":"res10","username":"water","reason":"normal","ts":1573542664914}
Qos : 0, Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res10","connack":0,"ipaddress":"10.95.177.137","keepalive":60,"proto_name":"MQTT","proto_ver":4,"ts":1573542687466,"username":"shihuc"}

下面這個斷開,就和上面那個disconnected的報文有點不同,主要是reason的內容不同,這里是closed,標識關閉。說明下,我這里是通過點擊MQTT.fx軟件右上角的紅色X實現的。

Qos : 0, Topic :$SYS/brokers/emqx@10.95.200.17/clients/res10/disconnected, ClientId: emqXmonitor
Sub : {"clientid":"res10","username":"shihuc","reason":"closed","ts":1573542804049}

 

2. 不正常的連接

注意啦,注意啦,這里是connected主題上的報文,顯示連接上來了,但是呢,看看connack字段的內容,不是0喲,說明這次連接不是正常的。現象也的確是沒有連接上來,因為我的mysql mqtt_user表里面沒有abc這個用戶,MQTT.fx顯示的連接失敗的原因是未授權用戶。

Qos : 0, Topic :$SYS/brokers/emqx@10.95.200.17/clients/res11/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res11","connack":135,"ipaddress":"10.95.177.137","keepalive":60,"proto_name":"MQTT","proto_ver":4,"ts":1573542986787,"username":"abc"}

下面這個connected消息,和上面的基本一樣,下面這個是未授權用戶(Not authorized to connect)對應的第二次connected報文。起初,按照我的理解,這里應該是disconnected報文,但是給MQTT官方的github上項目提的issue顯示,只有正常連接上線的設備,才會給他下發disconnected消息。否則只有connected消息,通過connack的內容進行細化區分。為何這里會出現兩次connected的消息呢?從paho的客戶端是可以看得出信息的,首先會從默認的MQTT V4開始

Qos : 0, Topic :$SYS/brokers/emqx@10.95.200.17/clients/res11/connected, ClientId: emqXmonitor
Sub : {"clean_start":true,"clientid":"res11","connack":135,"ipaddress":"10.95.177.137","keepalive":60,"proto_name":"MQIsdp","proto_ver":3,"ts":1573542986802,"username":"abc"}

 

3. 連接的狀態的協議說明

這里主要涉及的就是CONNACK這個消息了,參照協議,就不難理解上面報文中的connack的信息了。

我這里用的協議版本是MQTT的V3.1.1, 所以呢,將里面的重點內容摘抄出來,方便查看。一個結論,connack不是0的時候,就要注意是不是有什么問題了

 


免責聲明!

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



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