[分享] 如何实现蓝牙空中升级BLE OTA(二)
666 查看
3 回复
 楼主 | 发布于 2019-04-29 | 只看楼主
分享到:

2.3 nRF5 SDK v12.3.0 OTA

SDK12目前只支持安全DFU(实际上是签名DFU),所谓签名DFU,就是bootloader中预先装载一个公钥,升级时,主机先发一个签名给bootloader,bootloader会对这个签名进行验签,验签通过后才能继续DFU,否则拒绝DFU。SDK12只有OTA DFU例子,而没有基于串口的DFU例程。SDK12 OTA DFU是基于例程ble_app_buttonless_dfu来实现的,而且SDK12同时支持nRF52832以及nRF51系列产品,下面我们以nRF52832(开发板编号:PCA10040)为例,来详细阐述SDK12是如何实现OTA的。

nRF52832 OTA

请大家先到百度云盘下载压缩包:DFU/SDK12_3/ Script_SDK12_S132_nRF52832.rar”并解压,然后对照以下步骤进行操作:

1)     准备。请先到百度云盘下载: micro-ecc_sdk12.rar,然后覆盖如下目录:

 

然后请按照http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.tools%2Fdita%2Ftools%2Fnrfutil%2Fnrfutil_installing.html&cp=5_5_1安装最新版nrfutil,nrfutil安装有两种方式,一种是直接下载exe文件,一种是以Python的方式进行安装。

nrfutil.exe直接下载链接为:(注:如果大家不熟悉Python,推荐使用这种方式)

https://github.com/NordicSemiconductor/pc-nrfutil/releases记得把nrfutil.exe所在目录放在Windows环境变量中。

或者你按照如下步骤去安装nrfutil:

注:安装完Python2.7后,需要修改Windows path变量值,如果你安装了老版本nrfutil,请先把老版本所在的目录C:\Program Files (x86)\Nordic Semiconductor\nRFgo Studio从path变量中删除,然后添加这2个目录:C:\Python27;C:\Python27\Scripts;

  • 通过pip安装最新版的nrfutil,即打开Windows命令行工具CMD,输入如下命令:pip install nrfutil,即可以完成nrfutil的安装。
  • 安装完成后,在Windows命令行工具输入:nrfutil version,其版本应该在3.2.0以上。
  • 对于Windows用户,nrfutil运行需要几个特殊的DLL库,而这几个库有些Windows机器是没有的,如此,可往:https://www.microsoft.com/en-us/download/details.aspx?id=40784下载。

2)     通过nrfutil生成公私钥对。大家可以直接双击“key_generate.bat”以生成相应的私钥(priv.pem)和公钥(dfu_public_key.c)。大家务必要保存好私钥priv.pem,以后每个新image要升级时,都会先通过这个私钥对它进行签名,一旦priv.pem丢失或者被暴露DFU将无法进行或者变得不安全

3)     编译bootloader代码。将刚才的dfu_public_key.c取代目录nRF5_SDK_12.3.0_d7731ad\examples\dfu\bootloader_secure下的同名文件,然后编译如下目录中的工程:

nRF5_SDK_12.3.0_d7731ad\examples\dfu\bootloader_secure\pca10040\arm5_no_packs,将hex改为:bootloader.hex

4)     编译application代码。请编译工程:nRF5_SDK_12.3.0_d7731ad\examples\ble_peripheral\experimental_ble_app_buttonless_dfu\pca10040\s132\arm5_no_packs,将hex修改为:app.hex

5)     生成bootloader settings page。Bootloader settings存储在Flash最后一个page,它将决定复位后芯片的行为,比如是进入DFU模式还是应用模式,同时它还包含image的CRC值和版本等信息。如果要求芯片复位后进入application,必须正确生成该bootloader settings hex,生成脚本见“settings_page_generate.bat”

6)     烧写softdevice,app和bootloader。请双击“mass_program.bat”来完成整个烧写过程。请注意,在烧写前,请把app.hex倒数第3行和倒数第4行删除,因为bootloader.hex也包含一模一样的内容,会导致merge的时候hex定义冲突,如下:

 

或者编译application的时候,把如下语句注掉:

 

7)     生成新image对应的zip包。请双击“zip_generate.bat”,以生成SDK12_app_s132.zip,升级时,该zip包将会由云端下发到手机app中。

8)     将“SDK12_app_s132.zip”拷贝到手机上。安卓和苹果手机都可以通过微信的‘文件传输助手’拷过去,非常方便。请注意,手机nRF Connect和nRF Toolbox都支持DFU功能,苹果手机拷贝的时候可以随便选择其中一个app。

