从模拟到真实:小熊派硬件接入 IoT 平台的全过程记录 从模拟到真实小熊派硬件接入 IoT 平台的全过程记录原创声明本文基于本人课程实训期间独立开发的智慧路灯 IoT 管理平台Spring Boot EMQX TDengine实战经验整理为第一手踩坑记录内容已脱敏。项目代码已开源https://github.com/smart-lighting-backend/SmartLightingExp实战复盘 · 物联网硬件对接项目背景智慧路灯 IoT 管理平台最初使用模拟数据生成器MockDataGenerator模拟遥测上报本文记录接入真实硬件小熊派 BearPi-HM_Nano的全过程——固件开发、MQTT 对接、边缘决策、远程控制。一、为什么从模拟切到真实硬件模拟数据只能验证软件逻辑通不通但物联网系统的真正挑战在硬件侧设备断网重连、真实传感器噪声、边缘计算能力、固件与云端协议对齐。接入真实硬件后很多模拟环境永远暴露不了的问题浮出水面。二、硬件与固件组件型号说明开发板BearPi-HM_Nano小熊派 HarmonyOS 开发板扩展板E53_SC1BH1750 光照传感器 LED 灯通信WiFi MQTT通过 EMQX 连接后端存储Flash配网信息持久化固件功能E1_smartlighting_device示例Flash 配置存储WiFi/MQTT 配置持久化断电不丢AT 串口配网通过串口指令配置 WiFiWiFi/MQTT 连接断线自动重连边缘决策断网时本地判断开/关/调光远程控制接收云端 MQTT 指令三、关键改造设备数据源区分数据库device表新增source字段区分设备来源sourceVARCHAR(20)DEFAULTSIMULATEDCOMMENT设备来源: SIMULATED模拟, REAL真实硬件核心改动MockDataGenerator模拟数据生成器跳过真实设备// 只给模拟设备生成数据真实硬件自己上报mockDataGenerator 查询条件加.ne(Device::getSource,REAL)四、设备 MQTT 鉴权落地真实硬件接入要求每台设备独立 MQTT 凭据详见《IoT 设备 MQTT 鉴权四层防护实战》EMQX 内置认证用户Real_CS_001对应真实设备每设备独立用户名/密码ACL Topic 隔离设备只能访问自己的streetlight/{deviceId}/#主题修复ACL 订阅 Topic 从control改为commandconfig匹配后端实际下发路径五、协议对齐的坑5.1 字段命名不一致模拟器用的字段名action/controlSource与真实硬件上报的字段名led_status/led_source不一致前端展示和控制状态判断都要兼容两种字段。解决前端/移动端解析时做双字段兼容// 模拟设备action 字段; 真实硬件 BearPiled_status 字段valactionparseLatestField(latestData,action)if(action!null)returnwhen(action){ON-true;OFF-false;else-null}valledparseLatestField(latestData,led_status)if(led!null)returnledON5.2 时间戳时区TDengine 存储 UTC真实硬件上报时间与模拟器格式不一致需要统一为 UTC 存储 前端转北京时间展示。5.3 WiFi 远程配置新增PUT /devices/{id}/wifi-config接口通过 MQTT config Topic 下发 WiFi 参数设备详情页 → 输入 SSID/密码 → 后端下发 streetlight/{deviceId}/config → 设备写入 Flash → 进入等待重启模式 → 自动重连新 WiFi六、边缘决策设备断网也能干活模拟环境永远测不出的场景——设备断网后怎么办。本项目通过云端 边缘双层决策解决云端DecisionEngine评估遥测 → 下发控制指令边缘ConditionEvaluator纯函数实现与云端逻辑一致可迁移到硬件设备断网时本地自主判断关键设计边缘评估逻辑用纯函数编写不依赖任何框架因此可以烧录到硬件端——同一套决策逻辑云端边缘双跑。七、经验总结模拟能跑和真机能跑是两回事字段命名、时区、断网重连、协议对齐都是硬件接入才暴露的问题数据源字段source是必备设计模拟/真实设备共存是 IoT 开发常态必须有字段区分并让模拟器跳过真实设备双层决策是 IoT 的关键架构纯函数化决策逻辑云端边缘复用断网不瘫痪协议兼容要做双字段适配真实硬件字段与既有系统不一致时兼容层比强制改硬件更务实远程配置设备是刚需WiFi 参数下发 Flash 持久化 等待重启流程是真实硬件设备管理的标配能力