第二章:系统总体架构设计
好,咱们直接进入正题。这一章讲的是整个系统的骨架——端-边-云三层架构。说白了,就是你的灯泡、网关和服务器之间怎么分工、怎么配合。
我在做第一个智能照明项目时,犯过一个低级错误:把所有逻辑都塞到云端。结果呢?网络一断,灯就变砖了。从那以后,我对架构设计就特别较真。
2.1 端-边-云三层架构
先看整体结构。我习惯把系统拆成三层:
- 端(Device):就是你的智能灯泡、开关、传感器。资源受限,RAM可能只有几十KB。
- 边(Edge):通常是网关或本地控制器。负责协议转换、本地策略执行。
- 云(Cloud):后端服务器。做设备管理、OTA固件存储、数据分析。
你想想看,为什么非要三层?直接端到云不行吗?
嗯,这里要注意。如果家里有几十个灯,每个灯都直接连云端,那网关压力会很大。而且,本地场景联动(比如“开门亮灯”)如果走云端,延迟会高到让你崩溃。
核心原则:端做执行,边做控制,云做管理。
我在项目中遇到过一种情况:客户要求所有灯必须支持离线场景。那怎么办?只能把场景逻辑下沉到边缘网关。云端只负责下发场景配置,网关本地执行。这个思路,后来成了我们团队的标配。
2.2 通信协议选型
协议选型是个老生常谈的问题。我直接给结论,再解释为什么。
| 协议 | 适用场景 | 我的评价 |
|---|---|---|
| MQTT | 端到云、端到边 | 首选,轻量、支持QoS、双向通信 |
| CoAP | 资源极度受限的设备 | 可用,但生态不如MQTT成熟 |
| HTTP | 云端API、配置下发 | 适合管理面,不适合实时控制 |
MQTT 是我最推荐的。为什么?
- 它基于发布/订阅模式,天然适合一对多通信。
- 支持三个QoS等级。OTA升级这种关键操作,用QoS 1或2保证送达。
- 心跳机制可以检测设备离线,这对固件升级很重要——你总不想给一个离线设备发升级包吧?
CoAP 呢?它基于UDP,更轻量。但我在实际项目中踩过坑:CoAP的重传机制在弱网环境下不太稳定。如果你做的是电池供电的传感器,可以考虑;但照明设备通常有持续供电,没必要省那点流量。
HTTP 我只用在云端管理接口。比如设备注册、固件版本查询。实时控制用HTTP?别闹了,握手开销太大。
我的建议:端到边用MQTT,边到云用MQTT+HTTP混合。设备上报走MQTT,云端配置下发走HTTP。
2.3 系统数据流设计
数据流设计,说白了就是数据怎么在端-边-云之间流动。我把它分成三个方向:
2.3.1 上行数据流(设备 → 云端)
设备上报的数据包括:
- 状态数据:开关状态、亮度、色温。周期性上报,比如每5分钟一次。
- 事件数据:设备上线、离线、故障。即时上报。
- OTA相关数据:当前固件版本、升级进度、升级结果。
我曾经遇到一个问题:设备上报太频繁,把MQTT broker搞挂了。后来加了限流策略——状态数据合并上报,事件数据单独走高优先级Topic。
2.3.2 下行数据流(云端 → 设备)
云端下发的指令包括:
- 控制指令:开灯、关灯、调亮度。要求低延迟。
- 配置指令:场景配置、定时任务。可以批量下发。
- OTA指令:升级通知、固件包分片下发。
这里有个坑:OTA升级时,固件包通常很大(几百KB到几MB)。如果直接通过MQTT发,会阻塞其他消息。我的做法是:MQTT只发升级通知,固件包通过HTTP分片下载。
注意:OTA升级期间,设备不能响应控制指令。一定要设计“升级中”状态,让用户知道灯在忙什么。
2.3.3 边云数据流(边缘网关 ↔ 云端)
边缘网关是中间人。它需要:
- 聚合设备数据,批量上报云端。
- 缓存云端下发的配置,离线时也能执行。
- 转发OTA固件包给设备。
我记得有个项目,网关内存只有64MB。如果同时给50个灯升级,固件包缓存会撑爆。后来我们改成流式转发——网关收到一个分片,立即转发给设备,不缓存完整包。
2.4 数据流示例
看一个完整的OTA升级数据流:
1. 设备上线 → 上报当前固件版本(MQTT)
2. 云端比对版本 → 发现新固件(HTTP API)
3. 云端下发升级通知(MQTT)
4. 设备确认 → 进入升级模式(MQTT)
5. 设备通过HTTP下载固件包(分片)
6. 设备校验固件 → 写入Flash
7. 设备重启 → 上报新版本(MQTT)
8. 云端更新设备状态(数据库)
这个流程看起来简单,但每一步都有坑。比如第5步,如果下载到一半网络断了怎么办?我一般会设计断点续传——记录已下载的分片序号,重连后继续下载。
关键点:数据流设计要考虑到异常情况。网络抖动、设备重启、云端故障,都要有对应的处理逻辑。
2.5 小结
这一章的内容,说白了就是三件事:
- 架构选型:端-边-云三层,各司其职。
- 协议选型:MQTT为主,HTTP为辅,CoAP看情况。
- 数据流设计:上行、下行、边云,三条路径都要考虑异常。
下一章,我会讲具体的硬件选型和通信模块设计。到时候咱们聊聊ESP32、BLE Mesh和Zigbee怎么选。嗯,那也是个有意思的话题。