五层结构
核心设计原则:本地报警不依赖网络
跌倒这件事没有「重试」的机会。所以报警动作必须落在离传感器最近、依赖最少的那一层——也就是 STM32。网络只能用来通知远方的人,不能用来决定要不要响。
这条原则直接决定了架构:STM32 有自己的蜂鸣器与红灯驱动,不经过 ESP32、不经过 MQTT、不经过云端。ESP32 断网、服务器宕机、路由器重启,本地依然会响。反过来说,ESP32 与云端只承担「把已经响过的事件送出去」的职责,它们的故障只会推迟家属知情,不会取消报警。
为什么用双 MCU,而不是一颗
STM32F103C8T6 —— 判定与动作
- 裸机 + 状态机,响应确定性最好
- PIR 数字量、MQ 系列 ADC 采样与滤波
- 雷达候选的本地二次确认(5 秒窗)
- 久滞三级计时(L1/L2/L3)
- 蜂鸣器、红灯、取消按键、语音模块
- 不做雷达内部算法的重写
ESP32-S3 —— 解析与联网
- TinyFrame 协议帧解析(115200 8N1)
- 跌倒状态帧 0x0E02、人员存在帧 0x0F09、点云帧 0x0A08
- 安装高度、阈值、灵敏度等配置下发
- Wi-Fi 接入、MQTT 发布订阅、心跳
- 断网缓存与恢复补传
- 不做报警动作判定
拆成两颗的三条理由
- 实时性与网络栈解耦:Wi-Fi 与 TCP/IP 栈会带来不可预期的延迟尖峰。如果把报警动作和网络栈放在同一颗芯片上,网络抖动就可能影响报警时序;拆开后,STM32 的时序完全不受网络影响。
- 协议栈负担不同:雷达厂商给的 TinyFrame 解析、点云帧处理对 RAM 与算力有要求,ESP32-S3 更合适;而 STM32 只需要处理已经化简过的状态帧。
- 故障域隔离:ESP32 死机或反复重连时,STM32 侧的判定与报警依然独立运行,只是不再上报。
三条接口链路
数据链路与三段时间
图中的标尺把三段时间与链路节点对齐,是为了说明
各自从哪到哪,
不是为了相加成一个「总延迟」。详见
判定逻辑与报警时效。
MQTT 主题设计
首轮 device_id 固定为 bath01。前端不持有 Broker 凭据,家属端一律经 REST API 与 WebSocket 取数。
事件字段
可靠性不是靠一条机制,而是五件事协同:event_id 唯一 → QoS 1 → 设备本地缓存 → 恢复补传 → 后端幂等去重。少了任何一条,「不丢不重」都拿不到。