你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【外网项目分享】安全的OTA固件更新与STM32通过6LoWPAN和CoAP

[复制链接]
STMCU-管管 发布时间:2019-3-7 17:15
演示一个安全和强大的固件更新,使用超过6LoWPAN且带有STMicro L152RE和Spirit1 sub-GHz 的CoAP


介绍

本演示的目的是展示如何使用本地IP端从Internet上的网页搜索一个用于小型低功耗物联网设备可以更新映像的AES-128加密固件,并将其安装到高可用性物联网MCU设备的内部闪存中,设备内部flash分为5个部分:

- 引导部分:一个简单的不可更新的引导加载程序。

- 一个完全独立的供应应用程序,包含仅在MTA部分的设备制造和配置期间使用的特性和功能。

- 两个大小相同的可执行应用程序部分称为APP1和APP2。

- 一个名为data的数据节,根据应用程序的需要存储开始时数据和运行时数据。

- 演示中使用了两种类型的固件映像文件:

MAN映像(制造的缩写)是bootloader、MTA和APP二进制文件的组合,在设备锁定并下线之前,将其编程到设备的内部闪存上。

APP图像是实现设备主要功能的应用程序。应用程序包含OTA更新逻辑、网络栈和/或接口以及操作系统,因此所有对设备执行重要的组件都被更新。应用程序使用AES-128-CBC加密。根据OTA的更新逻辑,可以将应用程序放入APP1或APP2部分。

当设备第一次使用MAN固件映像编程时,应用程序映像驻留在APP1部分,APP2是空的。引导加载程序在这两个部分中检查一个有效的应用程序,并引导最新的版本——在本例中是APP1部分中的应用程序。

演示应用程序位于可配置IPv4地址的CoAP服务器,以确定是否存在更新的固件映像。当一个新的应用程序映像可用时,它通过CoAP块传输机制下载。应用程序映像本身使用软件AES引擎(STM32L152没有硬件AES引擎)实时解密,并存储在APP2部分中。此演示中的更新逻辑将在验证存储的映像后自动并立即重新启动设备。然后引导加载程序确定新映像是有效的,并跳转到它,完成更新过程。

如果更新随时中断,例如中路在下载或在一个flash编写,或者如果图像不可能完全正确地编写APP2部分,引导装载程序不会接受APP2的内容,继续引导现有的应用程序。这是一个非常复杂的更新过程,用于在现实环境中运行的物联网设备的设计,不需要外部组件。然而,这是有代价的——应用程序可用的内部闪存数量减少了一半。幸运的是,在MCUs (512KB)的STM32L15x行上有足够的flash来托管完整的Contiki栈以及er-coap之类的应用程序。

会发生什么呢?

运行在STM32L152上的固件应用程序将通过从托管并指向固件的CoAP服务器上下载本质上相同的应用程序的新版本来更新。

完成演示的步骤

设置CoAP服务器。您需要安装node.js,并将iot-ota-server-coap.js脚本放在具有必要依赖项的目录中(例如node-coap)。这里最简单的操作可能是签出iot-ota-server respository并遵循自述中的说明。本演示的OTA固件更新文件已经提交到更新目录中。

组装硬件。组装如下图所示的NUCLEO-L152RE和X-NUCLEO-IDS01A5膨胀板,用USB线连接到你的电脑。将跳线从3.3V连接到PA0,选择初始引导的供应应用程序(MTA),以便设置CoAP服务器的IPv4地址。

想一下,这里没有网关,也没有协议翻译器。由设备(UDP)发出的数据包从一个路由器传递到另一个路由器,并由Internet上任何可到达的地址接收,与生成的完全一样。这才是真正的物联网!




