CH32V307在RT-Thread平台使用BC26模块进行MQTT无法连接问题

文章描述了一位开发者在使用CH32V307开发板和RT-ThreadStudio进行物联网应用开发时遇到的AT命令解析错误和网络连接不稳定问题。问题集中在bc26模块的域名解析和连接MQTT服务器上,通过串口调试和日志分析,确定了服务器响应时间过短以及等待回应时间不足是主要问题。通过延长等待时间和更换服务器,连接稳定性得到改善,但仍有偶尔的掉线情况。
摘要由CSDN通过智能技术生成

开发环境

  1. CH32V307开发板,RT-Thread Studio ,RTT4.0.4
  2. BC26模块,AT组件,paho_mqtt软件包

问题及调试过程

  1. bc26启动成功,但是出现下面的问题:
inter mqtt_offline_callback!
[D/mqtt] restart!
inter mqtt_connect_callback!
[D/mqtt] ipv4 address port: 1883
[D/mqtt] HOST = 'broker-cn.emqx.io'
[E/at.clnt] execute command (AT+QIDNSGIP=1,"broker-cn.emqx.io") failed!
[E/mqtt] getaddrinfo err: 202 'broker-cn.emqx.io'
[E/mqtt] resolve uri err
[E/mqtt] Net connect error(-1).
inter mqtt_offline_callback!
[D/mqtt] restart!
inter mqtt_connect_callback!
[D/mqtt] ipv4 address port: 1883
[D/mqtt] HOST = 'broker-cn.emqx.io'


在这里插入图片描述

应该是在通过at设备发送消息时出现错误,“link.rt-thread.org”是系统一开始测试网络连接外网功能是否成功的连接地址。bc26的初始化和mqtt服务器的连接应该都没问题。AT+QIDNSGIP是域名解析指令。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q25T15NZ-1682391553405)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230421134452395.png)]

解决方法:(1)单独连接串口调试bc26模块,测试该指令是否可行[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2S6tcfI-1682391553406)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230423142717492.png)]

(2)wchlink调试,先是进入了AT_RESP_TIMEOUT,然后第二次res_status被设置为了AT_RESP_ERROR,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKRq043v-1682391553406)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230423143533274.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e7Lw0djh-1682391553406)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230423144856878.png)]

看更底层的代码,len为35 ,send_buf[35]\n?是不是多了一个“\n”导致的?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MGcxdv9O-1682391553407)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230423154703264.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ocu1P9WW-1682391553407)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230423154857896.png)]

调试过程中又出现并没有多"\n",反而在下一条at指令的时候没有把send_buf后面的字节清零[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LbnC9qAd-1682391553407)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230423160356054.png)]

last_cmd_len = vsnprintf(send_buf, sizeof(send_buf) - 2, format, args);

//这里指定了发送的长度,这里其实没问题的,问题可能还是在接收时解析数据!!

但是还是同样的错误,那就可能是解析模块返回的urc数据出了问题吗?urc_dnsqip_func函数要发送一个事件BC26_EVENT_DOMAIN_OK[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ky3lnfKI-1682391553412)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230423180013704.png)]

上面忘记了,下面打开ulog组件看看打印信息。。。。。。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n4s8lHWG-1682391553413)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230424105851829.png)]

能够连接,但是不稳定,组件没有问题?是信号有问题?!!!在这里插入图片描述

完蛋了,难道是回应信号时间太长,那也不至于连不上把【nbiot首先场景必须要是【即时性不强】的场景,必须是这个,比如说快递行业的运输车,一两个小时为周期的上报一下车辆位置,或者电表,一个月一次上报数据,这样对即时性不强的场景。为什么要强调这个,首先NB-IOT低功耗窄宽带,下行接收极慢,真实测量过,使用标准增益天线订阅MQTT的topic,服务器发出数据后,平均要20秒左右才能收到数据。(即时性强的场景你能受得了这个延迟?),但他信号覆盖范围极广功耗又极其低,凡是即时性要求不强的都适合,像一个月才操作一次数据的抄表就非常适合用NB-IOT
下面打开AT组件的调试信息

