硬件配置
STM32F103RCT6 (RAM 64kB, FLASH: 256kB)
SIM800C
软件配置
STM32CubeMX 配置 FreeRTOS
iotkit-embedded
阿里云移植demo
iotkit-embedded配置
参考阿里云给出的demo,使用
1 | make menuconfig |
配置
配置时参考阿里云Demo,但要注意:
不要使能PLATFORM_HAS_DYNMEM
- 频繁从FreeRTOS内部申请内存没有必要,固定内存区域更安全
- FreeRTOS调度申请内存有很多种算法,我并不能完全了解
不要使能PLATFORM_HAS_OS
- 貌似这部分代码在本文写出时还不太完善
- 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,只是没有相关文档,我们不知道而已。
为什么不放出代码?
公司代码。