您还需要设置边界路由器!这不是演示的一部分,因为理论上任何兼容的6LoWPAN边界路由器都可以工作。但是,演示固件是用参数构建的,这些参数允许它与STMicro的Wifi-Bridge的边界路由器应用程序通信,该应用程序在他们的FP-NET-6LPWIFI1解决方案中作为现成的二进制文件提供。如果下载并安装这个包,您会发现边界路由器二进制文件是Projects/Multi/Applications/WiFi-Bridge/ binary /STM32F401RE-Nucleo/STM32F4xx-Nucleo-WiFi-Bridge-IDS01A5.bin,您可以使用拖放方法将其加载到NUCLEO-F401RE上。然后将X-NUCLEO-IDW01M1和X-NUCLEO-IDS01A5连接到NUCLEO-F401RE上,并加载wi - bridge固件,固件会提示你设置WiFi连接参数,这就决定了你接下去做什么。

获取节点固件文件,下载OTA-STM32L1-SPIRIT1_x_x_x_MAN_x.bin固件二进制编程文件到您的PC上的一个文件夹中。这个二进制文件可以用嵌入STLink on NUCLEO boards (mbed方法)的“drag-n-drop”编程方法进行编程。将二进制文件拖到插入核子板时弹出的质量存储设备上,或者可以使用固件编程工具fm_load,它也支持对STM32L152RE设备进行编程。

启动终端。在核子的“STMicroelectronics STLink Virtual COM Port (COMX)”上以115200波特的速度启动终端模拟器会话/连接。选择由您的PC分配的COM端口。

加载固件。将MAN固件二进制fm_load ota - stm32l1 - spirit1_1_0_31_man_0x58e59cc .bin拖拽到由于插入了核子板而在PC上打开的海量存储设备上。观察装载过程直至完成(100%)。

观察串行终端窗口的输出,它显示了MTA供应应用程序菜单,我们将使用该菜单设置OTA更新服务器的IP地址,接下来我们将使用该菜单设置OTA更新服务器的IP地址。

提供设备的OTA更新服务器设置,要做到这一点,我们必须启动到设备的MTA(制造测试应用程序)拉高PA0和重置董事会。连接如图所示的X-NUCLEO-IDS01A5连接器引脚CN6-4 (Vcc)和CN8-1 (PA0)之间的短跳线,按下核子上的复位(蓝色)按钮。

串行终端将显示一个越来越多的选项填充菜单,允许您设置Wifi、设备(云)和OTA服务器设置。我们需要为这个演示设置OTA服务器的IP地址;其余的可以保持未设置。输入托管CoAP服务器的计算机的IPv4地址。
************************************************************************
IoT Core Provisioning MTA for NUCLEO-L152RE-SPIRIT1
************************************************************************

WiFi Settings:

SSID: not set
Security Type: OPEN
Passkey: not set

1) Set SSID
2) Set Security Type
3) Set Passkey

Device Settings:

NOT USED: not set
NOT USED: not set
NOT USED: not set

7) Set NOT USED
8) Set NOT USED
9) Set NOT USED

OTA Settings:

OTA server IP: not set

a) Set OTA server IP address


>

完成后,使用菜单选项4)保存设置,将设置提交到flash中,从3.3V引脚上取下跳线,但将另一端连接起来——你可能会希望它可以“回滚”来更新,以便进行额外的测试。

执行更新。重置主板(确保跳线断开),重新引导到主应用程序。这一次,它应该连接到本地6LoWPAN网络,并继续下载和安装来自CoAP服务器的固件更新,固件更新的名称为OTA-STM32L1-SPIRIT1_1_1_31_APP_0xF63D0305.fmu。

下面的输出中有几个注意事项。

首先注意,“APP2版本”是0.0.0,表示该部分中没有任何内容。

该节点的设计目的是将STM32CubeFunctionPack_6LPWIFI_V2.0.0函数包中的股票“WiFi-Bridge”项目二进制文件作为项目/多/应用程序/WiFi-Bridge/ binary /STM32F401RE-Nucleo/STM32F4xx-Nucleo-WiFi-Bridge-IDS01A5.bin

