[NRF52] mesh DFU

news2024/11/20 16:28:18

mesh DFU

  • 升级过程:
  • 完整流程:

以前nRF SDK DFU的实现是通过nRF51 Dongle配合主机nRF connect工具,且借助Secure DFU的后台式更新速率较快(见另一篇笔记),现在的nRF mesh DFU分角色,全都由DK充当:一个带有serial串口交互的发送设备(source)和若干个待升级设备(relay或target)角色,从而实现整个网络所有设备全都批量升级,这对未来的物联网是一次崭新的创意点。这篇笔记会基于nrf SDK15.3+mesh3.2实现两个部分:

a)Configuring and Perfoming DFU over Mesh

b)Integrating DFU process into the application

升级过程:

按照官方教程《Configuring and Perfoming DFU over Mesh》安全升级需要使用nrfutil工具,但原先nrf SDK DFU的nrfutil不能直接使用,两者版本不兼容,否则会提示没有”--mesh””genpkg””--application-id”,也就是注意nrf5 SDK DFU和nrf5 mesh DFU的python工具有些微不同,要用到pc-util/mesh_dfu,pc-util/mesh_dfu仓库地址为:

https://github.com/NordicSemiconductor/pc-nrfutil/tree/mesh_dfu,安装前必须要把仓库完整下载下来,然后按照仓库pc-util/mesh_dfu提示来安装。(注意会覆盖原来的工具,可以备份,做法可看帖子)。

在这里插入图片描述
在这里插入图片描述

完整流程:

  1. 产生安全秘钥private_key,同时修改JSON对象配置
    在这里插入图片描述

  2. 产生device_page,生成tools\dfu\bin\device_page_nrf52832_xxAA_s132_6.1.1.hex
    在这里插入图片描述

  3. 生成升级包.zip(注意用mesh版本的nrfutil指令)
    在这里插入图片描述

  4. 烧录协议栈bin\softdevice\s132_nrf52_6.1.1_softdevice.hex,烧录前需整片或整扇区擦除,由flash工作机理决定。

  5. 烧录引导程序mesh_bootloader_serial_gccarmemb_nrf52832_xxAA.hex实现IAP自编程,目录Bin\bootloader\gccarmemb\mesh_bootloader_serial_gccarmemb_nrf52832_xxAA.hex

  6. 烧录应用部分。当烧录应用时,可以烧录dfu例程examples\dfu\build\dfu_nrf52832_xxAA_s132_6.1.1_Debug\dfu_nrf52832_xxAA_s132_6.1.1.hex编译出来的固件做演示或者烧录用户自己mesh程序(要带dfu功能)比如examples\light_switch\server(DFU)\build\light_switch_server_nrf52832_xxAA_s132_6.1.1_dfu_Debug\light_switch_server_nrf52832_xxAA_s132_6.1.1_dfu.hex做实际项目。本文为演示,烧录模板例程,用户普通mesh程序怎么添加dfu见下一章节。

  7. 烧录刚才第二步生产的device_page,(跟以前nrf SDK DFU用mergehex指令合并这4大块为一个整体不同)4大块全部完成后让芯片复位:
    图1 第4~7步完整过程

  8. 可以检查一下device_page和bootloader(这步可做可不做):
    在这里插入图片描述

  9. 串口启动升级过程。敲击命令nrfutilmesh dfu serial -pkg blinky_dfu_test.zip -p COM54 -b 115200 -fc --mesh:
    在这里插入图片描述
    注意:默认dfu是dual-bank方式,所以进度条提示100%完成时还要等40s左右等它新固件搬移复制到旧固件位置来(见上图),否则会出现flash有两个固件但bootloader依然引导旧程序运行并且还能进行下一次升级的现象,RTT终端提示 NRF_MESH_EVT_DFU_END才算完成,并且板子上4个灯会全部开始闪烁而不是官方教程说的仅1个灯亮,官方教程还有一处小错误,就是第6步烧录dfu模板例程时给定的路径是错的,按本文来,官方教程合计两处小错误。

2.添加 DFU功能到mesh程序:

按照官方教程《Integrating DFU process into the application》指导来做。目录examples\dfu为带dfu功能的模板,可以参考它来给自己的mesh程序添加DFU,具体做法比如light_switch/server在main.c添加充当target或relay角色相应处理代码:

