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