快来参与STM32 FOTA功能问卷调查!有奖品哦~~~~
问卷时间:2019年6月19日-28日
奖品:问卷结束后,从所有用户中抽取10位用户,赠送STM32双肩包。根据反馈的问卷内容,额外选取10位用户赠送STM32 NUCLEO-L496ZG开发板
---------------------------------------------华丽丽的分割线-----------------------------------------------------
今年上半年ST联合阿里云IoT共同推出了“物联网全栈开发”的IoT课程。讲述了如何使用STM32节点连接到阿里云IoT,并把汇聚的节点数据在用户服务器上做前、后端开发。目前,课程的全部讲义,包括节点端项目工程,服务器端项目工程,都已经上传到STMCU中文网站,供大家免费下载学习。课程开发工程师录制的视频讲解,也已经在AI电堂全部上线。当前1.0版本课程,主要向大家展示了IoT应用中数据流全栈开发的过程,这对于传统嵌入式工程师,和传统web开发工程师,都很有借鉴意义。
课程2.0版本,我们将回归到节点端,侧重以STM32为核心的功能扩展。1.0版本中,节点端实现的主要功能就是传感器数据的定时上报,以及对来自云端的下发指令进行接收和本地执行。这样一个以MQTT协议所承载的小体量数据双向通信,是当前iot应用最常见的使用场景。但是,随着节点设备大规模部署,设备的FOTA功能,越来越是一个成熟iot产品不可或缺的部分。FOTA(固件空中升级)可以缩短节点设备的上市部署时间。因为节点的新功能添加,已有功能的补丁安装,都可以通过FOTA来实现。这也从某个角度加强了IoT设备的安全性。
FOTA简单来说,无非就是通过无线传输,接收到新版本固件,然后更新STM32上自己的老版本固件。基于本系列课程的背景,我们仍然采用阿里IoT平台来实现设备的远程固件空中升级。课程采用的硬件,以Nucleo-L4R5ZI为核心、外扩sensor功能板,目前支持wifi连接;NB-IoT的窄带连接方式不久也会加入到课程体系中。
先说wifi连接方式下的FOTA。Wifi连接可提供较高的传输带宽,并且以wifi为连接方式的应用场景里,供电不是大问题,对低功耗并不敏感。基于这样的连接方式,使用全片升级是比较直接的方式。
想象一下:正常情况下,节点设备运行应用程序。某个时候收到“有新固件可推送”的通知(比如MQTT消息推送),下面需要做的是下载新版本固件。应用程序根据当前运行状况,在它觉得合适的时候,去开始下载任务。这里碰到第一个问题:下载功能,是作为应用程序的一部分,还是单独在bootloader里实现?
- 【A.1】在应用程序中实现:应用程序在合适的时候,启动对应功能(比如从MQTT消息中获得固件URL地址,开启HTTP get流程)
好处是:接收新版本固件这个小功能,本身可以升级
局限是:STM32的RAM会被下载功能和应用程序本身的功能,共用
- 【A.2】在bootloader中实现:应用程序在合适的时候,通过软件复位来运行bootloader
好处是:接收新固件时,不会运行应用程序。此时STM32的RAM可供bootloader自己完全使用。
局限是:bootloader本身得不到升级,需要考虑通信协议的成熟固定,安全性方面要能接受
- RAM是新版本固件,无论从本地usb/can,还是通过uart/spi接收无线模块传过来,到烧到STM32片上flash,两个步骤中间的缓冲区域。如果做差分升级,解差分算法本身也会消耗RAM资源。
紧接着,第二个问题:下载的新版本固件(通过RAM中转后)直接更新,还是先放起来?
- 【B.1】先放起来:这是一种典型的冗余升级,或者也可以叫“乒乓升级”
好处是:节点端有两个地方存储着可运行的应用固件(不同版本)。即使接收新固件的过程被意外打断,始终有一个区域里面包含的是可运行的固件代码,即使不是最新版本的。就算当前什么原因,断网或者通信接口受到干扰,本地设备总还是有可以运行的应用固件
局限是:方案成本相应增加
那么第三个问题:先放起来的话,放在哪里?
- 【C.1】放在STM32的片外flash: STM32目前不支持从片外flash执行代码,必须有一个额外的步骤来把片外flash中的内容烧写到片内flash中(所谓新版本固件的安装)
好处是:增加同样的存储容量,外扩flash的成本更低
局限是:从片外flash读取新版本固件烧写片上flash过程中的安全问题
【C.2】放在STM32片上flash上:
好处是:安全性相比【C.1】高一些
局限是:成本相比【C.1】也高一些
- 【B.2】收到后直接更新:这里的直接更新,实际暗含的意思是节点端只有一份存放应用程序的地方,所谓“原位升级”。那么这个“下载”和“更新”的功能,一定是由bootloader来运行
不同的分支,会有不同的实现方案。从使用者的角度来说,几种实现方式的优势和局限,大略分析如下。
基于本次课程所采用的硬件(Nucleo-L4R5ZI、wifi扩展板、sensor扩展板),没有板上搭载STM32片外flash,因此case A和case D先不考虑。
【题目一(多选)】大家在自己的应用中,比较倾向于采用以上哪一种,或哪几种?(方案编号参考上图“case #”栏)
【题目二(多选)】本系列课程仍然基于阿里云IoT来做设备的FOTA,您的IoT应用中会使用什么样的云平台做FOTA这样的设备管理
【题目三(多选)】如果您也是使用阿里云IoT平台,节点设备是如何连接的?
【题目四(多选)】您的IoT应用中,在和云平台或者自己的服务器连接过程中,使用TLS/DTLS来建立安全的通道吗?
目前,随着NB-IoT模块的普及,很多IoT应用节点采用了这样的低功耗连接方式。和Wifi连接不同的是,窄带传输和低功耗是此类应用比较关注的地方,并且由于流量会计入资费,做设备FOTA时往往有另外一些考量。
- 设备固件的迭代,大多时候只是部分功能有更新,其他模块并没有变化。这样,只需要传输更新的部分即可,所谓“部分升级”。
- 更多的情况下,更改并不仅限于某几个函数,改动涉及的范围比较大,使用差分算法可以极大压缩需要在空中传输的数据包大小,所谓“差分”升级。它也在以NB-IoT和LoRa为传输基础的窄带IoT应用中得到了广泛的应用。
差分制作和解差分算法,是差分升级的核心。用户使用差分服务提供商的在线差分包制作工具,生成差分包;通过集成在STM32里的解差分还原能力,把新版本固件恢复出来并安装。STM32和差分升级服务提供商有着密切合作,基于STM32F0、F1、F4、F7,L0、L4等多个系列,都有适配,可以提供参考实现。差分升级服务的收费通常有两种模式:
- 按照连接到升级平台的设备数量收费。比如,部署了2000台设备,需要通过服务商的差分升级平台进行管理。一台设备1块钱,包终生升级
- 更加适合大众市场的方式:按照实际升级次数收费,一台设备升级一次1毛钱
【题目五(多选)】在您的IoT应用中,尤其是窄带传输的应用场景,对升级的方案考虑是怎样的?
【题目六(多选)】您的IoT应用中,节点端是怎样的拓扑结构
【题目七(多选)】在您的IoT应用中,数据的流转路径是怎样的?
设备的固件升级从某种角度可以加强IoT设备的安全性,因为新功能的添加和已有功能的改善都可以通过FOTA来实现,使得设备可以在其生命周期内可以不断迭代,而无需物理设备的召回。但是固件升级本身的安全性(security)如果不能得到保障,后续的一切都是空谈,反而可以被恶意的攻击者利用,作为破坏系统的一个入口。
- 黑客可以替换掉固件。一个来源不可靠的固件安装到节点设备上,轻则不能运行,让设备变砖;重则若它被注入了恶意代码,设备安装该固件后给系统留了后门,后果更是不堪设想。
- 另外,如果固件在传输过程中没有任何防护措施地明文传输,固件可以被所有人获得,也可以被中途拦截而被人为修改。
- 还有一点不容忽视,没有设备固件的安全启动,以上列举到的环节即使都做到了,系统的安全,包括安全固件升级也是空中楼阁。
【题目八(多选)】在您的FOTA应用中,固件升级的“安全性”是如何考虑和应用的
|