STM32对接AI中台:大模型+小模型“开箱即用”的嵌入式实践 电子说
去年做某个工业设备预测性维护项目时踩了不少坑,最头疼的就是联网环境不稳定。设备部署在厂房角落,4G信号时断时续,日志上传到云端经常超时。后来折腾了一套端云协同的方案——本地跑轻量小模型做实时筛查,云端大模型做深度分析,半年跑下来效果还不错,分享一下具体实现。
一、为什么不用纯云端方案?
之前试过把STM32采集的振动数据全部打包上传,结果遇到两个问题:
每天几十MB的数据量,4G流量费扛不住
断网时数据积压,恢复后批量上传延迟严重
后来改为本地小模型初筛 + 云端大模型复核的策略:正常数据本地处理,只有异常时刻才触发云端调用。
二、核心代码(已在实际项目验证)
用的是STM32F407 + ESP8266,RTOS开了两个任务:一个负责传感器采集+本地推理,一个负责云端通信。下面是精简后的关键部分:
c
#include "stm32f4xx_hal.h"
#include "cmsis_os.h"
#include < string.h >
extern UART_HandleTypeDef huart1; // ESP8266通信串口
// AI中台请求参数(混合路由模式)
static const char* ai_payload_fmt =
"{"
""model_routing":"hybrid","
""query":"%s","
""device_id":"DEV_%06d","
""fallback":"rule_engine""
"}";
// ESP8266发送命令
static void esp8266_send_cmd(const char* cmd) {
HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 200);
HAL_UART_Transmit(&huart1, (uint8_t*)"rn", 2, 100);
osDelay(500);
}
// 调用云端AI中台
int ai_gateway_call(const char* alert_msg, uint32_t device_sn) {
char payload[256];
char post_req[512];
snprintf(payload, sizeof(payload), ai_payload_fmt, alert_msg, device_sn);
esp8266_send_cmd("AT+CIPSTART="TCP","api.ai-platform.com",80");
snprintf(post_req, sizeof(post_req),
"POST /v1/predict HTTP/1.1rn"
"Host: api.ai-platform.comrn"
"Content-Type: application/jsonrn"
"Content-Length: %drn"
"Connection: closernrn%s",
strlen(payload), payload);
char len_cmd[32];
snprintf(len_cmd, sizeof(len_cmd), "AT+CIPSEND=%d", strlen(post_req));
esp8266_send_cmd(len_cmd);
osDelay(200);
esp8266_send_cmd(post_req);
return 0;
}
// 本地小模型推理(简化版)
static int local_inference(float* vibration_data) {
// 实际用的是STM32 Cube.AI转换的轻量模型
// 这里简化为阈值判断
if (vibration_data[0] > 12.5f) {
return 1; // 异常
}
return 0; // 正常
}
// 主任务
void ai_task(void const* argument) {
float vib_buffer[128];
uint32_t dev_sn = 0x123456;
while(1) {
read_vibration_sensors(vib_buffer, 128);
if (local_inference(vib_buffer)) {
ai_gateway_call("电机振动异常,幅值超阈值", dev_sn);
}
osDelay(1000);
}
}
三、实际踩过的坑
TCP连接复用:一开始每次都重新建连,耗时将近2秒。后来改成保持长连接+心跳,降到200ms以内。
断网缓存:加了Flash循环队列,云端不可用时本地存储异常日志,恢复后批量补传。
JSON解析:ESP8266资源有限,没上cJSON,直接手写字符串拼接(注意防止缓冲区溢出)。
四、总结建议
如果你也想在STM32上搞类似的混合AI架构:
本地模型:用STM32 Cube.AI转换TensorFlow Lite模型,实测F407能跑几十KB的小网络
云端对接:协议用MQTT更省流量,HTTP作为备选
降级策略:断网时本地小模型至少输出置信度,不要完全盲跑
最后问一句:你们手头的嵌入式项目开始用AI了吗?用的什么方案?欢迎评论区交流~
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !