因为实验室的实验需要数据采集,因此需要在校园内设置多个采集设备,但因为终端分散,网络条件差,每个设备上云的成本高,每个设备的采集方式各有区别,而且采集数据有实时性要求,因此需要设计一个边缘设备网络,将多个采集节点接入一个边缘网关来解决这些问题,最终实现一个STM32做边缘网关,带多个终端节点,在本地做聚合、缓存、规则告警、远程配置、OTA,再与云端通过 MQTT 同步数据与指令的一个系统。
基于STM32实现的网关支持设备接入管理,数据聚合,本地缓存,云端通信,远程配置,OTA等功能,整体流程可以实现接入—采集—告警—上云—下发控制—OTA闭环。
网关通过以太网,WiFI或者4G进行上行云端通信,与各个节点进行LoRa下行通信,外接了SPI FLASH进行缓存以及OTA,使用FreeRTOS作为操作系统,通过HAL库实现SPI/UART/I2C/Flash等基础驱动,实现了LoRa协议等进行通信,设计了统一数据模型和缓存队列,与云端采用MQTT,有心跳,重连机制。使用了用消息队列把LoRa的实时采集与MQTT的网络波动解耦,所有数据进入统一数据模型,再走同一条规则→缓存→上云链路,OTA、配置都当成命令消息,走统一的命令分发框架。
技术栈包括HAL,FreeRTOS,LwIP,LwIP MQTT,FATFS,LoRA等。
我主要负责整体的网关端通信与数据链路设计,节点的采集操控实现由他人完成,最终效果达成了断网情况下可连续缓存数据,网络恢复后自动补传,云端无重复数据。
在开发过程中出现过LoRa丢包与重复包导致数据跳变的情况,最后采用了时间戳排序去重和数据防抖进行了解决,还出现过跑一段时间后无法分配pbuf,MQTT publish失败,固定重连状态机,确保socket对象释放并使用单线程处理MQTT。