測試環(huán)境:stm32F401RCT6、RT-Thread版本: v4.1.0、RT-Thread Studio版本: 2.2.6、網(wǎng)絡(luò)硬件使用ec800m移植at_socket使用sal框架。
1、測試介紹
我移植的這個at驅(qū)動還不完善,頻繁發(fā)送消息時會導(dǎo)致網(wǎng)絡(luò)斷連,打開調(diào)試進行一些延時就沒問題了。但是斷連的特性反而有助于我們進行qos測試。
因為我們要測試斷網(wǎng)后qos消息質(zhì)量的穩(wěn)定性,所以 cleanSessionFlag(清除會話)必須為false
由于我們要測試中途被mqtt服務(wù)器踢掉后的效果,所以示例使用的我的mqtt服務(wù)器,您如果有興趣測試這個的話請修改配置信息為您的服務(wù)器
要測試的功能如下圖。都是發(fā)送20條消息。
2、測試發(fā)布QOS1 / QOS2消息
網(wǎng)絡(luò)正常情況發(fā)送,發(fā)送qos1消息
打印日志上面紅框表示RyanMqtt發(fā)布了多少條消息也就是 RyanMqttPublish 接口回復(fù)ok的次數(shù),下面表示真正完成發(fā)布了多少條
emqx截圖,可以看到是20條。但細(xì)心的你肯定發(fā)現(xiàn)了發(fā)送的信息居然不是按順序來的,這是因為emqx設(shè)置訂閱的qos2主題,實際顯示將會按照qos2完成時間來進行顯示
網(wǎng)絡(luò)正常情況發(fā)送,發(fā)送qos2消息
模擬發(fā)送中途斷網(wǎng),發(fā)送qos1消息
這里模擬的意思是:發(fā)送第5條的時候把網(wǎng)絡(luò)硬件進行關(guān)閉,發(fā)送第10條時啟動網(wǎng)絡(luò)硬件,觀察發(fā)布消息和實際消息是否對得上號
看上面日志咱們發(fā)送了12條,emqx為什么會收到13條呢?
這就是qos1的特性了,允許至少一次的重復(fù)接收,咱們斷網(wǎng)重新連接的時候根據(jù)qos1的特性咱們是可以重新發(fā)送的。
模擬發(fā)送中途斷網(wǎng),發(fā)送qos2消息
這里模擬的意思是:發(fā)送第5條的時候把網(wǎng)絡(luò)硬件進行關(guān)閉,發(fā)送第10條時啟動網(wǎng)絡(luò)硬件,觀察發(fā)布消息和實際消息是否對得上號
這里我們就遇到了開頭說的ec800m驅(qū)動問題,qos2需要較多的網(wǎng)絡(luò)交互,ec800直接罷工了。
但是等它重連后我們可以發(fā)現(xiàn),qos2的消息依然可以穩(wěn)定保證只有一次。(之前我自己進行的測試要比這嚴(yán)謹(jǐn)?shù)亩?,會考慮到多次斷網(wǎng)情況等)
模擬發(fā)送中途被踢,發(fā)送qos1消息
模擬中途被踢:發(fā)送20條,在中間的時候手動通過mqtt管理后臺把RyanMqtt客戶端踢掉
這個測試真考驗手速啊,試了4次才成功。
可以看到發(fā)送到15條的時候被mqtt服務(wù)器給踢掉了,等待重連后可以正常同步
模擬發(fā)送中途被踢,發(fā)送qos2消息
模擬中途被踢:發(fā)送20條,在中間的時候手動通過mqtt管理后臺把RyanMqtt客戶端踢掉
可以看到發(fā)送了15條,但是收到了21條!是bug嗎?其實不然,這主要是emqx服務(wù)器的策略問題,因為是主動剔除emqx服務(wù)器會清除會話上下文,導(dǎo)致qos2消息多接收。
所以說重大風(fēng)險的環(huán)境,一定不要只依靠qos2,太多因素會導(dǎo)致意料之外的結(jié)果。一定要通過應(yīng)用層來保證最終一致性
2、測試訂閱QOS1 / QOS2消息
為了方便觀察效果,我們使用emqx的腳本功能,給所有發(fā)送消息尾部加一個0 - 1000的隨機值。方便觀察消息接收情況。
腳本如下
網(wǎng)絡(luò)正常情況接收,接收qos1消息
網(wǎng)絡(luò)正常情況接收,接收qos2消息
模擬接收中途斷網(wǎng),接收qos1消息
實驗條件:使用mqttx上位機發(fā)布10條消息,RyanMqtt收到第5條后重啟網(wǎng)絡(luò)硬件,看聯(lián)網(wǎng)后是否可以接收到消息
模擬接收中途斷網(wǎng),接收qos2消息
實驗條件:使用mqttx上位機發(fā)布10條消息,RyanMqtt收到第5條后重啟網(wǎng)絡(luò)硬件,看聯(lián)網(wǎng)后是否可以接收到消息
模擬接收中途被踢,接收qos1消息
模擬接收中途被踢,接收qos2消息
實驗條件:我使用mqttx的自動發(fā)送功能,一秒發(fā)一條。發(fā)送20條消息,當(dāng)發(fā)送5 - 10條后從emqx服務(wù)器剔除RyanMqtt客戶端
尷尬的發(fā)現(xiàn)沒法測試,上面測試發(fā)布消息剔除的時候說過emqx服務(wù)器的剔除會清除會話信息,清除后會話信息,雖然RyanMqtt依然保留著訂閱主題信息,但是emq服務(wù)器的訂閱信息不存在了。
所以不管有沒有使能clearSession,都非常推薦在連接成功回調(diào)函數(shù)中訂閱主題。
-
接收機
+關(guān)注
關(guān)注
8文章
1158瀏覽量
53171 -
上位機
+關(guān)注
關(guān)注
27文章
927瀏覽量
54551 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1239瀏覽量
39435 -
STM32F401
+關(guān)注
關(guān)注
1文章
16瀏覽量
10435 -
MQTT協(xié)議
+關(guān)注
關(guān)注
0文章
93瀏覽量
5308
發(fā)布評論請先 登錄
相關(guān)推薦
評論