[639298] D/mqtt: restart!
inter mqtt_connect_callback!
[639303] D/mqtt: ipv4 address port: 1883
[639307] D/mqtt: HOST = 'broker-cn.emqx.io'
[D/AT] sendline: 0000-0020: 41 54 2B 51 49 44 4E 53  47 49 50 3D 31 2C 22 62  72 6F 6B 65 72 2D 63 6E  2E 65 6D 71 78 2E 69 6F    AT+QIDNSGIP=1,"broker-cn.emqx.io
[D/AT] sendline: 0020-0040: 22 0D 0A                                                                                              "..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                                                                           OK..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 2B 51 49 55 52 43 3A 20  22 64 6E 73 67 69 70 22  2C 30 2C 31 2C 30 0D 0A                             +QIURC: "dnsgip",0,1,0..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 2B 51 49 55 52 43 3A 20  22 64 6E 73 67 69 70 22  2C 22 33 2E 32 32 38 2E  35 34 2E 31 37 33 22 0D    +QIURC: "dnsgip","3.228.54.173".
[D/AT] recvline: 0020-0040: 0A                                                                                                    .
[D/AT] sendline: 0000-0020: 41 54 2B 51 49 4F 50 45  4E 3D 31 2C 30 2C 22 54  43 50 22 2C 22 33 2E 32  32 38 2E 35 34 2E 31 37    AT+QIOPEN=1,0,"TCP","3.228.54.17
[D/AT] sendline: 0020-0040: 33 22 2C 31 38 38 33 2C  30 2C 31 0D 0A                                                               3",1883,0,1..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                                                                           OK..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 2B 51 49 4F 50 45 4E 3A  20 30 2C 30 0D 0A                                                            +QIOPEN: 0,0..
[D/AT] sendline: 0000-0020: 41 54 2B 51 49 53 45 4E  44 3D 30 2C 36 34 0D 0A                                                      AT+QISEND=0,64..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 3E                                                                                                    >
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] sendline: 0000-0020: 10 3E 00 04 4D 51 54 54  04 FFFFFFD6 00 1E 00 0C 72 74  74 68 72 65 61 64 36 32  35 36 00 0E 2F 6D 71 74    .>..MQTT......rtthread6256../mqt
[D/AT] sendline: 0020-0040: 74 2F 77 69 6C 6C 74 65  73 74 00 08 47 6F 6F 64  62 79 65 21 00 04 74 65  73 74 00 04 74 65 73 74    t/willtest..Goodbye!..test..test
[D/AT] recvline: 0000-0020: 10 3E                                                                                                 .>
[D/AT] recvline: 0000-0020: 00 04 4D 51 54 54 04 FFFFFFD6  00 1E 00 0C 72 74 74 68  72 65 61 64 36 32 35 36  00 0E 2F 6D 71 74 74 2F    ..MQTT......rtthread6256../mqtt/
[D/AT] recvline: 0020-0040: 77 69 6C 6C 74 65 73 74  00 08 47 6F 6F 64 62 79  65 21 00 04 74 65 73 74  00 04 74 65 73 74 0D 0A    willtest..Goodbye!..test..test..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                                                                           OK..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 53 45 4E 44 20 4F 4B 0D  0A                                                                           SEND OK..
[D/AT] sendline: 0000-0020: 41 54 2B 51 49 53 45 4E  44 3D 30 2C 30 0D 0A                                                         AT+QISEND=0,0..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 2B 51 49 53 45 4E 44 3A  20 36 34 2C 30 2C 36 34  0D 0A                                               +QISEND: 64,0,64..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                                                                           OK..
[661696] E/mqtt: MQTTConnect wait resp fail, res:0 errno:0
[661702] E/mqtt: MQTT connect error(-1): UNKNOWN_ERROR.
inter mqtt_offline_callback!
[D/AT] sendline: 0000-0020: 41 54 2B 51 49 43 4C 4F  53 45 3D 30 0D 0A                                                            AT+QICLOSE=0..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                                                                           OK..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 43 4C 4F 53 45 20 4F 4B  0D 0A                                                                        CLOSE OK..
[666893] D/mqtt: restart!
inter mqtt_connect_callback!
[666898] D/mqtt: ipv4 address port: 1883
[666902] D/mqtt: HOST = 'broker-cn.emqx.io'
[D/AT] sendline: 0000-0020: 41 54 2B 51 49 44 4E 53  47 49 50 3D 31 2C 22 62  72 6F 6B 65 72 2D 63 6E  2E 65 6D 71 78 2E 69 6F    AT+QIDNSGIP=1,"broker-cn.emqx.io
[D/AT] sendline: 0020-0040: 22 0D 0A                                                                                              "..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                                                                           OK..
[D/AT] sendline: 0000-0020: 41 54 2B 43 47 52 45 47  3F 0D 0A                                                                     AT+CGREG?..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 2B 43 47 52 45 47 3A 20  30 2C 31 0D 0A                                                               +CGREG: 0,1..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 4F 4B 0D 0A                                                                                           OK..

