MQTT的知識點

2021-09-07 18:37:40 字數 1346 閱讀 3940

先組裝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是比較吃記憶體的,emqtt的實測資料是:38w,記憶體佔14g,cpu 15%

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

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

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

etc/acl.config

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

TestLink知識點Mantis知識點

testlink知識點 1 testlink系統提供了六種角色 a guest 只有讀的許可權,適合於檢視測試用例和測試需求,以及專案分析的使用者。b testdesigner 可以開展測試用例和測試需求的所有工作。c tester 只能執行測試用例。d senior tester 可以檢視和維護測...

python大一知識點 python知識點複習

放假歸來,這幾天複習了一下好久不用的python,總結了一下知識點。語法基礎tuple與list的異同都由多個元素組成 tuple由 組成,list由組成 tuple不可變,list可變 tuple表示的是一種結構,而list表示的是多個事物的集合 tuple操作比list快 字串用法要點 轉義符和...

mysql常用知識點 mysql 常用知識點。

mysql u root p show databases show tables select from abc order by id limit 0,10 create database bbb exit mysqldump u root p game home backup.sql mysq...