南京凌晨三点,一台水泵自己回滚了:技术迭代升级到底在升什么
凌晨三点,泵站自己回滚了
上周在江宁。一个雨夜。手机响。屏幕上是老周发的:3号泵升级失败,已回滚。人没事,泵没停。我盯着那行字,困意一下散了。不是吓的,是有点想笑——这套固件来回折腾半个月,真正救场的不是新功能,是回滚。技术迭代升级这个词,平时挂在PPT上很轻。落到泵站控制柜里,很重。重到一次刷写失败,可能让整条管网压力掉下去。
我干过几年嵌入式现场。后来跑软件大道写方案,再后来还是回现场。说实话,我越来越不信“一键升级”这四个字。你看手机升级失败,大不了黑屏半小时。工业设备不一样。泵在转,阀门有压,PLC在扫IO,后台还在收数据。你要在这个时候动它的固件,跟给跑着步的人换鞋差不多。能换,但得有人扶,得有备用鞋,得知道换坏了怎么退回来。

工业泵站控制柜远程固件升级现场照片
OTA不是把文件丢过去,它是一套撤退路线
先把这个词掰开。OTA,Over-the-Air,空中下载升级。听着玄,其实就是设备通过4G、以太网或者现场Wi-Fi,把新固件包拿下来,写进自己的Flash里。
难的不是“下载”。难的是“写完还能起来”。更难的,是“起不来还能回去”。
现在很多设备用A/B双分区。Flash切成两套房子,A区住着当前固件,B区空着。设备在A区正常干活,后台把升级包塞进B区。写完不算完,还得校验。CRC看数据有没有坏,签名验签看包是不是自己人发的。两个都过了,置一个升级标志位,重启。重启后bootloader先睁眼,它不看业务代码,只看标志位和校验结果。B区靠谱,就跳过去;不靠谱,就退回A区。整个过程像南京地铁夜里停运检修——白天跑车,夜里换轨。换不好,早班车还得开。

嵌入式设备A/B双分区固件升级回滚流程图
有人问,差分升级是不是能省很多流量?能。后台拿旧版本和新版本做差,设备端只下补丁,再本地合并。补丁小,现场网络烂的时候很香。但别忘了,合并要旧版本完整、要算力、要内存。MCU那点RAM,抠抠搜搜。补丁合并到一半断电,B区就废了。所以差分包也得配完整包兜底。别把省流量省成省命。
双分区不是万能药,它只是把风险挪了个地方

双分区不是万能药,它只是把风险挪了个地方
我见过一个误区:设备能OTA,就被叫智能设备。扯。能远程升级只说明它有个通信口和一段bootloader。真正的技术迭代升级,考的是版本管理、灰度节奏、失败回滚、现场可观测性。少一样,都是半吊子。
双分区也有代价。Flash容量翻倍。B区平时空着,老板看着心疼。bootloader本身也可能有bug,它要是挂了,A/B都白搭。所以有些安全关键设备做双bootloader,或者留一个不可改的恢复模式。还有看门狗,得盯住启动过程。B区启动卡死,看门狗复位,bootloader再判一次,回A区。这个链条里任何一环偷懒,回滚就是纸上的。
再说灰度。别一次推全站。先挑一台不重要、但现场有人看着的设备。推5%,观察两天。看启动日志、看通信心跳、看业务指标。没问题再放量。后台要能看见每台设备的当前分区、版本号、上次升级结果。没有这些,升级就是蒙眼开车。还有断电续传。现场配电柜跳闸不稀奇。包下到一半断了,下次接着下,别从头来。这些土细节,比发布会上的大词管用。
现场那点土办法,比版本号诚实

现场那点土办法,比版本号诚实
老周有个习惯。升级前,他拿手机拍一张控制柜屏幕,记下当前版本和参数。升级后再拍一张。两张照片往群里一丢。谁也别嘴硬。这个动作很土,但它把“我以为”变成了“我看见”。技术迭代升级到了现场,拼的不是谁的功能表长,是谁能证明自己没把设备搞坏。
还有个误解:版本号高就是新。未必。版本号是给人看的,签名和构建哈希才是给机器看的。后台推包,得按设备型号、硬件批次、区域策略匹配。同一款泵,A批次和B批次的IO板可能不一样。包推错了,轻则起不来,重则输出乱跳。所以升级包要带兼容性清单,设备端也要做前置检查:电压够不够,Flash余量够不够,当前业务允不允许停。业务不允许,就排队。升级不是目的,稳运行才是。
风险边界也得说清楚。涉及安全联锁、消防、医疗、车载刹车的设备,OTA不能随便开。功能安全认证摆在那,升级流程本身要被验证。现场还得有人确认,升级窗口要避开负荷高峰。南京夏天暴雨,泵站负荷高,你偏挑那时候推包,属于给自己找事。技术迭代升级的边界,不是技术画出来的,是场景画出来的。
写到这,窗外天有点亮了。老周又发来一条:3号泵B区起来了,版本对,压力稳。我回了个“收到”。没发表情包。心里那口气松了。技术迭代升级这事,说到底是给设备留后路,也给人留余地。新功能可以慢慢加,回滚按钮得先好用。