开发环境
- CH32V307开发板,RT-Thread Studio ,RTT4.0.4
- BC26模块,AT组件,paho_mqtt软件包
问题及调试过程
- 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是域名解析指令。
解决方法:(1)单独连接串口调试bc26模块,测试该指令是否可行
(2)wchlink调试,先是进入了AT_RESP_TIMEOUT
,然后第二次res_status
被设置为了AT_RESP_ERROR
,
看更底层的代码,len
为35 ,send_buf[35]
是\n
?是不是多了一个“\n”导致的?
调试过程中又出现并没有多"\n",反而在下一条at指令的时候没有把send_buf后面的字节清零
last_cmd_len = vsnprintf(send_buf, sizeof(send_buf) - 2, format, args);
//这里指定了发送的长度,这里其实没问题的,问题可能还是在接收时解析数据!!
但是还是同样的错误,那就可能是解析模块返回的urc数据出了问题吗?urc_dnsqip_func
函数要发送一个事件BC26_EVENT_DOMAIN_OK
上面忘记了,下面打开ulog组件看看打印信息。。。。。。
能够连接,但是不稳定,组件没有问题?是信号有问题?!!!
完蛋了,难道是回应信号时间太长,那也不至于连不上把【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,加大试试?
发送完一条指令,还没有收到全部的回应信息就发送了下一条指令,所以出现有时能够连上,有时连不上,等待回应的时间也太短 这应该就是问题所在了
服务器数据根本没有确认。。。(解决问题后发现此处应该是这个mqtt测试服务器的问题,自动关闭了连接。。。)
+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
虽然会出现断线重连,且有时延迟会又2s左右,但是对于本次的应用场景来说已经满足要求!(延迟wait时间后,基本不会掉线,但是也会出现连接不上的问题,但是至少重试几次后还是能连接上。)
为了保险,在bc26_check_link_status
中也增加延时
总结
- 我用串口测试了一下bc26模块,在用mqtt固件连接
broker-cn.emqx
这个服务器时,在QMTOPEN
后服务器会在两秒内断开连接,使用模块厂商提供的服务器的话会有10秒左右的时间来进行下一条指令QMTCONN
,所以这个mqtt测试服务器应该有点问题。这是第一个。 - 然后就是我使用的paho_mqtt软件包中的在连接过程中的等待回应时间,我全部扩大了一倍,因为在连接上后会出现等待超时的打印。并且我连接的服务器换成了模块厂商提供的。目前连接还是比较稳定的,但是也会出现偶尔掉线的状况,我这次的应用倒是对传输实时性和稳定性要求并不高。
- 另外,刚上电,模块可能需要几十秒的时间进行初始化。