Zephyr 生产落地案例:BLE 低功耗传感器与边缘网关
生产落地案例:BLE 低功耗传感器与边缘网关
案例一:电池供电的 BLE 温湿度传感器。背景是一款用纽扣电池供电的环境监测节点,要求一次电池撑一年以上,同时周期性广播温湿度数据。此前方案用裸机加私有协议,功能迭代时每次都要重写射频部分。
做法是把应用迁到 Zephyr,用官方传感器驱动读 BME280,用 Zephyr 自带 BLE 协议栈做外设角色,把广播包做成厂商自定义数据格式。关键配置项:CONFIG_BT=y、CONFIG_BT_PERIPHERAL=y、CONFIG_BT_DEVICE_NAME、CONFIG_SENSOR=y、CONFIG_I2C=y,再加 CONFIG_PM=y 与设备级电源管理让 I2C 与传感器在两次采样之间下电,采样间隔用 k_msleep 让内核进入 tickless 空闲。
效果上最直接的收益是迭代速度:协议栈、驱动、构建流程全部换成官方组件,新增一个传感器只需要在 overlay 里加一个节点、在 prj.conf 里开一个驱动开关。踩过的坑有两个:一是把 CONFIG_LOG 留在默认等级打开了调试日志,日志缓冲占了 RAM,且串口输出在无连接的电池设备上拖慢了空闲时间,解决方式是把日志等级调到只保留 error,并在量产配置里整体关掉 shell 与调试输出;二是早期没开设备电源管理,I2C 控制器一直保持供电,实测功耗明显偏高,打开设备级 PM 后回到预期区间。具体功耗数值与实测条件相关,务必以自己板子的测量结果为准,不要照搬文档数字。
案例二:多接口边缘网关。背景是一台需要同时接 RS485 总线与以太网、并支持现场升级的工业网关。选 Zephyr 的理由是它同时提供网络协议栈、串口驱动、文件系统与 MCUboot 引导方案,不用再自行缝合多个开源项目。
做法是用设备树描述两路 UART 与以太网 MAC,应用层跑 Modbus 轮询任务与 MQTT 上报任务,两个任务通过消息队列解耦,避免网络抖动阻塞串口采集。关键配置项:CONFIG_NETWORKING=y、CONFIG_NET_TCP=y、CONFIG_NET_SOCKETS=y、CONFIG_MQTT_LIB=y(实际选项名以所用版本官方文档为准),CONFIG_ETH_* 按网卡型号选择,升级链路使用 MCUboot 加镜像槽位管理。
效果是现场返修率下降,因为 shell 与日志能在客户现场直接定位问题;OTA 通道打通后,小改动不再需要派人上门。踩的坑主要是三类:一是 UART 与网络任务的优先级没理顺,网络突发时串口出现丢帧,后来把串口采集任务优先级提到网络任务之上,并把缓冲区加大解决;二是 socket 缓冲区默认值偏小,高并发上报时出现连接被重置,通过调大 CONFIG_NET_*_BUF 系列参数缓解;三是早期把调试 shell 一起发布了,量产固件里应通过独立配置片段(prj_release.conf)关掉调试相关的 CONFIG_*,避免现场被误操作。这类排查最终都落到 west build -t ram_report 与 devicetree_generated.h 上,养成先看展开结果的习惯能省很多时间。