更新一般是在节点连接到边界路由器(也称为WiFi网桥)时才会启动,当您看到控制台中打印的一系列RPL信息消息表明一个首选DAG已经加入时,就可以知道它已经连接上了,即RPL: preferred DAG aaaa::1151:3433:6834:6d31。地址对于您的节点是唯一的,但是IPv6前缀被固定为“aaaa”,这是连接到STM无线网桥边界路由器所必需的。
************************************************************************
IoT Core OTA Update Demo APP for NUCLEO-L152RE-SPIRIT1
************************************************************************
BOOT version: 1.0.31
MTA version: 1.0.31
APP1 version: 1.0.31
APP2 version: 0.0.0
Current APP version: 1.0.31
Client IPv6 addresses:
aaaa::3b34:3239:5136:710c
fe80::3b34:3239:5136:710c
autostart_start: starting process 'Ota Test Process'
Starting OTA Update process.
Provisioning data retrieved.
  OTA server IPv4 address: 192.168.1.64
Press the user button to initiate OTA firmware update
after connection with the border router is established.
OTA Erbium CoAP client will contact server at: ::FFFF:192.168.1.64 : 5683 /updates
autostart_start: starting process 'Ota Update Process'
RPL: New instance detected (ID=30): Joining...
RPL: rpl_add_parent lladdr @200018f4 fe80::1151:3433:6834:6d31
RPL: Adding fe80::1151:3433:6834:6d31 as a parent: succeeded
RPL: rpl_set_preferred_parent fe80::1151:3433:6834:6d31 used to be NULL
RPL: Joined DAG with instance ID 30, rank hu, DAG ID aaaa::1151:3433:6834:6d31
RPL: Adding default route through fe80::1151:3433:6834:6d31
RPL: rpl_process_parent_event recalculate_ranks
RPL: Preferred parent update, rank changed from 384 to 345
RPL: Moving in the instance from rank hu to hu
RPL: The preferred parent is fe80::1151:3433:6834:6d31 (rank 1)
RPL: Prefix announced in DIO
RPL: Prefix set - will announce this in DIOs
RPL: rpl_set_prefix - prefix NON-NULL
RPL: Set dag aaaa::1151:3433:6834:6d31 lifetime to 3145
RPL: Received consistent DIO
RPL: preferred DAG aaaa::1151:3433:6834:6d31, rank 345, min_rank 345, parent rank 128, link metric 217
RPL: rpl_process_parent_event recalculate_ranks
xdc.runtime.Main: line 210: Starting CoAP update, state=0
--Requesting /updates--
::FFFF:192.168.1.64 : 5683
  updating...392f7c38, 90608, 89504
[Updating: 256/90624 0%]
RPL: rpl_process_parent_event recalculate_ranks
RPL: Preferred parent update, rank changed from 345 to 277
[Updating: 512/90624 0%]
[Updating: 768/90624 0%]
[Updating: 1024/90624 1%]
RPL: rpl_process_parent_event recalculate_ranks
RPL: Preferred parent update, rank changed from 277 to 260
[Updating: 1280/90624 1%]
[Updating: 1536/90624 1%]
[Updating: 1792/90624 1%]
[Updating: 2048/90624 2%]
RPL: rpl_process_parent_event recalculate_ranks
RPL: Preferred parent update, rank changed from 260 to 256
[Updating: 2304/90624 2%]
[Updating: 2560/90624 2%]
[Updating: 2816/90624 3%]

....

[Updating: 88576/90624 97%]
[Updating: 88832/90624 98%]
[Updating: 89088/90624 98%]
RPL: rpl_process_parent_event recalculate_ranks
[Updating: 89344/90624 98%]
[Updating: 89600/90624 98%]
[Updating: 89856/90624 99%]
RPL: rpl_process_parent_event recalculate_ranks
[Updating: 90112/90624 99%]
[Updating: 90368/90624 99%]
COMPLETE
[Updating: 90624/90624 100%]
[Updating: 90624/90624 100%]

--Done--
Contiki going down NOW!

这个更新在功能上与前一个版本相同,只是版本“次要”数字从0增加到了1,并且在横幅中有一条额外的消息表明更新后的应用程序正在运行。更新完成后,板会自动重新引导,你应该会看到更新后的应用程序在STM32L152内部flash的APP2部分中运行。


************************************************************************
IoT Core OTA Update Demo APP for NUCLEO-L152RE-SPIRIT1
Running the updated APP!
************************************************************************
BOOT version: 1.0.31
MTA version: 1.0.31
APP1 version: 1.0.31
APP2 version: 1.1.31
Current APP version: 1.1.31

