mqttx截圖
mqtt sub (mqtt訂閱主題)
接下來我們試一下訂閱主題,使用多通配符來測試
先測試 “” 通配符,””比較特殊,應(yīng)用不能使用”$”開頭的系統(tǒng)主題!
按規(guī)范服務(wù)端不能將 $ 字符開頭的主題名匹配通配符 (#或+) 開頭的主題過濾器
由于應(yīng)用不能使用”**”開頭的系統(tǒng)主題所以 “broker.emqx.io” 不允許訂閱 “**SYS”, 但是為了測試我把我的mqtt服務(wù)器設(shè)置為允許訂閱,下圖示例使用我的mqtt服務(wù)器來進行測試。 如果您測試的時候發(fā)現(xiàn)訂閱失敗請查看您的mqtt服務(wù)器是否允許應(yīng)用訂閱”$”開頭的系統(tǒng)主題
我使用emqx服務(wù)端,當(dāng)訂閱 “$SYS/#” 時會觸發(fā)保留消息打印地址、應(yīng)用名、版本等信息
RyanMqtt訂閱結(jié)果
mqttx訂閱結(jié)果
再來測試 “/“、”#”、”+” 通配符
為了快速我就在一個主題里面使用多個通配符,發(fā)送符合不同通配符的消息來進行測試
訂閱主題:testdown/+/nihao/#
下圖中紅框發(fā)送的是符合訂閱主題通配符的,黑框是不符合訂閱主題通配符的。
可以看到RyanMqtt可以準(zhǔn)確的接收到通配符消息。
mqtt unsub (mqtt取消訂閱主題)
取消訂閱主題,取消沒訂閱的主題時會自動忽略。
可以看到取消訂閱后再發(fā)送消息,RyanMqtt就不會收到了
下圖第一個紅框為第一次取消可以觸發(fā)回調(diào),第二次取消就沒有任何響應(yīng)。
mqtt listsub (mqtt獲取已訂閱主題)
打印結(jié)果執(zhí)行順序為:
打印已訂閱主題 —> 訂閱”testdown/+/nihao/#”主題 —> 打印已訂閱主題 —> 訂閱”testdown2”主題 —> 打印已訂閱主題 —> 取消訂閱”testdown/+/nihao/#”主題 —> 打印已訂閱主題
mqtt listack (打印ack鏈表,輔助功能)
ack鏈表包含發(fā)送qos1 / qos2 的ack報文、接收qos1 / qos2 的ack報文、訂閱 / 取消訂閱主題的ack報文。
根據(jù)上面的描述可以知道 ack鏈表 通常都應(yīng)該為空。只有在上訴情況下才會存在,但是礙于篇幅這里無法進行測試了,等下一篇文章測試qos1 / qos2消息穩(wěn)定性時再進行展示
mqtt listmsg (打印msg鏈表,輔助功能)
msg鏈表保存著訂閱主題的信息,接收消息、取消訂閱的時候都會操作msg鏈表。
所以listmsg和listsub是一摸一樣的操作,結(jié)果自然也就一樣,這里就不展示了
mqtt data (打印測試信息用戶自定義的)
此接口我用來測試qos消息穩(wěn)定性,沒有實際意義。
4、將RyanMqtt添加到自己項目代碼里,不使用msh示例
上面我們使用msh示例來進行RyanMqtt的測試,但在項目中我們肯定不會通過msh來操作mqtt,所以我們將根據(jù)msh示例來將RyanMqtt添加到代碼里
首先我們思考下mqtt的執(zhí)行流程,根據(jù)示例來看我們需要
處理訂閱消息
連接mqtt服務(wù)器 —> 訂閱主題 —> 收到訂閱主題的消息 —> 在回調(diào)函數(shù)里面消費消息(調(diào)函數(shù)的執(zhí)行環(huán)境是mqtt客戶端的線程,所以非常不建議在回調(diào)函數(shù)里面做復(fù)雜邏輯操作,一是會阻塞mqtt線程運行,二是可能會導(dǎo)致mqtt線程爆棧。還是看使用場景如果需要串行處理mqtt消息在回調(diào)里面使用是挺好的)
發(fā)布消息
連接mqtt服務(wù)器 —> 發(fā)布主題消息(qos1 / qos2會有發(fā)送成功或者超過重發(fā)次數(shù)的回調(diào))
重連邏輯
配置mqtt客戶端自動重連 —> 連接服務(wù)器
不配置mqtt客戶端自動重連 —> 連接服務(wù)器 —> 獲取mqtt客戶端狀態(tài)(斷連狀態(tài)手動調(diào)用重連函數(shù))
根據(jù)上面的處理方式我們來進行代碼編寫,為了方便我都放在main函數(shù)了
這是原始main函數(shù),只設(shè)置了netdev狀態(tài)變更回調(diào)
先添加頭文件,如下圖
1、先添加連接服務(wù)器函數(shù),這里直接將msh示例中的connect函數(shù)復(fù)制到main.c,并處理報錯地方(自行處理都很簡單,都是資源未定義),圖片放不下我就不截圖了
2、再添加訂閱主題函數(shù),訂閱主要要等mqtt連接成功后。所以不管有沒有使能clearSession,都非常推薦在連接成功回調(diào)函數(shù)中訂閱主題 如下圖所示
3、再添加發(fā)布消息,這里簡單起見直接加個循環(huán),每10秒發(fā)送一個hello。(mqtt沒有連接成功時也可以發(fā)布但是mqtt客戶端不會進行處理,會直接丟棄不管qos等級) 如下圖所示
4、消費訂閱主題的消息,這里是直接打印出來消息的主題、報文id、載荷長度、載荷指針,推薦通過消息隊列發(fā)送到別的線程進行處理,或者您如果知道在回調(diào)函數(shù)處理的副作用的話可以在回調(diào)函數(shù)中直接處理
注:載荷指針最后一位沒有 “?”,可能會存在臟數(shù)據(jù),需要用戶手動處理。下圖給出一種處理方案
或者mqtt消息一般為json,可以使用RyanJson / cJSON來處理json數(shù)據(jù),都可以自動識別尾部臟數(shù)據(jù)
5、這樣我們就添加完成了,燒錄進行測試
如下面兩個圖所示,每秒上傳一次消息,接收到消息后進行打印出來。結(jié)果如我們所想
5、總結(jié)
這篇文章簡單介紹了RyanMqtt的使用,包括msh示例和添加到自己的工程代碼里面。但文章礙于篇幅限制介紹的始終很淺,想深入的了解還是要看代碼,RyanMqtt注釋都為中文。
接下來應(yīng)該還會寫兩篇文章介紹RyanMqtt,一篇進行RyanMqtt的qos1 / qos2消息等級的穩(wěn)定性測試,另一篇介紹下RyanMqtt移植指南
后面看要不要詳細介紹一下mqtt協(xié)議,RyanMqtt代碼倉庫docs/下有mqtt3.1.1協(xié)議中文版本pdf,一般來說看文檔就可以了。
以及mqtt5.0,5.0增加了很多激動人心的特性,在考慮要不要適配一下,看大家需求了,可能遙遙無期哈哈哈哈哈。
-
處理器
+關(guān)注
關(guān)注
68文章
19118瀏覽量
228867 -
接收機
+關(guān)注
關(guān)注
8文章
1179瀏覽量
53381 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
87瀏覽量
11530 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
97瀏覽量
5338
發(fā)布評論請先 登錄
相關(guān)推薦
評論