static nrf_mesh_evt_handler_t m_evt_handler;
static bool fw_updated_event_is_for_me(const nrf_mesh_evt_dfu_t * p_evt)
{
    switch (p_evt->fw_outdated.transfer.dfu_type)
    {
        case NRF_MESH_DFU_TYPE_APPLICATION:
            return (p_evt->fw_outdated.current.application.app_id == p_evt->fw_outdated.transfer.id.application.app_id &&
                    p_evt->fw_outdated.current.application.company_id == p_evt->fw_outdated.transfer.id.application.company_id &&
                    p_evt->fw_outdated.current.application.app_version < p_evt->fw_outdated.transfer.id.application.app_version);


        case NRF_MESH_DFU_TYPE_BOOTLOADER:
            return (p_evt->fw_outdated.current.bootloader.bl_id == p_evt->fw_outdated.transfer.id.bootloader.bl_id &&
                    p_evt->fw_outdated.current.bootloader.bl_version < p_evt->fw_outdated.transfer.id.bootloader.bl_version);


        case NRF_MESH_DFU_TYPE_SOFTDEVICE:
            return false;


        default:
            return false;
    }
}

static const uint32_t * optimal_bank_address(void)
{
    /* The incoming transfer has to fit on both sides of the bank address: First it needs to fit
     * above the bank address when we receive it, then it needs to fit below the bank address when
     * we install it. We want to put the bank address in the middle of the available application
     * code area, to maximize the potential transfer size we can accept. */
    const uint32_t * p_start;
    uint32_t dummy;
    ERROR_CHECK(mesh_stack_persistence_flash_usage(&p_start, &dummy));


    uint32_t middle_of_app_area = (CODE_START + (intptr_t) p_start) / 2;


    /* The bank can't start in the middle of the application code, and should be page aligned: */
    return (const uint32_t *) ALIGN_VAL(MAX(middle_of_app_area, CODE_END), PAGE_SIZE);
}

static void mesh_evt_handler(const nrf_mesh_evt_t* p_evt)
{
    switch (p_evt->type)
    {
        case NRF_MESH_EVT_DFU_FIRMWARE_OUTDATED:
        case NRF_MESH_EVT_DFU_FIRMWARE_OUTDATED_NO_AUTH:
            if (fw_updated_event_is_for_me(&p_evt->params.dfu))
            {
                const uint32_t * p_bank = optimal_bank_address();
                __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Requesting DFU transfer with bank at 0x%p\n", p_bank);


                ERROR_CHECK(nrf_mesh_dfu_request(p_evt->params.dfu.fw_outdated.transfer.dfu_type,
                                                 &p_evt->params.dfu.fw_outdated.transfer.id,
                                                 p_bank));
                hal_led_mask_set(LEDS_MASK, false); /* Turn off all LEDs */
            }
            else
            {
                ERROR_CHECK(nrf_mesh_dfu_relay(p_evt->params.dfu.fw_outdated.transfer.dfu_type,
                                               &p_evt->params.dfu.fw_outdated.transfer.id));
            }
            break;

        case NRF_MESH_EVT_DFU_START:
            //hal_led_mask_set(LEDS_MASK_DFU_RUNNING, true);
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"NRF_MESH_EVT_DFU_START\n");
            break;

        case NRF_MESH_EVT_DFU_END:
            //hal_led_mask_set(LEDS_MASK, false); /* Turn off all LEDs */
            //hal_led_mask_set(LEDS_MASK_DFU_ENDED, true);
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"NRF_MESH_EVT_DFU_END\n");
            break;

        case NRF_MESH_EVT_DFU_BANK_AVAILABLE:
            //hal_led_mask_set(LEDS_MASK, false); /* Turn off all LEDs */
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO,"NRF_MESH_EVT_DFU_BANK_AVAILABLE\n");
            ERROR_CHECK(nrf_mesh_dfu_bank_flash(p_evt->params.dfu.bank.transfer.dfu_type));
            break;

        default:
            break;

    }
}