回滚的更新,重新连接PA0和3.3V之间的跳线,复位板进入MTA。菜单将有一个新选项5)回滚固件更新,如下所示。选择此选项并与y确认。
************************************************************************
IoT Core Provisioning MTA for NUCLEO-L152RE-SPIRIT1
************************************************************************

WiFi Settings:

   SSID: not set
   Security Type: OPEN
   Passkey: not set

   1) Set SSID
   2) Set Security Type
   3) Set Passkey

Device Settings:

   NOT USED: not set
   NOT USED: not set
   NOT USED: not set

   7) Set NOT USED
   8) Set NOT USED
   9) Set NOT USED

OTA Settings:

   OTA server IP: 192.168.0.1

   a) Set OTA server IP address
5) Rollback a firmware update
> 5 rollback to version 1.0.31 from 1.1.31 y/n?

中断更新。再次将跳线从3.3V引脚上取下,复位主板启动主应用程序。此时,可以在更新过程中按复位按钮,也可以对主板进行电源循环。在此阶段,图像的一部分已经在内部flash中写入APP2部分,并且可能正在进行flash写入操作。当应用程序再次启动时,它仍然保持原样,与以前一样——当前版本将继续报告1.0.31。

这是怎么回事呢?

引导加载程序、制造测试应用程序和主应用程序独立开发、编译,并与完整的向量表链接。在构建后(“发布”)步骤中,它们被组装到组合的MAN映像中。同时,应用程序映像被嵌入到固件更新容器格式中,该格式允许重新定位固件映像(.fmu),然后进行加密。您可以确认.fmu文件是加密的,方法是注意到文件中没有向量表的证据,包括典型的word偏移量0和1处的SP和PC初始化值。你如果使用十六进制编辑器在.fmu文件的任何位置更改一个字节,更新将在最后的验证阶段失败。

引导加载程序位于MAN映像的开头,编程之后,它被放置在Cortex-M处理器希望应用程序在启动时驻留的位置。引导加载程序执行自我测试,检查MTA选择pin (PA0)的状态,并验证所有应用程序映像的完整性,以决定在何处设置处理器的VTOR(向量表偏移寄存器)。一旦设置了VTOR, PC(程序计数器)将被移动到目标应用程序的重置向量(在目标应用程序的向量表的word偏移量1处指定)。引导加载程序的工作到此结束,应用程序的启动过程接管并根据应用程序的需要重新配置设备。

如果引导加载程序遇到任何致命错误,它将向端口PA5发出错误条件的信号——方便地连接到核子- l152re的用户LED LD2上。

主应用程序是用Contiki OS构建的。康智奇的Erbium CoAP客户端未经修改,使用CoAP的块传输模式处理固件更新映像的传输任务。选择了256字节的块来提供良好的总体数据流。

加密密钥存储在应用程序中,因此很容易在MAN映像中被检查。然而,MAN映像不是正态分布的,而是仅用于“受信任的”产品制造环境(例如工作台、实验室或设施)。一旦男人图像编程到设备,和JTAG访问端口已经禁用启用和flash保护级别2,加密密钥实际上固件内容本身不再是容易,任何人都可以访问你的固件更新文件或对你的设备的物理访问。

接下来是什么

从一个小的、低功耗的MCU设备到一台服务器的端到端的固件更新,可以托管在地球上的任何地方,并且使用它的本地语言(IP),这是实现我们都期待的数十亿设备物联网的一个巨大的进步,但这仅仅是个开,。扩展固件更新以支持数千(更不用说数十亿)将需要一种不同的、更自定义的方法,利用6LoWPAN堆栈、RPL和TSCH的独特功能。


iot-ota-server-master.zip (95.18 KB, 下载次数: 6)
收藏 评论2 发布时间:2019-3-7 17:15

举报

2个回答
radio2radio 回答时间:2019-3-7 19:52:07
安全的OTA固件更新与STM32【超过】6LoWPAN和CoAP

这里的【超过】,是不是over,通过的意思。

点评

已改,谢谢纠正  发表于 2019-3-8 16:16
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版