我是靠谱客的博主 无语路人,最近开发中收集的这篇文章主要介绍STM32通过BC28用mqtt协议连接onenet及simulate-device的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

几个注意点:

初始化的时候发送 "AT+NSOCR=STREAM,6,56000,1rn","OK" 经常会失败,原因是:下图,第一次成功了但是没检测到,以后就可能一直返回+CME ERROR: 4

目前碰到待解决的问题:

1、  给onenet发数据,平台可以收到,但是收onenet的时候总是总是"IPD" not found,打印bc28接收时发现,明明一整帧是

+NSONMI:1,47(收到消息+NSONMI:<socket>,<length>)

1,183.230.40.39,6002,4,20020000,47  (读取消息AT+NSORF=<socket>,<req_length>   :返回<socket>,<ip_addr>,<port>,<length>,<data>,<remaining_length>)

OK

却总是收到类似下面的不完整帧,但是感觉就算收到上面那样一帧也不太对,后面没有onenet下发的topic和消息体

+NSONMI:1,47
9,6002,4,20020000,0

OK

解决思路:直接监听bc28的发送引脚,不用mcu打印,先定位是mcu串口收不全还是在bc28和onenet上出的问题?从下图入手

从上图入手后,再用抓包工具看是mcu串口读取慢了,还是onenet发的快了?

全局搜 NSORF ,发现任何情况都收100个了,应该够啊

下面这个接收函数有问题,联系上下文,BC35_cnt刚被清零,BC35_WaitRecive怎么出现REV_OK情况?

 

函数具体内容是:

_Bool BC35_WaitRecive(void)
{

    if(BC35_cnt == 0){ 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
//      UsartPrintf(USART_DEBUG,"%s%drn",__FILE__,__LINE__);  
			return REV_WAIT;
		}
    if(BC35_cnt == BC35_cntPre)                                             //如果上一次的值和这次相同,则说明接收完毕
    {
        BC35_cnt = 0;							//清0接收计数

        return REV_OK;							//返回接收完成标志
    }

    BC35_cntPre = BC35_cnt;                                                 //置为相同

    return REV_WAIT;							//返回接收未完成标志

}

或者把bc35恢复出厂设置试试?

2 、发现就算下发不完整帧,mcu也不是一直能接收到,多测几次后,发现只有上传一次onenet数据,才能下发一次

解决思路:看onenet平台提供的资料和mqtt协议,是不是协议就是这么规定?或者是因为下图,下发的那帧没有读取完全,导致收不到URC

onenet提供手册  新版

3、JLINK仿真程序的时候,总是有的断点进不去,程序显示还在运行,其实已经死了

解决思路:不用例程,把例程移植到自己常用的环境下,比如cube+keil5+stlink试一下? 例程在这里,仅供参考(mcu是rbt6,+bc35-g,+移动物联网通信,+onenet,+mqtt)

其它资料:bc35中文手册  

相关参考:mqtt系列博客,感觉详细   另一系列  移远官网  BC28接入onenet  bc28指令发送流程 虚拟软件模拟MQTT和onenet收发

4、参考上面的链接直接用at串口发数据到onenet,接收没问题,就是一发送就返回+QMTSTAT: 0,1,连接断开了,数据也没上去,看别人说好像是要发完立刻再发连接  也好像是个bug

断开原因找到了,是因为格式不对,发送AT+QMTPUB=0,0,0,0,"$dp"之后不能直接就发json格式串,而是应该在格式串前加一些东西,比如固定和可变帧头(如果平台数据流 接收必须要符合给定的格式,给的那个软件可以都显示)

 

大概发送流程:

ATI
Quectel
BC28
Revision:BC28JAR01A10

OK
AT+QMTCFG="version",0,4
OK
AT+QMTOPEN=0,"183.230.40.39",6002
OK

+QMTOPEN: 0,0
AT+QMTCONN=0,"693738909","409001","k6TYrSqT9T4r1f2Cz0aafZUw=fk="
OK

+QMTCONN: 0,0,0
AT+QMTPUB=0,0,0,0,"$dp"
>:{"datastreams":[{"id":"LED","datapoints":[{"value":11}]}]}
OK

+QMTPUB: 0,0,0

 

5、发现不同模块和不太固件对同一指令反应不同,遇到了用BC26配置MQTT可以,用BC35G配置不可以

上图BC35-G出现的错误码50是指参数不正确

通过在技术交流群翻阅,发现BC35GJCR01A01.fwpkg这个固件支持mqtt配置,如下图,而我现在用的是BC35GJBR01A01.fwpkg,固件或者工具找不到可以私信我

担心BC35GJC的固件不能在硬件BC35GJB上运行,又找了一个

所以要升级一下,升级参考

大概流程先看一下设备型号和版本(以BC28做升级举例)

再看一下硬件接口  BC28是升级和通信都用主串口 BC35-G也是一样

升级出现了问题

换了个工具还是不行

上面原因是升级的软件放到中文路径下了

.NET Framework 下载地址 https://dotnet.microsoft.com/download/dotnet-framework/net472

有时候 出粗Sorry - something went wrong - No reponse from UE after sending SendData
还有一些奇怪问题,解决方法参考  其实是因为主程序是自己写的,升级的时候里面串口还在同时发,对升级产生干扰

MQTT simulate-device使用过程:

下载链接 https://open.iot.10086.cn/doc/art194.html#43

填入信息:第三行是  rR5dycBmq10RJ9YGORz=vtcM3Tc=

输入:{"datastreams":[{"id":"SMOKE","datapoints":[{"value":12}]}]} 是一个参数

 {"datastreams":[
{"id":"SMOKE","datapoints":[{"value":14}]},
{"id":"FIRE","datapoints":[{"value":0}]},
{"id":"TEMP","datapoints":[{"value":25.5}]},
{"id":"CO","datapoints":[{"value":37}]}]}  是多参数

最后

以上就是无语路人为你收集整理的STM32通过BC28用mqtt协议连接onenet及simulate-device的使用的全部内容,希望文章能够帮你解决STM32通过BC28用mqtt协议连接onenet及simulate-device的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部