看看mqtt_connect等待resp的时间?这里client没有设置timeout,默认为5s,加大试试?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2sTEYfvX-1682391553414)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230424140825510.png)]

发送完一条指令,还没有收到全部的回应信息就发送了下一条指令,所以出现有时能够连上,有时连不上,等待回应的时间也太短 这应该就是问题所在了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WTZ6zH9u-1682391553415)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230424153458198.png)]

服务器数据根本没有确认。。。(解决问题后发现此处应该是这个mqtt测试服务器的问题,自动关闭了连接。。。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o2Dv9pc3-1682391553415)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230424153745471.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmljKdZ5-1682391553415)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230424154748679.png)]

+QIURC: "closed",0 总是掉线(破案了,是"broker-cn.emqx.io“服务器的问题!

通过对模块进行串口调试,发现,连接"broker-cn.emqx.io“这个ip不管是通过bc26内置的tcp还是内置的mqtt,都会在连接上后立刻断开,而连接模块商的测试服务器没有如何问题。

测试发现,确实是broker-cn.emqx.io的问题,连接不稳定。程序使用模块商的测试服务器没有如何问题,开机后过几十秒才能连接上。**但是也会出现 掉线的问题,之后又会重连上。在paho_mqtt_pipe.c中,延长等待ping resp的时间。5–>10s ,所有等待时间都改为10s吧

 [91911] E/mqtt: [91911] wait Ping Response res: 0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1yYqKw5d-1682391553416)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230425100223390.png)]

虽然会出现断线重连,且有时延迟会又2s左右,但是对于本次的应用场景来说已经满足要求!(延迟wait时间后,基本不会掉线,但是也会出现连接不上的问题,但是至少重试几次后还是能连接上。)

为了保险,在bc26_check_link_status中也增加延时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lq802AzB-1682391553416)(C:\Users\LONG\AppData\Roaming\Typora\typora-user-images\image-20230425103029927.png)]

