STM32对接AI中台:大模型+小模型“开箱即用”的嵌入式实践

电子说

1.4w人已加入

描述

去年做某个工业设备预测性维护项目时踩了不少坑,最头疼的就是联网环境不稳定。设备部署在厂房角落,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了吗?用的什么方案?欢迎评论区交流~

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐
  • 热点推荐
  • STM32
  • AI

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分