阿里云iotkit-embedded的坑

阿里云iotkit-embedded的坑


硬件配置

STM32F103RCT6 (RAM 64kB, FLASH: 256kB)
SIM800C

软件配置


STM32CubeMX 配置 FreeRTOS
iotkit-embedded
阿里云移植demo

iotkit-embedded配置


参考阿里云给出的demo,使用

1
make menuconfig

配置

配置时参考阿里云Demo,但要注意:

不要使能PLATFORM_HAS_DYNMEM

  1. 频繁从FreeRTOS内部申请内存没有必要,固定内存区域更安全
  2. FreeRTOS调度申请内存有很多种算法,我并不能完全了解

不要使能PLATFORM_HAS_OS

  1. 貌似这部分代码在本文写出时还不太完善
  2. SIM800C初始化部分需要改造,频繁申请Mutex和Semaphore

不要使用OTA功能

没有SSL,玩不起来

配置完成后编译时缺个log库,include删除就好

移植


移植wrapper.c

把所有的Mutex和Semaphore相关的函数全部返回正常(看一下头部说明)
一定要实现HAL_Snprintf,参考
HAL_SleepMS使用osDelay实现
Malloc使用pvPortMalloc(), HAL_Free使用vPortFree()

不得不说的是,即使你关闭了PLATFORM_HAS_DYNMEM,iotkit-embedded还是会调用这个函数,我记得出现在上报版本信息这个函数中

HAL_AT_Uart_Send使用HAL_UART_Transmit_IT连续发送,并在发送结束后判断gState,使用osDelay让出时间片
HAL_AT_Uart_Recv使用STM32串口文章中所提的方法,用队列接收,并自定义超时
注意一下iotx_mqtt_config.h中的IOTX_MC_TX_MAX_LEN以及IOTX_MC_RX_MAX_LEN,数据千万不要超了,或者修改宏定义,不然找都找不到在哪出错
CONFIG_MQTT_TOPIC_MAXLEN这个最大的topic长度八成不够长,自己改下就好。
最最重要的一个坑:

千万不要把example_publish这个函数中的内容分成几个函数块调用
原因是IOT_MQTT_Construct(&mqtt_params)这个函数内会直接使用mqtt_params的字符串,并保存;当你再使用yield以及publish这些函数时,有可能会重新连接,造成野指针程序跑飞。

重启SIM800C


担心SIM800C会挂,以及网络失败,需要hack一下代码

定时以及发现一直连接失败时重启sim800C
只需要改造IOT_ATM_Init以及它调用的函数

忽略at_parser_init返回的错误
设置reset_sim800c标签,在at_conn_init内重置at_conn_init_done(因为要把atconnects重置)
HAL_AT_CONN_Init内重置inited,这样它会重新检测sim800的状态。

总结


暂时只能想起这么多了,如果有遗漏那么抱歉了。。

开源库不是那么好用,想用上,是要付出代价的。

解释


为什么不提PR?

因为大部分其实不是bug,只是没有相关文档,我们不知道而已。

为什么不放出代码?

公司代码。

Комментарии

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×