開始正文前需要感謝一下網友“小龍”和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資料會丟失。