admin管理员组

文章数量:1530325

小伙伴儿们,如果觉得文章干货满满,欢迎加入公众号【编程识堂】,更多干货等你们来哦!

前言

在迅速变化和发展的物联网市场,新的产品需求不断涌现,因此对于智能硬件设备的更新需求就变得空前高涨,设备不再像传统设备一样一经出售就不再变更。为了快速响应市场需求,一个技术变得极为重要,即OTA空中下载技术。
物联网平台支持通过OTA方式进行设备固件升级,是智能设备修复系统漏洞、实现系统升级的手段,通过固件升级用户提供更好的服务。OTA固件升级功能不仅能够更新固件,而且还能重新配置片上硬件资源。同时,设备固件可通过OTA固件升级流程获得更新的补丁和更多安全算法防范病毒攻击。

什么是OTA升级

OTA升级:通过OTA方式实现固件或软件的升级;
只要是通过无线通信方式实现升级的,都可以叫OTA升级,比如网络/蓝牙。
那什么是有线升级呢,也叫做本地升级,比如我们平时为电脑装系统,就是提前将系统下载到U盘上,再通过USB连接连接到电脑上进行电脑系统升级,也就是说通过UART,USB或者SPI通信接口来升级设备固件就叫做有线升级;

OTA升级优势

市场端的快速上线需求
天下武功唯快不破,市场需要持续不断的创新,不断的增加用户需求,一般设备都会预留一些后加载技术,前期可以实现一部分功能即开始上线,后面通过敏捷开发,不断迭代新功能,通过OTA升级更新设备实现更多功能,实现渐进式部署;
运维成本低
通过OTA方式,可以对分布在各地的设备进行软件升级,而不必让运维人员各地奔波。
设备安全性及完善性
有了OTA固件升级的备案,那么产品不一定等到完全没有缺陷再上市,只要在不存在较为致命的缺陷下,就可以提前上市,解决问题后在远程完成升级修补缺陷。同时基于日益严峻的安全形势威胁,备固件可通过OTA固件升级流程获得最新补丁和更多安全算法,做到不断加固的。

OTA升级流程

小堂为大家列举两种方式OTA升级,MQTT升级与蓝牙升级
MQTT升级
流程图

升级步骤
● 设备唤醒后上报固件当前版本,服务端进行存储;
● 在控制台上传新固件,并配置升级计划及升级策略,比如全量升级、容灾升级 、指定设备升级等等;
● 根据升级计划对设备发送固件升级请求,下发固件URL给设备;
● 设备拿到固件URL后,进行固件升级,并上报升级进度至服务端
● 服务端接收到升级进度后返回至控制台展示,直至升级成功。
协议
设备上报固件版本
数据上行Topic
#设备通过这个Topic上报当前的固件版本信息。
iot/v1/s/[devId]/ota/uploadVerInfo
JSON数据格式

{
  "id": "123556",
  "params": {
    "version": "1.0.1",
    "deviceId":"3234234234242"
  }
}

参数说明
参数 类型 说明

id	        Long	消息ID号。每个消息ID在当前设备中具有唯一性
version	    String	OTA模块版本。
deviceId	String	当前设备id

OTA云端下发固件升级包信息至设备
数据下行Topic
#通过这个Topic推送升级包信息, 设备订阅该Topic可以获得升级包信息。

 iot/v1/c/[deviceId]/ota/execOtaReq

JSON数据格式

{
 "code": "1000",
 "data": {
   "size": 432945,
   "version": "2.0.0",
   "url": "https://iotx-ota-pre.oss-cn-shanghai.aliyuncs/ota/2.0.0/test.bin"
 },
 "id": 1626969597470,
 "message": "success"
}

参数说明
参数 类型 说明

id	    Long	消息ID号。每个消息ID在当前设备中具有唯一性。
message	String	结果信息。
code	String	状态码。
version	String	设备升级包的版本信息。
size	Long	升级包大小,单位:字节。
url	    String	升级包在对象存储(OSS)上的存储地址。

设备上报升级进度
数据上行Topic
#OTA升级过程中,设备可以通过这个Topic上报OTA升级的进度百分比。

 iot/v1/s/[deviceId]/ota/progressReq