新建DFU文件夹,添加文件nrf_mesh_dfu.c,同时不妨添加serial串口操作功能让其有source角色功能,新建Serial文件夹,添加mesh/serial/src下全部文件(共14个),添加路径和宏定义NRF_MESH_SERIAL_ENABLE:

…/…/…/mesh/serial/api

…/…/…/mesh/serial/include

在这里插入图片描述
在主函数mesh_init加入代码:


#if NRF_MESH_SERIAL_ENABLE
    ERROR_CHECK(nrf_mesh_serial_init(NULL));
#endif

Start函数加入代码:

#if NRF_MESH_SERIAL_ENABLE
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Enabling serial interface...\n");
    ERROR_CHECK(nrf_mesh_serial_enable());
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是单体应用?什么是微服务?

Monolith&#xff08;单体应用&#xff09;&#xff0c; 也称之为单体系统或者是 单体架构 。就是一种把系统中所有的功能、模块、组件等耦合在一个应用中应用最终打成一个(war,jar)包使用一个容器(Tomcat)进行部署&#xff0c;通常一个应用享用一个数据库。 也就是将所有的代码…

Java版数据结构与算法笔记

文章目录一、数据结构与算法概述及题目1、数据结构和算法的关系2、线性结构与非线性结构Ⅰ-线性结构Ⅱ-非线性结构3、经典面试题Ⅰ-字符串匹配问题&#xff1a;Ⅱ-汉诺塔游戏Ⅲ-八皇后问题:Ⅳ-马踏棋盘算法4、几个实际编程中遇到的问题Ⅰ-字符串替换问题Ⅱ-一个五子棋程序Ⅲ-约…

这家芯片企业,从创立之初就用 Authing 管理身份

在德州仪器和苹果的经验&#xff0c;让我深知统一身份管理要从 Day 1 做起。——Alpha Cen 联合创始人 & CEO 王璠 案例亮点&#xff1a; 打通 2000 主流应用、满足芯片初创企业统一身份需求 一周快速上线&#xff0c;产品开箱即用&#xff0c;后续无需费力运维 基于协同…

Pytorch安装及环境配置详细教程(CUDA版本)

文章目录前言一、查看GPU支持的CUDA版本二、安装CUDA三、确定torch、torchvision和python版本四、安装anaconda五、安装torch和torchvision前言 安装cuda版本的pytorch时踩了不少坑&#xff0c;网上安装pytorch的版本很多&#xff0c;一般的教程都是到pytorch的官网&#xff0…

相比传统专线网络,爱快、飞连等主流SD-WAN方案好在哪里?

当企业发展至一定的规模后&#xff0c;移动办公、异地办公会逐渐成为刚需&#xff0c;这就对企业的网络架构提出了新的挑战。 一般来说&#xff0c;企业在发展中所遇到的这些新增的网络需求&#xff0c;有两种比较常见的解决方案&#xff0c;其中之一是专线连接 。专线虽然简单…

【Unity3D插件】Build Report Tool插件,Build报告,优化包体,查看资源占用

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章介绍一下Build Report Tool插件的使用。 Build Repor…

在Visual Studio中调试Linux控制台程序

最近&#xff0c;Visual Studio 2022 17.5 预览版3 面向广大 Linux 开发者提供了一项新特性&#xff1a;在 Visual Studio 集成的终端中调试 C Linux 控制台程序。 如需了解更多关于集成终端的功能以及它在 Visual Studio 中的工作原理&#xff0c;请参考我们之前的一篇文章: I…

Linux系统安装Hadoop步骤详解

一、 安装新的虚拟机。 配置根据电脑内存自由处理&#xff0c;一般来说&#xff0c;虚拟机内存设为电脑内存一半 二、打开虚拟机&#xff0c;设置语言&#xff0c;时区&#xff0c;硬盘分区&#xff0c;密码&#xff0c;用户等 三、修改ip地址&#xff0c;连接xshell 3.1关闭…

Acer传奇Go电脑开机几分钟就会蓝屏怎么重装系统?

Acer传奇Go电脑开机几分钟就会蓝屏怎么重装系统&#xff1f;有用户使用的Acer传奇Go电脑出现了一些系统故障&#xff0c;电脑正常开机使用几分钟之后&#xff0c;马上就会出现蓝屏的情况&#xff0c;导致无法正常的使用。那么这个情况如何去重装系统呢&#xff1f;来看看以下的…

