0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RyanMqtt使用介绍和示例代码(2)

冬至子 来源:Ryan_CW 作者:Ryan_CW 2023-09-28 10:24 次阅读

mqttx截图

1.jpg

mqtt sub (mqtt订阅主题)

接下来我们试一下订阅主题,使用多通配符来测试

先测试 “” 通配符,””比较特殊,应用不能使用”$”开头的系统主题!
按规范服务端不能将 $ 字符开头的主题名匹配通配符 (#或+) 开头的主题过滤器

由于应用不能使用”**”开头的系统主题所以 “broker.emqx.io” 不允许订阅 “**SYS”, 但是为了测试我把我的mqtt服务器设置为允许订阅,下图示例使用我的mqtt服务器来进行测试。 如果您测试的时候发现订阅失败请查看您的mqtt服务器是否允许应用订阅”$”开头的系统主题

我使用emqx服务端,当订阅 “$SYS/#” 时会触发保留消息打印地址、应用名、版本等信息

RyanMqtt订阅结果

1.jpg

mqttx订阅结果

1.jpg

再来测试 “/“、”#”、”+” 通配符
为了快速我就在一个主题里面使用多个通配符,发送符合不同通配符的消息来进行测试
订阅主题:testdown/+/nihao/#

下图中红框发送的是符合订阅主题通配符的,黑框是不符合订阅主题通配符的。
可以看到RyanMqtt可以准确的接收到通配符消息。

1.jpg

1.jpg

mqtt unsub (mqtt取消订阅主题)
取消订阅主题,取消没订阅的主题时会自动忽略。

可以看到取消订阅后再发送消息,RyanMqtt就不会收到了

下图第一个红框为第一次取消可以触发回调,第二次取消就没有任何响应。

1.jpg

1.jpg

mqtt listsub (mqtt获取已订阅主题)
打印结果执行顺序为:

打印已订阅主题 —> 订阅”testdown/+/nihao/#”主题 —> 打印已订阅主题 —> 订阅”testdown2”主题 —> 打印已订阅主题 —> 取消订阅”testdown/+/nihao/#”主题 —> 打印已订阅主题

1.jpg

mqtt listack (打印ack链表,辅助功能)
ack链表包含发送qos1 / qos2 的ack报文、接收qos1 / qos2 的ack报文、订阅 / 取消订阅主题的ack报文。
根据上面的描述可以知道 ack链表 通常都应该为空。只有在上诉情况下才会存在,但是碍于篇幅这里无法进行测试了,等下一篇文章测试qos1 / qos2消息稳定性时再进行展示

1.jpg

mqtt listmsg (打印msg链表,辅助功能)
msg链表保存着订阅主题的信息,接收消息、取消订阅的时候都会操作msg链表。
所以listmsg和listsub是一摸一样的操作,结果自然也就一样,这里就不展示了

mqtt data (打印测试信息用户自定义的)
接口我用来测试qos消息稳定性,没有实际意义。

4、将RyanMqtt添加到自己项目代码里,不使用msh示例
上面我们使用msh示例来进行RyanMqtt的测试,但在项目中我们肯定不会通过msh来操作mqtt,所以我们将根据msh示例来将RyanMqtt添加到代码里
首先我们思考下mqtt的执行流程,根据示例来看我们需要

处理订阅消息
连接mqtt服务器 —> 订阅主题 —> 收到订阅主题的消息 —> 在回调函数里面消费消息(调函数的执行环境是mqtt客户端的线程,所以非常不建议在回调函数里面做复杂逻辑操作,一是会阻塞mqtt线程运行,二是可能会导致mqtt线程爆栈。还是看使用场景如果需要串行处理mqtt消息在回调里面使用是挺好的)

发布消息
连接mqtt服务器 —> 发布主题消息(qos1 / qos2会有发送成功或者超过重发次数的回调)

重连逻辑

配置mqtt客户端自动重连 —> 连接服务器
不配置mqtt客户端自动重连 —> 连接服务器 —> 获取mqtt客户端状态(断连状态手动调用重连函数)
根据上面的处理方式我们来进行代码编写,为了方便我都放在main函数了

这是原始main函数,只设置了netdev状态变更回调

1.jpg

先添加头文件,如下图

1.jpg

1、先添加连接服务器函数,这里直接将msh示例中的connect函数复制到main.c,并处理报错地方(自行处理都很简单,都是资源未定义),图片放不下我就不截图了

2、再添加订阅主题函数,订阅主要要等mqtt连接成功后。所以不管有没有使能clearSession,都非常推荐在连接成功回调函数中订阅主题 如下图所示

1.jpg

3、再添加发布消息,这里简单起见直接加个循环,每10秒发送一个hello。(mqtt没有连接成功时也可以发布但是mqtt客户端不会进行处理,会直接丢弃不管qos等级) 如下图所示

1.jpg

4、消费订阅主题的消息,这里是直接打印出来消息的主题、报文id、载荷长度、载荷指针,推荐通过消息队列发送到别的线程进行处理,或者您如果知道在回调函数处理的副作用的话可以在回调函数中直接处理

注:载荷指针最后一位没有 “�”,可能会存在脏数据,需要用户手动处理。下图给出一种处理方案
或者mqtt消息一般为json,可以使用RyanJson / cJSON来处理json数据,都可以自动识别尾部脏数据

1.jpg

5、这样我们就添加完成了,烧录进行测试
如下面两个图所示,每秒上传一次消息,接收到消息后进行打印出来。结果如我们所想

1.jpg

1.jpg

5、总结
这篇文章简单介绍了RyanMqtt的使用,包括msh示例和添加到自己的工程代码里面。但文章碍于篇幅限制介绍的始终很浅,想深入的了解还是要看代码,RyanMqtt注释都为中文。

接下来应该还会写两篇文章介绍RyanMqtt,一篇进行RyanMqtt的qos1 / qos2消息等级的稳定性测试,另一篇介绍下RyanMqtt移植指南

后面看要不要详细介绍一下mqtt协议,RyanMqtt代码仓库docs/下有mqtt3.1.1协议中文版本pdf,一般来说看文档就可以了。
以及mqtt5.0,5.0增加了很多激动人心的特性,在考虑要不要适配一下,看大家需求了,可能遥遥无期哈哈哈哈哈。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18283

    浏览量

    222166
  • 接收机
    +关注

    关注

    8

    文章

    1122

    浏览量

    52642
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11455
  • MQTT协议
    +关注

    关注

    0

    文章

    90

    浏览量

    5223
收藏 人收藏

    评论

    相关推荐

    RyanMqtt使用介绍示例代码(1)

    此步骤不做过多解释,是lwip就用lwip,是at设备就用at_socket。推荐所有平台都使用SAL框架(RyanMqtt软件包会自动使能)。
    的头像 发表于 09-28 10:09 976次阅读
    <b class='flag-5'>RyanMqtt</b>使用<b class='flag-5'>介绍</b>和<b class='flag-5'>示例</b><b class='flag-5'>代码</b>(1)

    RyanMqtt实现MQTT3.1.1协议的客户端

    还没有同步到packages库列表,暂时还无法在软件包列表搜索到。提pr应该3天了…….介绍RyanMqtt 实现了 MQTT3.1.1 协议的客户端。此库针对资源受限的嵌入式设备进行了优化。初衷:在
    发表于 12-01 15:19

    excel vba代码 示例讲解

    excel vba代码 示例讲解
    发表于 09-07 09:36 24次下载
    excel vba<b class='flag-5'>代码</b> <b class='flag-5'>示例</b>讲解

    MSP430F23x0示例代码

    MSP430F23x0示例代码
    发表于 05-02 17:11 8次下载
    MSP430F23x0<b class='flag-5'>示例</b><b class='flag-5'>代码</b>

    python代码示例之基于Python的日历api调用代码实例

    本文档的主要内容详细介绍的是python代码示例之基于Python的日历api调用代码实例。
    发表于 09-06 14:25 42次下载
    python<b class='flag-5'>代码</b><b class='flag-5'>示例</b>之基于Python的日历api调用<b class='flag-5'>代码</b>实例

    ESP-NOW技术的介绍和使用方式及示例代码资料免费下载

    本文介绍了乐鑫自主研发的ESP-NOW技术,说明了使用方式并提供了示例代码包括了:1.ESP-NOW技术简介,2.ESP-NOW使用方式,3.示例
    发表于 03-15 08:00 58次下载
    ESP-NOW技术的<b class='flag-5'>介绍</b>和使用方式及<b class='flag-5'>示例</b><b class='flag-5'>代码</b>资料免费下载

    Arduino雨滴传感器的使用示例代码免费下载

    本文档的主要内容详细介绍的是Arduino雨滴传感器的使用示例代码免费下载。
    发表于 03-27 11:39 43次下载
    Arduino雨滴传感器的使用<b class='flag-5'>示例</b><b class='flag-5'>代码</b>免费下载

    机器学习的一些代码示例合集

    本文档的主要内容详细介绍的是机器学习的一些代码示例合集。
    发表于 04-29 08:00 1次下载
    机器学习的一些<b class='flag-5'>代码</b><b class='flag-5'>示例</b>合集

    AD593X代码示例

    AD593X代码示例
    发表于 03-23 08:18 14次下载
    AD593X<b class='flag-5'>代码</b><b class='flag-5'>示例</b>

    BeMicro代码示例

    BeMicro代码示例
    发表于 05-10 12:21 0次下载
    BeMicro<b class='flag-5'>代码</b><b class='flag-5'>示例</b>

    华为游戏服务示例代码教程案例

    概述 游戏服务kit安卓示例代码集成了华为游戏服务的众多API,提供了示例代码程序供您参考和使用,下面是对示例
    发表于 04-11 11:09 4次下载

    基于keil的AD7366示例代码

    基于keil的AD7366示例代码分享
    发表于 10-08 14:58 1次下载

    RAA489204 示例代码软件手册

    RAA489204 示例代码软件手册
    发表于 06-30 19:23 0次下载
    RAA489204 <b class='flag-5'>示例</b><b class='flag-5'>代码</b>软件手册

    安全驱动示例代码和实现

    示例代码获取和集成 本示例中的驱动只实现了对内存的读写操作,并提供了测试使用的TA和CA。 读者可使用如下指令从GitHub上获取到示例代码
    的头像 发表于 10-30 16:07 391次阅读
    安全驱动<b class='flag-5'>示例</b><b class='flag-5'>代码</b>和实现

    自己编写函数示例代码很难吗?分享几个示例

    Q A 问: Arduino Uno的函数示例 我决定自己编写函数示例代码,因为这应该是Arduino中的基本示例。网络上确实有关于使用函数的文档,但是,如果要尝试使用
    的头像 发表于 11-16 16:05 218次阅读
    自己编写函数<b class='flag-5'>示例</b><b class='flag-5'>代码</b>很难吗?分享几个<b class='flag-5'>示例</b>!