9)     使用nRF Connect或者nRF Toolbox来完成DFU过程。这里以nRF Connect为例来阐述整个升级过程

  • DK广播为Nordic_Buttonless,如下

 

  • 连接该设备,使能CCCD,并选择“DFU”

 

 

 

  • 选择升级用的zip包。有些安卓系统自带的文件浏览器会有问题,建议使用ES explorer来选择zip,如下:

 

 

 

  • 开始升级

 

 

 

  • 升级成功,设备将自动启动,此时你会看到新image已经在运行,广播名字也变成Nordic_new,如下:

 

 

nRF51系列 OTA

nRF51822 OTA过程与nRF52832非常相似,唯一不同的是选择pca10028目录,请下载百度云盘脚本“DFU/SDK12_3/ Script_SDK12_S130_nRF51.rar”,然后按照上述52832的步骤来实现51822的OTA DFU。

后面我们会以SDK15.0.0 ble_app_uart为例,详细阐述如何把ble_app_buttonless_dfu的DFU功能移植到ble_app_uart上,从而让ble_app_uart也具有DFU功能,有兴趣的的读者请参考第3章。注意:SDK12.3.0 DFU原理跟SDK15.0.0非常相似,大家可以依葫芦画瓢,完成SDK12.3.0的DFU移植工作。

 

2.4 nRF5 SDK v11.0.0 OTA

SDK11使用的是明文OTA DFU,其DFU是基于例程ble_app_hrs来实现的,并同时支持nRF52832和nRF51系列。下面以nRF52832为例来阐述DFU过程。

nRF52832 OTA

请大家先到百度云盘下载压缩包:DFU/SDK11_0/ Script_SDK11_S132_nRF52.rar”并解压,然后对照以下步骤进行操作:

1)       编译bootloader代码,请编译目录“nRF5_SDK_11.0.0_89a8197\examples\dfu\bootloader\pca10040\dual_bank_ble_s132\arm5_no_packs”中的工程,将hex改为bootloader.hex

2)       编译app,请编译目录“nRF5_SDK_11.0.0_89a8197\examples\ble_peripheral\ble_app_hrs\pca10040\s132_with_dfu\arm5_no_packs”中的工程,将hex改为app.hex

3)       将softdevice,bootloader和app三者同时下载到设备中,另外我们还需要在Flash中写一个app有效标志位,从而上电后程序直接跑到app执行,而不是停留在bootloader中不出来。我已经把相关烧写脚本:mass_program.bat放在百度云盘中,大家直接双击就可以完成本步操作。

4)       将新image打包成一个zip包。除了包含新image,该zip包还包含一些配置信息。升级时,zip包会通过云端下发到手机端app,手机端app再把zip包传给蓝牙设备以进行固件升级。请使用老版本nrfutil(版本号0.3.0)来生成该升级包(注:老版本nrfutil在目录“C:\Program Files (x86)\Nordic Semiconductor\nRFgo Studio”中)。我已经把相关生成脚本zip_generate.bat放在百度云盘上,大家直接双击就可以完成本步操作,并生成SDK11_app_s132.zip。

5)       把上述的‘SDK11_app_s132.zip’拷到手机中,安卓和苹果手机都可以通过微信的‘文件传输助手’拷过去,非常方便。注:手机nRF Connect和nRF Toolbox都支持DFU功能,苹果手机拷贝的时候可以随便选择其中一个app。

6)       使用nRF Connect或者nRF Toolbox来完成DFU过程。这里以nRF Connect为例来阐述整个升级过程。

  • DK广播为Nordic_HRM

 

  • 连接该设备,并使能CCCD,然后选择“DFU”

 

 

  • 选择升级用的zip包。有些安卓系统自带的文件浏览器会有问题,建议使用ES explorer来选择zip,如下:

 

 

 

 

  • 开始升级

 

 

  • 升级成功,设备将自动启动,此时你会看到新image已经在运行,广播名字也变成Nordic_HRM_new,如下:

 

 

 

nRF51系列OTA

nRF51822 OTA DFU实现过程跟上述的nRF52832基本上一模一样,唯一不同的是选择pca10028目录,我已把相关脚本打包并放在百度云盘中,请直接下载“DFU/SDK11_0/ Script_SDK11_S130_nRF51.rar”,来实现nRF51系列 OTA。