在产业互联网时代,以生态和边界为代表的有限市场的瓜分业已完成

在这样一个过程中&#xff0c;阿里们更多地思考的是&#xff0c;如何与产业结合&#xff0c;而非独立于产业之外&#xff0c;仅仅只是做一个旁观者和第三方。无论是它们投身到物流、制造、能源化工等行业之中&#xff0c;还是它们对这些产业的传统玩家们深度赋能&#xff0c;几…

第三章 TCG 规范解读【嵌入式工作组】【工业工作组】

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

Elasticsearch:彻底理解 Elasticsearch 数据操作

Elasticsearch 中有四种基本的数据操作。 每个操作都有自己的资源需求。每个用例都使用这些操作&#xff0c;但它们会优先于某些操作。 Index&#xff1a;在这里被用做动词&#xff0c;而不是其名词索引。处理文档并将其存储在索引中以供将来检索。Delete&#xff1a;从索引中…

【攻防世界】easyphp

废话不多说&#xff0c;打开环境就是一大段的php代码&#xff0c;对于我一个小白来说&#xff0c;还是难阿&#xff01;只能一点点琢磨构造payload的思路&#xff0c;当然也是在网上参考了别人的wp。记录下来也为了加深自己的印象&#xff0c;有事没事都能翻一翻&#xff0c;温…

快速入门OAuth2

1. 什么是OAuth2.0OAuth2.0是目前使用非常广泛的授权机制&#xff0c;用于授权第三方应用获取用户的数据。举例说明&#xff1a;用户可以通过选择其他登录方式来使用gitee&#xff0c;这里就使用到了第三方认证。来自RFC 6749OAuth 引入了一个授权层&#xff0c;用来分离两种不…

2023年Verasity路线图深度分析

Verasity最近发布了迄今为止最详细和雄心勃勃的2023年路线图之一。它主要集中在VeraViews的商业目标&#xff0c;以及VeraCard的推出&#xff0c;它充满了产品更新和令人兴奋的新功能&#xff0c;既为我们的企业对企业&#xff08;B2B&#xff09;产品&#xff0c;也为你&#…

解决PowerShell或vscode无法启动yarn的问题

问题现象&#xff1a;在PowerShell中启动yarn时报错&#xff1a;yarn : 无法加载文件 C:\Users\{{username}}\AppData\Roaming\npm\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅https:/go.microsoft.com/fwlink/?LinkID135170 中的 about…

DL@starter@Perceptron感知机@简单神经网络

文章目录感知机简单感知机基础形式偏置值形式逻辑门感知机机器学习的任务(单层)感知机的局限线性和非线性多层感知机从与非门到计算机小结从感知机到神经网络激活函数&#x1f388;非线性激活函数step 函数阶跃函数的实现(numpy)sigmoid functionsigmoid函数sigmoid 函数和阶跃…

PHP前后分离接口加密探讨( AES+RSA )

参考文章: php之RSA加密解密_小吴-斌的博客-CSDN博客_php rsa加密 RSA和AES的区别_LC超人在良家的博客-CSDN博客_aes rsa PHP实现非对称加密的方法 | 私钥及公钥加密解密的方法_php 公钥 私钥_LordForce的博客-CSDN博客 RSA非对称加密 特点&#xff1a; 只需交换公钥&…

2、python框架Unitter轻量级框架

类与对象定义 面向过程与面向对象 面向过程编程&#xff1a; 根据操作数据的函数或语句块来设计程序的。 面向对象编程&#xff1a; 数据和功能结合起来&#xff0c;用称为对象的东西包裹起来组织程序的方法&#xff1b; 在大多数时候你可以使用面向过程编程&#xff0c;…

Hudi系列11:Flink CDC 将MySQL的数据写入Hudi

文章目录一. 下载依赖包二. 源端数据准备三. 使用Flink cdc mysql连接器创建flinkSQL映射表四. 创建FlinkSQL Hudi连接器创建hudi表五. 将数据从CDC表插入hudi表六. 测试增删改参考:一. 下载依赖包 将 flink-sql-connector-mysql-cdc-2.2.1.jar 下载后&#xff0c;上传到$FLIN…