总结

  1. 我用串口测试了一下bc26模块,在用mqtt固件连接broker-cn.emqx这个服务器时,在QMTOPEN后服务器会在两秒内断开连接,使用模块厂商提供的服务器的话会有10秒左右的时间来进行下一条指令QMTCONN,所以这个mqtt测试服务器应该有点问题。这是第一个。
  2. 然后就是我使用的paho_mqtt软件包中的在连接过程中的等待回应时间,我全部扩大了一倍,因为在连接上后会出现等待超时的打印。并且我连接的服务器换成了模块厂商提供的。目前连接还是比较稳定的,但是也会出现偶尔掉线的状况,我这次的应用倒是对传输实时性和稳定性要求并不高。
  3. 另外,刚上电,模块可能需要几十秒的时间进行初始化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT-Thread 作品秀】基于RT-Thread的网络照相机作者:吴顶顶 概述随着科技的进步和互联网的发展,基于物联网的可拍照设备也越来越多的融入到人们的生活中来,例如在超市中,管理者利用拍照设备定时抓取货架照片,分析货物状态,并补充、优化货物摆放;在酒吧里,管理者会利用拍照设备定时抓拍酒架照片,传送到网络平台供大众浏览,以招揽更多顾客。本网络照相机基于STM32H7+RTThread平台,采集摄像头数据,并通过无线网络传送到服务器,提供SD卡配网、手动拍摄、定时拍摄、照片推送等功能,并提供windows上位机提供控制和照片显示功能。 主要功能有: 格式化sd卡:格式化sd卡,但是会保留网络配置文件,其他文件全部删除 设备重启:重启设备 实时拍照:发送指令给照相机,照相机拍照,并把照片回传 定时拍照:照相机依据下发的拍照时间,在时间到达时拍摄一张照片,并传给服务器 按键拍照:点击板上用户按钮,拍摄一张照片,并传给服务器 定时任务:可以新建/删除/查询定时拍照任务,任务存储在sd卡中,重启有效 开发环境硬件:ART-PI(STM32H750主控)+ OV2640模组 RT-Thread版本:4.0.3 SDK 版本:1.0.1 开发工具及版本:RT-Thread Studio 1.1.5, Qt5.14.0 RT-Thread使用情况概述内核部分:调度器,信号量,互斥锁,内存管理 调度器:多任务调度 信号量:用于唤醒对应任务 互斥锁:用于互斥资源独占访问 内存管理:动态内存申请与释放 组件部分:虚拟文件系统,IPC,I2C,RTC,NTP 虚拟文件系统:文件操作,sd卡、照片文件 IPC:mqtt发送数据需要 I2C:配置摄像头模块需要 RTC和NTP:同步时间 软件包部分:paho mqtt,cJSON,netutils pahomqtt:用于和服务器通信 cJSON:解析、封装mqtt消息 netutils:NTP网络对时 其他:base64 用于将图片文件转换成字符串,便于mqtt传输 硬件框架总体的硬件框架如下图所示: 本网络摄像机硬件结果较为简单,即art-pi连接一个摄像头模组,art-pi板上用到了AP6212无线模块,外部内存,led指示灯,和sd卡。其中,摄像头模块用于采集图像信号;AP6212用于和服务器进行通信;因一张图像数据量较大,片内内存不够,故而使用外部内存;led灯用于指示设备工作状态;sd卡用于保存网络、服务器、和定时任务配置。 软件框架说明整体的软件框架如下图所示,网络照相机内部有一个proxy线程,负责和云端进行通信,在接收到云端消息后会解析,并分发到其他的线程执行,然后将执行结果返回到云端;照相机发生了其他的事件,例如用户按键拍照,也会将数据传给proxy线程,proxy线程再将数据发送到云端。用户通过上位机终端软件连接上云服务器,实现与照相机的通信及控制。 整个系统支持接入多个照相机,如下图所示,不同的照相机通过sd卡配置文件中sn进行区分,上位机软件可以显示所有在线的照相机,但同一时间只支持操作一个。 软件模块说明1. 用户线程创建流程如下图所示为用户线程创建流程 用户线程作用描述如下: main:用于创建sd_card 线程,检测按键事件,闪灯; sd_card:用于管理与sd卡相关的工作,包括拍照,网络配置,定时任务; network:负责联网,根据sd卡的配置文件连接到指定的wifi网络; proxy:负责启动mqtt,并管理与云端的通信,其他线程都需要通过proxy线程与云端交互数据; event:定时任务和按键任务,在定时时间到达时,或者用户按键时拍摄照片并通过proxy上传云端。 2. 通信接口及流程2.1 MQTT订阅主题设备向服务器订阅主题: /ter/query/discovery,用于接收设备发现消息 /ter/sn/request,用于接收针对该设备的指令,其中sn为设备的SN号,下同 客户端向服务器订阅主题: /dev/response/discovery,用于接收设备发现回复 /dev/response/will,用于接收设备遗嘱消息 /dev/sn/response,用于接收设备操作指令回复 /dev/sn/event,用于接收设备的通知 2.2 设备发现所有的设备均订阅/ter/query/discovery主题,客户端向该主题发布发现消息,所有收到消息的设备向/dev/response/discovery回复一条消息,而客户端又订阅了/dev/response/discovery主题,故而便可以知道哪些设备在线了。 设备连上服务器的时候,会定义一个遗嘱消息,主题为/dev/sn/will,客户端订阅了该主题,当设备因为某些原因掉线,则超过一定时间之后,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值