幾個MQTT的知識點


開始正文前需要感謝一下網友“小龍”和emqtt.io群里的網友們的幫助,本人剛剛開始使用MQTT有很多不懂的地方,在emqtt.io群里詢問解決方法的時候,“小龍”給我詳細的講解了一些MQTT的知識點並提供了解決方案,甚是感謝。本人覺得里面提到的一些東西對初學者還是很有用的,因此,在這里把我與“小龍”的聊天記錄整理一下供大家參考。

問題一:單片機緩存有限,處理能力有限的情況下,消息不可能一次發出,這種情況下要怎樣通過MQTT發布消息?

先組裝publish協議的頭,里面寫好payload的長度,通過tcp發出去,然后一點一點發payload。如果拿不到payload總長度,這個事情就難辦。因為你發了一個publish協議報,服務端讀到head里面的payload的長度之后,就會一直讀,讀到需要的長度,才算這個publish結束。所以,你的需求是首先確認你發布的內容的長度,然后組publish數據包頭,填寫payload長度,tcp:send(head),之后一段一段發送payload,比如一次1k,還是按照正常的tcp發送數據,一直發送完畢,就算這個publish結束了。接下來的send,都屬於tcp層的,這些不用你干預的。如果在tcp層,send失敗,那一定是socket有問題了,連接斷了,你就得重新連接mqtt服務器了,如果沒有發完,那么服務端的會話也會結束,就是說服務端也沒有接收到數據。重新連接,你就得重發,發送消息中途,只要斷掉,就得重連,是否要重發數據,取決於你是否保存了以前的數據。還有如果消息重要,可以使用qos=1或者2,可以確保服務端收到消息,qos=1需要一個來回,qos=2需要四個來回,qos=0非常簡單,只要send出去就不管了。

問題二:MQTT的開源資源多嗎?

http://www.mqtt.org里面很多

問題三:MQTT為什么一般不提供持久化的功能

mqtt協議里面是按照設備一直在線設計的,數據都是保存在內存里的

問題四:MQTT是不是很耗內存?

MQTT是比較吃內存的,emqtt的實測數據是:38W,內存占14G,CPU 15%

問題五:session與client之間的關系是怎樣的?

這樣的,比如你一個板子,作為客戶端,發起mqtt的連接請求connect到mqtt服務器,比如說就是emqtt服務吧,emqtt服務端收到這個板子的連接請求之后,在tcp層上會和板子建立一個tcp的連接,在emqtt內部,會產生一個進程,和這個板子做數據通訊,同時還會產生一個進程,叫session,這個sessoin是專門管理這個板子訂閱的主題,其它板子如果發布了這個板子感興趣的主題的時候,也會發到這個板子對應的這個session里面,如果這個session收到訂閱的主題之后,發現對用的client還活着,就通過這個client把數據經過tcp發到這個板子上,如果發現client已經沒有了,就是說板子和服務端斷掉了,那么session就會把收到的訂閱的主題,先保存在session里面,下次板子連接上了,而且cleansession=false,那么這個session就不會清除,在這次連接時,就會把以前收到的訂閱消息,發給板子,大概就是這個意思。

問題六:emqtt怎么知道連上來的client是同一個呢?

連接的時候,需要設置一個clientid,這個id可以不設置,如果不設置,在emqtt服務端會自動產生一個唯一的id,如果你要用到session,必須有一個唯一個id,你可以用imei。如果你一定要收到離線消息的話,就必須使用確定的id了。

問題七:emqtt的session時間可以修改嗎?

你可以改一下session的時間,現在是48小時,你可以改為一周,如果要永久,恐怕emqtt不太適合。

問題八:emqtt的訪問權限什么的都是寫在配置文件里的?

etc/acl.config

問題九:emqtt的分布式是怎么回事?

分布式簡單說就是把你的幾台服務器連在一起,里面任意一台或者多台,只要不是全壞了,emqtt都可以正常運行。emqtt的數據是在幾個節點共享的,某個節點出問題,數據是不會丟的,但是節點上的session數據會丟失。


免責聲明!

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



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