|
本帖最后由 点点&木木 于 2018-12-7 11:02 编辑 用STMicro L152RE和Spirit1 sub -ghz的无线电向6LoWPAN展示一个安全可靠的无线固件更新。
项目中使用的东西 硬件组件 意法半导体STM32核-64板 ×1 NUCLEO-L152RE作为节点 意法半导体STM32核-64板 ×1 NUCLEO - f401re作为边界路由器 意法半导体X-NUCLEO-IDS01A5 ×2 意法半导体X-NUCLEO-IDW01M1 ×1 软件应用和在线服务 固件模块OTA-STM32L1-SPIRIT1固件二进制 介绍 本演示的目的是展示aes - 128如何将微小、低功率的IoT设备的固件更新映像从因特网上的任何地方使用本机IP端到端地检索到,并安装到高性能iotmcu设备的内部闪存中。设备内部flash分为5个部分: 引导部分中的一个简单的不可更新引导加载程序。 一个完全独立的供应应用程序,包含在MTA部分的设备制造和配置期间使用的特性和功能。 两个大小相同的可执行应用程序部分称为APP1和APP2。 一个名为data的数据部分,根据应用程序的需要存储供应的数据和运行时数据。 本演示使用了两种类型的固件映像文件: MAN image(简称MANufacturing)是bootloader、MTA和APP二进制文件的组合,它被编程到设备内部的flash上,然后锁定并下线。 APP图像是实现设备主要功能的主要应用程序。应用程序包含OTA更新逻辑、网络栈和/或接口和操作系统,因此对设备执行至关重要的所有组件一起更新。该应用使用ae -128- cbc加密。根据OTA更新逻辑,可以将应用程序放入APP1或APP2部分。 当设备第一次使用MAN固件映像进行编程时,应用程序映像驻留在APP1部分,APP2为空。引导加载程序在这两个部分中检查一个有效的应用程序,并引导最新的(最高版本)——在本例中是APP1部分中的应用程序。 演示应用程序在可配置的IPv4地址上询问CoAP服务器,以确定是否存在更新的固件映像。当一个新的应用程序映像可用时,它将通过CoAP块传输机制下载。应用程序映像本身使用软件AES引擎(STM32L152没有硬件AES引擎)动态解密,并存储在APP2部分。本演示中的更新逻辑将在存储映像中经过验证后自动并立即重新引导设备。然后引导装载程序确定新映像是有效的,并跳转到它,完成更新过程。 如果更新突然中断,例如中路在下载或在一个flash编写,或者如果图像不可能完全正确地编写APP2部分,引导装载程序不会接受APP2的内容,继续引导现有的应用程序。这是一个非常健壮的更新过程,专为在真实环境中操作的物联网设备设计,不需要外部组件。然而,这是有代价的——应用程序可用的内部flash数量减少了一半。幸运的是,STM32L15xMCUs (512KB)上有足够的flash来托管完整的Contiki堆栈以及er-coap等应用程序。 这会发生什么呢? 在STM32L152目标单片机上运行的固件应用程序将通过从一个CoAP服务器下载相同的应用程序的新版本来更新,您将托管该应用程序并将固件指向该服务器。 完成演示的步骤 设置CoAP服务器。你需要节点。安装js和iot-ota-server-coap。js脚本,位于具有必要依存性的目录内(如节点coap)。也许在这里最简单的事情是签出对应的iot-ota-server,并按照自述文件中的说明操作。这个演示的OTA固件更新文件已经提交到更新目录中。 组装硬件。组装如下图所示的NUCLEO-L152RE和X-NUCLEO-IDS01A5扩展板,用USB线连接到电脑上。连接一个从3.3V到PA0的跳线,选择用于初始引导的供应应用程序(MTA),以便设置CoAP服务器IPv4地址。 想一下。这里不涉及网关,也不涉及协议转换器。由设备(UDP)发出的数据包从一个路由器传递到另一个路由器,并由Internet上传到任何可到达的地址接收。这才是真正的物联网!
您还需要设置边界路由器!这不是演示的一部分,因为理论上任何兼容的6LoWPAN边界路由器都可以工作。然而,演示固件是用参数构建的,这些参数允许它与STMicro的Wifi-Bridge边界路由器应用程序通信,该应用程序在其FP-NET-6LPWIFI1解决方案中是一个现成的二进制文件。如果您下载并安装这个包,您会发现边界路由器二进制文件作为项目/ Multi /应用程序/ wi - fi桥接程序/二进制文件/ stm32f401 -nucleo / stm32f4xx - nucleo - wi - fi桥接程序- ids01a5。你可以用drag-n-drop法把它装载到核- f401re上。将X-NUCLEO-IDW01M1和X-NUCLEO-IDS01A5连接到NUCLEO-F401RE上,装入wifi桥接固件。固件会提示你设置WiFi连接参数,这就是你要做的一切! 获取节点固件文件。下载OTA-STM32L1-SPIRIT1_x_x_x_MAN_x。将固件二进制编程文件存储到PC上的文件夹中。这种二进制文件可以用“drag-n-drop”编程方法进行编程,这种编程方法可用于核板上的嵌入式STLink (mbed方法)。将二进制文件拖到插入NUCLEO板时弹出的大容量存储设备上。或者,您可以使用固件编程工具“fm_load”。它还支持STM32L152RE设备的编程。 启动终端。在核板的“STMicroelectronics STLink Virtual COM Port (COMX)”以115200波特启动终端模拟器会话/连接。选择由您的PC分配的COM端口。 加载固件。拖动MAN固件二进制fm_loadOTA-STM32L1-SPIRIT1_1_0_31_MAN_0x58E59CCB。由于插入了核板,在您的PC上打开了大容量存储设备的存储箱。观察加载到完成的进度(100%)。 观察串行终端窗口的输出,该窗口显示MTA供应应用程序菜单,我们将使用该菜单设置OTAupdate server IP地址,接下来我们将使用该菜单。 提供设备的OTA更新服务器设置。要做到这一点,我们必须引导到设备的MTA(制造测试应用程序)通过拉高PA0和重置板。如图所示,在X-NUCLEO-IDS01A5连接器引脚CN6-4 (Vcc)和CN8-1 (PA0)之间连接一根短跳线,按下核板上的reset(蓝色)按钮。 串行终端将显示一个越来越多的选项菜单,允许您设置Wifi,设备(云)和OTA服务器设置。本演示只需要设置OTA服务器的IP地址;其余的可以保持不变。输入托管CoAP服务器的计算机的IPv4地址。 ************************************************************************ IoT CoreProvisioning 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 DeviceSettings: 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 > 完成后,提交设置flash菜单选项4)保存设置。从3.3V引脚上拆下跳线,但另一端要保持连接—稍后您可能需要再次使用它来“Rollback”更新以进行额外的测试。 执行更新。重置板(确保跳线断开),引导回主应用程序。这一次,它应连接到您的本地6LoWPAN网络,然后继续下载并安装来自CoAP服务器的固件更新,如ota - stm32l1 - UNK t1_1_1_31_app_0xf63d0305 . fmu。 下面的输出中有几个注意事项。 首先注意“APP2版本”是0.0.0,表示该部分中不存在任何内容。 该节点被设计成与STM32CubeFunctionPack_6LPWIFI_V2.0.0函数包中存储的“wifi桥”项目二进制文件作为项目/Multi/应用程序/ wifi桥/二进制文件/ stm32f401renucleo / stm32f4xx - nucleo - wifi桥- ids01a5 .bin进行通信 当节点连接到边界路由器(又称WiFi桥)时,更新才会开始,当看到控制台打印的一系列RPL信息消息表明已经连接了首选DAG,即RPL: preferred DAGaaaa::1151:3433:6834:6d31时,您就知道它已经连接。该地址对于您的节点是唯一的,但是IPv6前缀被固定为“aaaa”,这是连接到STM WiFi-Bridge边界路由器所必需的。 ************************************************************************ 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 OTAUpdate process. Provisioningdata retrieved. OTA server IPv4 address: 192.168.1.64 Press the userbutton to initiate OTA firmware update afterconnection with the border router is established. OTA Erbium CoAPclient 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 CoAPupdate, 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 goingdown NOW! 这次更新的功能与之前的版本相同,只是版本“minor”的数字从0增加到了1,而且横幅上还有一条额外的消息,表示更新后的应用程序正在运行。更新完成后,核板会自动重新引导,您应该会看到更新后的应用程序正在运行STM32L152内部flash的APP2部分。 *********************************************************************** IoT Core OTA Update Demo APP forNUCLEO-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 APPversion: 1.1.31 Rollback的更新。重新连接PA0和3.3V之间的跳线,复位板进入MTA。菜单将有一个新选项5) Rollback固件更新显示。选择此选项并点击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引脚上取下跳线,复位板,启动主APP。现在,随着更新的进行,可以按复位键,也可以对核板进行电源循环。在这个阶段,图像的一部分已经在内部flash中写到APP2部分,flash写操作可能正在进行中。当应用程序再次启动时,它仍然保持不变,与以前相同—当前版本将继续报告1.0.31。 那么它是如何工作的呢? 引导加载程序、制造测试应用程序和主应用程序是独立开发、编译和链接的完整矢量表。在一个构建后(“发布”)步骤中,它们被组合成一个组合的MAN映像。同时,应用程序映像被嵌入到固件更新容器格式中,该格式允许重新定位固件映像(.fmu),然后进行加密。您可以确认.fmu文件是加密的,注意到文件中没有任何向量表的证据,包括SP和PC初始化值(通常在word偏移量0和1处)。您甚至可以使用十六进制编辑器在.fmu文件的任何地方更改字节,并且在最后的验证阶段更新将失败。 引导加载程序位于MAN映像的开头,在编程之后,它被放置在Cortex-M处理器希望应用程序在启动时驻留的位置。引导装载程序执行自我测试,检查MTA选择pin (PA0)的状态,并验证所有应用程序映像的完整性,以决定在何处设置处理器的VTOR(向量表偏移寄存器)。一旦设置了VTOR, PC(程序计数器)将被移动到目标应用程序的重置向量(在目标应用程序的向量表中的字偏移量1处指定)。引导装载程序的工作到此结束,应用程序的启动过程接管并根据应用程序的需要重新配置设备。 如果引导装载程序遇到任何致命错误,它被设计成将错误条件发送到端口PA5—方便地连接到NUCLEO-L152RE的用户LED, LD2。 主应用程序是用ContikiOS构建的。Contiki的Erbium CoAP客户端未经修改,使用CoAP的块传输模式传输固件更新映像。为了提供良好的整体数据流,选择了256字节的块。 加密密钥存储在应用程序中,因此很容易在MAN映像中被检查。然而,MAN映像不是正态分布的,而是只打算在“trusted”的产品制造环境(例如工作台、实验室或设施)中使用。一旦MAN映像被编程到设备上,并且禁用了JTAG访问端口,启用了flash保护级别2,加密密钥以及固件内容本身就不再容易被任何能够访问您的固件更新文件或设备物理访问的人访问。接下来是什么 在数十亿设备物联网中,我们都期待从微小的低功率MCU设备到可以在地球上任何位置上托管的服务器的端到端固件更新,是一个巨大进步。但这还只是开始。将固件更新扩展到支持数千(更不用说数十亿)需要一种不同的、自定义的方法,利用6LoWPAN堆栈、RPL和TSCH的独特功能。 代码 OTA固件更新服务器 OTA固件更新CoAP服务器编写的node.js firmwaremodules / iot-ota-server 无线物联网设备固件更新服务器使用CoAP 相关文件—
iot-ota-server-master.zip
(95.18 KB, 下载次数: 0)
|
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版