2、系统总体架构设计:端-边-云三层架构、各层职责划分、通信协议选型(MQTT/CoAP/HTTP)
好,我们直接进入正题。这一章聊的是整个系统的骨架——端-边-云三层架构。说白了,就是决定你的医疗设备数据怎么跑、指令怎么下、升级包怎么推。我见过不少团队,一上来就撸代码,结果后面发现协议选错了、边界划不清,整个项目推倒重来。嗯,咱们先把地基打牢。
2.1 为什么是三层?不是两层,也不是四层?
你可能会问:直接设备连云端不行吗?非要中间加个“边”?
我举个例子。一台ICU的呼吸机,每秒钟产生上百条波形数据。如果全部直连云端,先不说带宽够不够,万一网络抖动一下,数据丢了怎么办?更关键的是——延迟。有些报警需要毫秒级响应,云端绕一圈回来,黄花菜都凉了。
所以,三层架构的核心逻辑是:端做采集与控制,边做实时处理与缓存,云做汇聚与分析。各司其职,互不干扰。
核心原则:端侧只做最必要的事,边侧扛住实时性压力,云侧负责全局管控。千万别让端侧干云的活,也别让云侧管端的实时中断。
2.2 各层职责划分
2.2.1 端侧(设备层)
端侧就是你的医疗设备本体——监护仪、输液泵、除颤仪等等。它的职责其实很纯粹:
- 数据采集:传感器读数、设备状态、运行日志。注意,这里只做原始数据的打包,不做复杂分析。
- 本地控制:接收边侧或云端的指令,执行参数调整、紧急停机等操作。
- 固件升级执行:接收升级包,校验签名,写入Flash,回滚失败版本。
我个人习惯,在端侧会保留一个“最小安全模式”。万一网络断了、边侧挂了,设备还能按最后一套安全参数独立运行。我在项目中遇到过,有一次边侧服务器宕机,所有输液泵差点失控,幸亏端侧有本地兜底逻辑。
避坑指南:端侧不要做OTA升级的“全量校验”。我曾经见过一个团队,升级包10MB,端侧校验花了3分钟,结果设备在这期间无法响应任何指令。正确的做法是:边侧先做哈希校验,端侧只做签名验证。
2.2.2 边侧(边缘层)
边侧是整个架构的“腰部”。它扛着实时性、可靠性和带宽优化的重任。
- 实时数据处理:比如心电信号的异常波形检测,必须在几十毫秒内完成。云端做不到,端侧算力不够,边侧最合适。
- 协议转换与数据缓存:端侧可能用CoAP或私有协议,边侧统一转换成MQTT或HTTP再上云。同时,边侧要缓存最近24小时的数据,防止网络中断导致数据丢失。
- 升级包分发与策略管理:云端把升级包推给边侧,边侧再按设备批次、地理位置、在线状态,分批下发。说白了,边侧是升级任务的“调度员”。
你想想看,如果每台设备都直接去云端拉升级包,云端压力多大?而且万一升级包有问题,边侧可以立刻暂停下发,避免“全军覆没”。
2.2.3 云侧(平台层)
云侧是大脑,负责全局视角的事情。
- 设备管理与注册:每台设备上线、下线、固件版本、地理位置,云侧都要记录。
- 固件版本管理与发布:灰度发布、AB测试、强制升级策略,都在云侧配置。
- 大数据分析与报表:所有设备的历史数据汇聚到云侧,做趋势分析、故障预测。
- 远程运维接口:给医院IT或厂商运维人员提供Web界面或API,查看设备状态、触发升级。
注意:云侧绝对不能直接控制设备。所有控制指令必须经过边侧转发。为什么?安全。云侧被攻破,最多影响策略下发;如果云侧能直控设备,那一旦被入侵,所有设备都可能被远程操控。这是医疗设备安全的大忌。
2.3 通信协议选型:MQTT / CoAP / HTTP
协议选型,说白了就是看你的设备“穷不穷”、“急不急”、“稳不稳”。
| 协议 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| MQTT | 端→边、边→云的数据上报与指令下发 | 轻量、支持QoS、双向通信、持久连接 | 依赖TCP,弱网环境可能断连 |
| CoAP | 端侧资源受限设备(如传感器节点) | 基于UDP,极轻量,适合低功耗 | 可靠性不如MQTT,需要自己实现重传 |
| HTTP/HTTPS | 云侧管理接口、固件包下载 | 成熟、调试方便、安全(HTTPS) | 头部开销大,不适合高频实时通信 |
2.3.1 MQTT——我个人的首选
在医疗设备场景下,MQTT是我用得最多的协议。为什么?因为它支持发布/订阅模式,天然适合设备状态上报和远程指令下发。而且QoS等级可以灵活选择:
- QoS 0:最多发一次,适合心跳包、非关键日志。
- QoS 1:至少发一次,适合报警事件、状态变更。
- QoS 2:恰好发一次,适合固件升级指令、参数设置。
我建议,端侧到边侧用MQTT over TLS,边侧到云侧用MQTT over TCP(内网环境可以省掉TLS开销)。
实战经验:MQTT的遗嘱消息(Last Will)一定要用。设备突然掉线时,边侧能立刻感知,触发备用策略。我曾经因为没配遗嘱,一台输液泵断线后,边侧还以为它在线,继续下发指令,结果导致药物输注异常。
2.3.2 CoAP——给“穷”设备准备的
如果你的设备是电池供电的传感器节点,或者MCU只有几十KB的RAM,那MQTT可能太重了。这时候CoAP是更好的选择。
CoAP基于UDP,头部只有4字节。它支持GET/POST/PUT/DELETE,跟HTTP很像,但轻量得多。不过要注意,CoAP的可靠性需要自己实现——比如用CON(确认)消息和重传机制。
我在一个病房环境监测项目中用过CoAP。温度传感器每5秒上报一次数据,用CoAP + DTLS加密,电池续航从3个月延长到了8个月。嗯,这就是轻量协议的价值。
2.3.3 HTTP/HTTPS——管理接口的标配
HTTP主要用在云侧的管理接口和固件包下载。原因很简单:
- 调试方便,curl一把梭。
- HTTPS的证书体系成熟,适合安全传输。
- 支持断点续传,适合大文件下载(比如固件包)。
但注意,不要在端侧用HTTP做实时数据上报。头部开销太大,而且HTTP是请求-响应模式,服务器没法主动推数据给设备。除非你配合WebSocket,但那又增加了复杂度。
避坑指南:固件包下载一定要用HTTPS + 断点续传。我曾经见过一个团队,用HTTP下载升级包,结果网络波动导致下载到一半失败,设备进入“半砖”状态。后来改成HTTPS + Range请求,问题解决。
2.4 协议组合推荐
在实际项目中,我通常这样组合:
- 端→边:MQTT(数据上报)+ CoAP(低功耗传感器)
- 边→云:MQTT(实时数据)+ HTTP(固件包拉取)
- 云→边:MQTT(指令下发)+ HTTP(管理API)
你想想看,这样分层之后,每一层的协议都是最合适的。端侧不用操心HTTPS的握手开销,云侧不用处理UDP的丢包重传。各层各司其职,系统才稳定。
总结一句话:端侧做减法,边侧做缓存与调度,云侧做聚合与管控。协议选型跟着场景走,别为了技术而技术。
好,这一章就到这里。下一章我们聊具体的固件升级流程设计——从打包、签名、分发到回滚,每一步都有坑。到时候我把我踩过的坑都抖出来。