JSON数据格式

{
  "id": "123",
  "params": {
    "step": "-1",
    "module":"default",
    "desc": "OTA升级失败,请求不到升级包信息。"
  }
}

参数说明
参数 类型 说明

id	    String	消息ID号。String类型的数字,取值范围0~4294967295,且每个消息ID在当前设备中具有唯一性。
step	String	OTA升级进度。
取值范围:
1~100的整数:升级进度百分比。
0:升级中。
-1:升级失败。
-2:下载失败。
-3:校验失败。
-4:烧写失败。
desc	String	当前步骤的描述信息,长度不超过128个字符。如果发生异常,此字段可承载错误信息。

蓝牙升级

时序图

升级步骤
以智能手表为例,介绍目前可能的一种DFU-OTA方案。手机端和云端的传输过程需使用安全的传输通道(如https)并进行加密处理和数字签名操作,保证传输过程中数据的机密性、完整性和合法性。在手机和手表已建立蓝牙连接的情况下:
● 手机端向手表设备查询当前设备信息(如当前固件版本)并回传给云端,云端将最新固件版本等信息回传给手机端;
● 手机端对比当前版本和最新版本,若当前版本不为最新版本,则向云端请求下载设备最新固件包等数据,云端返回相应数据。手机端需先对获取的固件包完整性和来源合法性进行校验;
● 如需升级,手机端发送升级指令和固件基本信息给手表;
● 手表端检查固件基本信息(版本等)无误以及相应的升级环境(电量要求、存储容量等)均满足后,返回允许升级信息。若相关信息有误或不满足要求,则不进行后续操作;
● 手机端发送升级包(根据具体的传输协议和固件大小,确定是否需要拆包发送);
● 手表端接收并校验固件的合法性(完整性和来源合法),校验无误后进入DFU模式进行设备升级,此时手表和手机端会自动断开;
● 设备升级完后需重启,重新连接手机后正常使用。

OTA安全风险

当前的OWASP物联网十大漏洞中,排名第四的就是缺乏安全的更新机制。固件验证缺失、明文数据传输、回滚机制缺失和安全更新通知的缺失是主要原因。OTA升级成功与否不仅关系到设备的安全性和可用性,还可能影响用户隐私和财产安全。整个过程中我们可能面临的风险如下:
● 传输过程中是否能窃取固件中敏感信息;
● 固件有没有被攻击者篡改;
● 固件是否来自受信任的来源;
● 目标设备端是否可信,是否会被身份伪造攻击;
● 攻击者使用具有漏洞的老版本对设备进行降级或替换;
● ……
对于传输过程,需要使用安全的无线通信协议,并且加密固件包,保证只有终端设备能够解密。对于固件防篡改,可以通过数字签名技术来保证固件的完整性和来源的安全:
● 服务端对固件文件进行哈希处理后,用服务端私钥签名,将签名值和固件数据等生成OTA.bin文件,上传到云端;
● 设备端接收OTA.bin文件后,提取出固件数据并以相同的方式进行哈希处理,得出一个哈希值。将OTA.bin文件中的签名用预置在设备的服务端公钥进行解密后的值,对比二者,如果相同则可以确定固件的完整性以及来源于合法的服务端。

OTA升级包验签

安全性要求较高的场景下,需在升级前进行服务端和设备端的双向认证,防止身份伪造攻击。可以在设备出厂前预先为每个设备烧录唯一的设备证书或身份标识,服务端需要验证该设备证书后,确认设备没有被篡改或仿冒,才能进行数据传输。设备端也需要验证服务端的身份,防止重放攻击,导致设备端可能会“无条件”再次执行服务端下发的控制指令,造成一些意想不到的安全问题。

结语

随着物联网市场发展越来越快,对物联网平台OTA升级带来了越来越大的挑战,需要我们一起完善更加健全的OTA平台。至此,小堂就将物联网产品设计部分的OTA设备固件讲完了,如果对小伙伴儿们有帮助的话,欢迎点赞、关注、转发,也可关注公众号 编程识堂,获取更多干货!

本文标签: 一文读懂设备OTA