如果你的应用是基于SDK11开发的,并且需要集成DFU功能,请参考上述例子ble_app_hrs来移植DFU功能,主要工作包括两部分:一把BLE_DFU_APP_SUPPORT这个宏包括的所有代码拷到你的工程中,二如果你的设备支持bonding的话,还需把Device manager相关代码也拷到你的工程中,如此即可完成DFU功能的移植。

3. 给ble_app_uart加上OTA功能

为了让ble_app_uart具有DFU功能,有2种做法,一是把NUS服务移植到ble_app_buttonless_dfu中,这种方法相对来说更简单,但不利于理解DFU的移植原理;二是把DFU服务移植到ble_app_uart中,我们现以第2种做法来详细阐述如何在SDK15.0.0中把DFU服务移植到ble_app_uart中。

3.1 正常连接OTA(无bonding)

1)     打开如下工程:nRF5_SDK_15.0.0_a53641a\examples\ble_peripheral\ble_app_uart\pca10040\s132\arm5_no_packs

2)     添加DFU服务。代码如下:

复制代码
#ifdef DFU_SUPPORT

    ble_dfu_buttonless_init_t dfus_init = {0}; // Initialize the async SVCI interface to bootloader.  err_code = ble_dfu_buttonless_async_svci_init();

    APP_ERROR_CHECK(err_code); 

    dfus_init.evt_handler = ble_dfu_evt_handler; 

    err_code = ble_dfu_buttonless_init(&dfus_init);

    APP_ERROR_CHECK(err_code); #endif
复制代码

 

定义ble_dfu_evt_handler,大家只要按照要求来,就没问题,这里就不贴代码了。

Nordic对每一个模块都有一个编译总开关,因此还需到sdk_config.h中使能DFU模块,如下:

复制代码
#ifndef BLE_DFU_ENABLED #define BLE_DFU_ENABLED 1 #endif // <q> NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS  - Buttonless DFU supports bonds.  #ifndef NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS #define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0 #endif
复制代码

 

3)     修改softdevice配置。现在整个应用包括2个vs_uuid:NUS和DFU,相应地ATT table size也要变大,然后应用程序RAM起始地址也需要跟着变,如下(注:这里的attr_tab_size设置得稍稍偏大):

复制代码
// <o> NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4.  #ifndef NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE #define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1600 #endif // <o> NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs.  #ifndef NRF_SDH_BLE_VS_UUID_COUNT #define NRF_SDH_BLE_VS_UUID_COUNT 2 #endif
复制代码

 

修改应用程序RAM起始地址,如下:

 

4)     添加上述函数涉及到的文件,宏定义及包含相关目录。首先添加如下DFU目录及相关文件:

 

在define中添加这些宏:DEBUG DFU_SUPPORT BL_SETTINGS_ACCESS_ONLY NRF_DFU_SVCI_ENABLED NRF_DFU_TRANSPORT_BLE=1,其中DEBUG宏只是为了调试方便而设置的,跟DFU本身无关。DFU_SUPPORT是我用来控制我添加的DFU代码的,删掉DFU_SUPPORT,将不编译所有DFU有关代码。其余的宏都是系统自带的,如果要支持DFU,也是必须要定义的。

 

然后包含如下目录:

 

 

5)     在main.c中添加如下头文件定义:

#ifdef DFU_SUPPORT

#include "ble_dfu.h" #endif

 

6)     在跳转到bootloader之前,如果你想做一些专门的代码处理,比如完成pending的Flash操作,比如关闭某些模块,那么你可以注册一个app_shutdown_handler来做这些工作。(注:这一步不是必须的,是可选的!)

NRF_PWR_MGMT_HANDLER_REGISTER(app_shutdown_handler, 0);

 

7)     编译工程,将hex改为“app.hex”

8)     按照2.1节“nRF5 SDK v15.0.0 OTA”步骤来执行OTA过程,你会发现ble_app_uart已经具备DFU功能了。我已把OTA过程所有步骤打成一个包:Script_SDK15_S132_NUS_NoBonding.rar,大家可以到百度云盘去下载。


(1 ) (0 )
回复 举报

回复于 2019-04-29 沙发

谢谢分享
(0 )
评论 (0) 举报

回复于 2020-02-18 2#

感谢分享
(0 )
评论 (0) 举报

回复于 2020-02-18 3#

感谢分享,欢迎关注我,资料持续更新中。有需要机械臂,电源,硬件电路设计,软件编程,开发板等各种定制的可以私聊我哦,相互学习,共同进步。
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部