Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
MQTT
原创征文
RyanMqtt QOS质量测试(二)
发布于 2023-09-28 14:51:06 浏览:879
订阅该版
[tocm] 上一篇文章介绍了RyanMqtt的基本使用,这次我们来对RyanMqtt的QOS消息质量稳定性进行测试。 **完整测试工程会放到文末** **测试环境:stm32F401RCT6、RT-Thread版本: v4.1.0、RT-Thread Studio版本: 2.2.6、网络硬件使用ec800m移植at_socket使用sal框架。** ## 1、测试介绍 *我移植的这个at驱动还不完善,**频繁发送消息时会导致网络断连**,打开调试进行一些延时就没问题了。但是断连的特性反而有助于我们进行qos测试。* 因为我们要测试断网后qos消息质量的稳定性,所以 **cleanSessionFlag(清除会话)必须为false ** 由于我们要测试**中途被mqtt服务器踢掉后的效果**,所以**示例使用的我的mqtt服务器**,您如果有兴趣测试这个的话请修改配置信息为您的服务器 要测试的功能如下图。都是发送20条消息。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/b7ae3cca05af631539d87349469286b8.png) ## 2、测试发布QOS1 / QOS2消息 #### 网络正常情况发送,发送qos1消息 打印日志上面红框表示RyanMqtt发布了多少条消息也就是 **RyanMqttPublish 接口回复ok的次数**,下面表示**真正完成发布了多少条** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/3b67b16c89afcf8ec8794997157733c5.png.webp) emqx截图,可以看到是20条。但细心的你肯定发现了发送的信息居然不是按顺序来的,这是因为emqx设置订阅的qos2主题,实际显示将会按照qos2完成时间来进行显示 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/60a60d0a49be27364a22c177fcd69f91.png.webp) #### 网络正常情况发送,发送qos2消息 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/e1ccfc5419cf452555ca56529a484267.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/5f8b6011fcb7a78e08d624b469c03bc8.png.webp) #### 模拟发送中途断网,发送qos1消息 ***这里模拟的意思是:发送第5条的时候把网络硬件进行关闭,发送第10条时启动网络硬件,观察发布消息和实际消息是否对得上号*** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/eae297c5a97a1bea576c03c3b9004136.png) ***看上面日志咱们发送了12条,emqx为什么会收到13条呢?*** 这就是qos1的特性了,**允许至少一次的重复接收**,咱们断网重新连接的时候根据qos1的特性咱们是可以重新发送的。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/11a2ce08f51c6b9537d4c29b87eb2037.png.webp) #### 模拟发送中途断网,发送qos2消息 ***这里模拟的意思是:发送第5条的时候把网络硬件进行关闭,发送第10条时启动网络硬件,观察发布消息和实际消息是否对得上号*** 这里我们就遇到了开头说的ec800m驱动问题,qos2需要较多的网络交互,**ec800直接罢工**了。 但是等它重连后我们可以发现,**qos2的消息依然可以稳定保证只有一次**。(之前我自己进行的测试要比这严谨的多,会考虑到多次断网情况等) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/d7b53ca68ecb5b6da3c0fd87818c5a21.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/33216e8bddeff33aa4551d3e80973c2d.png.webp) #### 模拟发送中途被踢,发送qos1消息 ***模拟中途被踢:发送20条,在中间的时候手动通过mqtt管理后台把RyanMqtt客户端踢掉*** 这个测试真考验手速啊,试了4次才成功😬。 可以看到发送到15条的时候被mqtt服务器给踢掉了,等待重连后可以正常同步 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/1aed7f79e610e326f80a9f46a2de0205.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/99d0af927ba5ac2dc6ce2b9de905a5d3.png.webp) #### 模拟发送中途被踢,发送qos2消息 ***模拟中途被踢:发送20条,在中间的时候手动通过mqtt管理后台把RyanMqtt客户端踢掉*** 可以看到**发送了15条,但是收到了21条!是bug吗?**其实不然,这主要是**emqx服务器的策略问题**,因为是**主动剔除emqx服务器会清除会话上下文,导致qos2消息多接收**。 所以说重大风险的环境,**一定不要只依靠qos2**,太多因素会导致意料之外的结果。**一定要通过应用层来保证最终一致性** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/b97f5cf48a918baf8b9906f923759680.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/2caa2bf99f908658ced37b1acbd0fb8b.png.webp) ## 2、测试订阅QOS1 / QOS2消息 ***为了方便观察效果,我们使用emqx的脚本功能,给所有发送消息尾部加一个0 - 1000的随机值。方便观察消息接收情况。*** 脚本如下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/4911c9e42d76a8235b3ae423b4a6e55d.png.webp) #### 网络正常情况接收,接收qos1消息 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/6fac76afdf073a92eb020d3ede07bce2.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/e3f9ead53707ba6d234039893d99ddc8.png.webp) #### 网络正常情况接收,接收qos2消息 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/fc33fc325fb9403706c2a7ac6d9b1a73.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/812c4f781e2f8a908e66a1a316b6f9f1.png.webp) #### 模拟接收中途断网,接收qos1消息 ***实验条件:使用mqttx上位机发布10条消息,RyanMqtt收到第5条后重启网络硬件,看联网后是否可以接收到消息*** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/759584827de761a58a64e31ffffdb06c.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/a3ab9316cbb758cba57315da676136a5.png.webp) #### 模拟接收中途断网,接收qos2消息 ***实验条件:使用mqttx上位机发布10条消息,RyanMqtt收到第5条后重启网络硬件,看联网后是否可以接收到消息*** ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/52ecd2c012b0ebc2f13d50c729cf79b0.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230928/a3da0b5309666cae050d4497b690b2b6.png.webp) #### 模拟接收中途被踢,接收qos1消息 #### 模拟接收中途被踢,接收qos2消息 ***实验条件:我使用mqttx的自动发送功能,一秒发一条。发送20条消息,当发送5 - 10条后从emqx服务器剔除RyanMqtt客户端*** 尴尬的发现没法测试,上面测试发布消息剔除的时候说过**emqx服务器的剔除会清除会话信息**,清除后会话信息,虽然RyanMqtt依然保留着订阅主题信息,但是emq服务器的订阅信息不存在了。 所以**不管有没有使能clearSession,都非常推荐在连接成功回调函数中订阅主题** ## 3、总结 这篇文章简单测试了RyanMqtt的消息质量稳定性,但依然很基础。 真实的网络环境可能会具复杂,欢迎有兴趣的同学进行测试
20
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Ryan_CW
这家伙很懒,什么也没写!
文章
9
回答
69
被采纳
13
关注TA
发私信
相关文章
1
umqtt 软件包使用后,连接上emqx服务器,过一会儿就掉线了
2
使用正点原子的 潘多拉 开发板 的例程19_iot_mqtt
3
mqtt软件包,不支持直接关闭?
4
kawaii_mqtt 申请内存崩溃
5
_signal_entry() 函数中dbg_enter在哪里定义呢?
6
start to connect mqtt server 失败
7
MQTT 在“ read 0:1, break “后断开重连
8
paho_mqtt线程相关疑问
9
RT thread studio kawaii mqtt 无法连接EMQ
10
调试bc26 ,断言错误failed at rt_thread_timeout
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部