今年上半年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先不考虑。
请长按识别二维码到问卷页面进行内容填写
问卷调查有效期:2019年6月19日-28日
活动结束后抽取10名参与用户赠送STM32双肩包,根据问卷反馈内容,还会追加抽取10名用户赠送STM32 NUCLEO-L496ZG开发板
以下问卷内容仅供浏览
具体内容填写请扫描二维码后进行
【题目一(多选)】大家在自己的应用中,比较倾向于采用以上哪一种,或哪几种?(方案编号参考上图“case #”栏)
1. 方案A(bootloader负责下载,将新固件存放在外部flash,bootloader负责更新)
2. 方案B(bootloader负责下载,将新固件存放在STM32片上flash的其他扇区,通过PC指针切换来启动新版本应用程序)
3. 方案C(bootloader负责下载,不存放,直接更新当前应用程序)
4. 方案D(应用程序负责下载,将新固件存放在外部flash,bootloader负责更新)
5. 方案E(应用程序负责下载,将新固件存放在STM32片上flash的其他扇区,通过PC指针切换来启动新版本应用程序)
6. 或者您有特殊的方案组合要求,请在这里留言:________
7. 题目没有看懂,需进一步沟通
【题目二(多选)】本系列课程仍然基于阿里云IoT来做设备的FOTA,您的IoT应用中会使用什么样的云平台做FOTA这样的设备管理
1. 阿里IoT
2. 百度IoT
3. 华为云
4. 中移物联网OneNET
5. 自己服务器
6. 如果是其他公有云平台,请在这里留言:_____________
7. 题目没有看懂,需进一步沟通
【题目三(多选)】如果您也是使用阿里云IoT平台,节点设备是如何连接的?
1. STM32上运行原生paho的MQTT客户端,经过适配连到阿里云IoT
2. STM32上运行阿里的Linkkit SDK,使用SDK提供API连到阿里云IoT
3. STM32上仅运行应用逻辑,和阿里连接的协议部分运行在所用无线模块中
4. 如果还有其他方式,请在这里留言:__________
5. 题目没有看懂,需进一步沟通
【题目四(多选)】您的IoT应用中,在和云平台或者自己的服务器连接过程中,使用TLS/DTLS来建立安全的通道吗?
1. 没有使用TLS/DTLS
2. 没有使用TLS/DTLS,但通过自定义的数据格式(编码、校验)来实现传输一定程度上的数据机密性和完整性
3. 在STM32上使用了TLS/DTLS,采用的单向认证,仅认证对方服务器
4. 在STM32上使用了TLS/DTLS,采用的双向认证,设备认证对方服务器,服务器也认证节点设备
5. STM32上仅运行应用逻辑,安全连接部分(TLS/DTLS)交由无线模块处理
6. 题目没有看懂,需进一步沟通
目前,随着NB-IoT模块的普及,很多IoT应用节点采用了这样的低功耗连接方式。和WiFi连接不同的是,窄带传输和低功耗是此类应用比较关注的地方,并且由于流量会计入资费,做设备FOTA时往往有另外一些考量。
- 设备固件的迭代,大多时候只是部分功能有更新,其他模块并没有变化。这样,只需要传输更新的部分即可,所谓“部分升级”。
- 更多的情况下,更改并不仅限于某几个函数,改动涉及的范围比较大,使用差分算法可以极大压缩需要在空中传输的数据包大小,所谓“差分”升级。它也在以NB-IoT和LoRa为传输基础的窄带IoT应用中得到了广泛的应用。
差分制作和解差分算法,是差分升级的核心。用户使用差分服务提供商的在线差分包制作工具,生成差分包;通过集成在STM32里的解差分还原能力,把新版本固件恢复出来并安装。STM32和差分升级服务提供商有着密切合作,基于STM32F0、F1、F4、F7、L0、L4等多个系列,都有适配,可以提供参考实现。差分升级服务的收费通常有两种模式:
- 按照连接到升级平台的设备数量收费。比如,部署了2000台设备,需要通过服务商的差分升级平台进行管理。一台设备1块钱,包终生升级
- 更加适合大众市场的方式:按照实际升级次数收费,一台设备升级一次1毛钱
【题目五(多选)】在您的IoT应用中,尤其是窄带传输的应用场景,对升级的方案考虑是怎样的?
1. 自己实现差分升级
2. 自己实现部分升级
3. 还没有用上,但有兴趣了解更多
4. 对付费的差分升级服务有兴趣了解更多
5. 题目没有看懂,需进一步沟通
【题目六(多选)】您的IoT应用中,节点端是怎样的拓扑结构
1. STM32 + 2G模块
2. STM32 + 3G/4G模块
3. STM32 + WiFi模块
4. STM32 + NB-IoT模块
5. STM32 + LoRa模块
6. STM32 + ETH
7. 基于NB-IoT的open module
8. 基于2G/3G/4G的open module
9. 基于WiFi的open module
10. 基于LoRa的open module
11. 如果还有其他方式,请在这里留言:___________
12. 题目没有看懂,需进一步沟通
【题目七(多选)】在您的IoT应用中,数据的流转路径是怎样的?
1. 使用移动的NB-IoT网络,节点数据走UDP/TCP直接到自己的服务器
2. 使用移动的NB-IoT网络,节点时间走CoAP/MQTT到自己的服务器
3. 使用移动的NB-IoT网络,节点时间走CoAP/MQTT到公有云IoT平台
4. 使用移动的NB-IoT网络,节点数据走LwM2M协议到OneNET平台
5. 使用电信的NB-IoT网络,先到电信IoT平台,再转到自己的服务器
6. 使用电信的NB-IoT网络,先到电信IoT平台,再转到公有云IoT平台
7. 使用电信的NB-IoT网络,直接到自己的服务器
8. 题目没有看懂,需进一步沟通
设备的固件升级从某种角度可以加强IoT设备的安全性,因为新功能的添加和已有功能的改善都可以通过FOTA来实现,使得设备可以在其生命周期内可以不断迭代,而无需物理设备的召回。但是固件升级本身的安全性(security)如果不能得到保障,后续的一切都是空谈,反而可以被恶意的攻击者利用,作为破坏系统的一个入口。
黑客可以替换掉固件。一个来源不可靠的固件安装到节点设备上,轻则不能运行,让设备变砖;重则若它被注入了恶意代码,设备安装该固件后给系统留了后门,后果更是不堪设想。
另外,如果固件在传输过程中没有任何防护措施地明文传输,固件可以被所有人获得,也可以被中途拦截而被人为修改。
还有一点不容忽视,没有设备固件的安全启动,以上列举到的环节即使都做到了,系统的安全,包括安全固件升级也是空中楼阁。
【题目八(多选)】在您的FOTA应用中,固件升级的“安全性”是如何考虑和应用的
1. 暂时不需要安全方面
2. 有安全升级的需求,也有对安全升级所带来的需要更多flash容量的担忧,因此暂时没有做安全方面的实现
3. 目前没有实现安全机制,有兴趣,想了解更多
4. 方案中有实施一定程度的安全机制
5. 题目没看懂,需进一步沟通
【题目九(排序)】
关于安全FOTA中的几个要素,您看重的顺序是:____________
a-【固件密文传输】
b-【固件合法性认证】
c-【固件完整性检查】
d-【系统安全启动】
感谢大家踊跃参与!奖品等你来拿哦~!
更多内容,点击阅读原文