OneNET平台通信开发(九)

此博文介绍如何将代码移植到STM32单片机上,也是最后一篇关于OneNET的博文。以硬件STM32F103RCT6和ESP8266,系统为FreeRTOS为例。设AT命令使用USART1,ESP8266使用USART2,并且你已经配置好FreeRTOS。如果不会可百度搜索如何移植。下面简单叙述一下移植需要修改或注意的内容:

  1. AT命令需改造为接收USART1命令的Task;
  2. Socket需修改为接收并处理ESP8266的数据,并且Socket相关函数通过模拟发送AT命令与ESP8266模块交互发送网络数据;
  3. 以上两个Task需要消息队列,可模仿OneNET部分的消息队列实现;
  4. OneNET部分需修改C++的std::queue为FreeRTOS的消息队列。需注意的是FreeRTOS对于队列和系统Tick计数有两个不同版本的函数,一个在中断中调用(FromISR),一个在Task中调用,需注意修改;
  5. 这几个新增的Task创建时优先级应设为相同,我发现如果不一样会使系统异常,似乎低优先级的任务得不到调度;
  6. OneNET需要的栈空间比较大,我移植时设为4KB的栈,而其他的设为1KB。消息队列容量设置的都是24个;
  7. Timer修改为FreeRTOS提供的定时器,并在OneNET任务中启动它,这样可确保只有在OneNET任务跑起来后才用定时器发送消息;
  8. 函数malloc和free替换为FreeRTOS提供的内存分配函数。我移植时设的堆大小为25KB(此单片机有40KB的RAM);
  9. 字符串中的\n需修改为\r\n,否则串口调试工具显示的时候不换行;
  10. 相关的log输出要更改为串口输出;
  11. 最后需要将Keil设置为C99模式才能正常编译。

以下是移植的效果示例(其中+IPD开头的是ESP8266模块接收数据的输出,可以忽略。图中可以发现有的+IPD输出和AT+CIPSEND命令的回显会连在一块,不知道为什么,和淘宝店家交涉她也不知道原因。我仅仅在程序中屏蔽了这种错误情况认为这样的数据无效。但有时会造成上报数据后服务器的回复和AT回显连一块,导致模块以为服务器没有回复而出现超时错误。不过不会引起模块异常)。按照图的顺序分别是登录流程;FOTA数据下发;北向执行和写操作;北向写操作的Fiddler截图:

经过简单的测试Notify上报数据,在连续上报近一个小时,每1秒上报一次的过程中未出现异常。这说明在这方面程序没有内存泄漏。实际上在VS中已测试过起码在AT输入正常的情况下代码不会有内存泄漏。以下是OneNET平台方面的上报数据记录截图:

最后说明代码中已有的问题和不完善之处。仅供记录,这些代码不会再被更新了。

  1. BSREG和REG失败后没有恢复OneNET的状态和关闭Socket线程;
  2. BS结束后可能会切换到另一个BS服务器,而不仅仅是LwM2M服务器。未实现;
  3. 带条件的Observe命令,也即Write-Attribute命令的处理。未实现;
  4. 在注册成功或更新成功后,启动定时器,在生命周期快结束时自动更新以保持设备不掉线。未实现;
  5. FOTA下载收到数据后启动超时定时器,在定时器超时前未下发下一包数据,则认为FOTA流程中断。这是协议内容,但中国移动的SDK也没有这个功能;
  6. AT部分代码不支持可变类型的数据,即某个位置的参数可以是数字也可以是字符串或其他类型;
  7. 其他的如DTLS加密,SOTA等。

猜你喜欢

转载自www.cnblogs.com/mengxiangdu/p/11279751.html