最近在協助公司硬件組進行MQTT協議的嵌入式SDK包開發。
簡述一下MQTT
MQTT簡單的來說是一種訂閱/發布模式的通信形式,一般分為客戶端和服務器端。
MQTT服務器端可以簡單理解為一個消息中轉站,也可稱作“消息中間件”。
MQTT是在TCP層面上封裝出的一種消息協議,所以如果從網絡底層看,依然是現需要建立基本的TCP連接,然后在進行MQTT的連接、消息傳遞等。
常規的通信形式是這樣的:
1、客戶端通過MQTT協議與服務器進行連接
2、客戶端告知服務端,自己需要監聽(訂閱)何種消息來源(主題)的信息
3、服務器收到客戶端的訂閱,進行記錄
4、如果客戶端需要主動告訴服務端一些信息,則發送自定義的指定主題,與相對應的消息告知服務器,服務器端的處理邏輯再進行相應處理
5、服務端如果想給客戶端發送消息,則向客戶端訂閱的主題發送相應的信息
由如上可知,MQTT的服務端可以實現,一次發送,告知多個訂閱相同主題的客戶端。即常見的手機信息推送。
手機推送可以理解為,某個APP向服務端訂閱了指定“主題”,服務端需要告知所有客戶端消息時候,只需要發送相應主題的信息即可。
非常的類似組播。
如果想實現兩個客戶端的相互通信,也可以使用MQTT,這是MQTT服務端類似與一個消息轉發器,接收兩邊的信息,並按照指定邏輯相互傳遞。
由於存在MQTT服務器這個消息中間商,所以在一般的網絡通信中,只要保證MQTT服務器的穩定在線,就可以保證所有客戶端之間的通信或者消息的推送。
所以,在實際的物聯網工程中,存在很多利用GPRS傳輸的設備或者惡劣的網絡條件,如果采用實時雙工通信的方式,很可能會遺漏實時數據。
如果采用了MQTT,設備即可在網絡恢復的情況下,補發歷時實時數據,由MQTT服務器進行儲存,並在網絡良好的情況下傳遞個下一個需要該數據的客戶端。
以上是對MQTT的粗淺理解。
附上這幾天的坑:
1、MQTT的客戶端發送的publish數據包如果存在“0000”,服務端會拒絕數據並且主動關閉連接
2、MQTT的服務器不能同時接到同一客戶端的兩次連接請求,否則會在連接第二次的時候主動關閉連接
3、千萬不要給板子的GPRS等裝置設置兩次MQTT服務端的IP端口,否則會出現坑2的情況,並會造成publish的數據包嚴重錯誤
4、善用wireshark,能幫你快速從tcp層面找到問題的所在
以上
轉自:http://www.xjdsz.net/archives/28.html