3. DFU协议栈与传输载体

nRF DFU(Device Firmware Update)并不是一个单一协议,而是一套分层结构:最上层是升级业务逻辑(镜像校验、激活、回滚),中间是DFU传输协议(对象模型、命令、校验),最下层才是具体的物理传输载体。很多初学者把“DFU”和“BLE OTA”混为一谈,实际上BLE只是众多载体之一。理解各载体在协议栈中的位置、能力边界和适用场景,是设计升级方案的第一步。

一、DFU协议栈的分层结构

Nordic的DFU体系可以抽象为四层。最底层是传输载体层,负责把字节流从主机送到设备,包括BLE GATT、UART串口、USB CDC、NFC标签等。其上是传输适配层,Nordic在SDK中提供了nrf_dfu_transport_t接口,每种载体实现自己的open/close/send/recv回调,把载体差异屏蔽掉。再往上是DFU协议层,定义对象类型(命令对象、数据对象)、Create/Write/Execute/Select等操作以及CRC校验。最上层是镜像管理层,负责把接收到的固件写入Flash、校验签名、设置启动标志并触发复位。

这个分层带来的直接好处是:更换载体不需要改动协议层和镜像层。例如从BLE切换到UART,只需替换传输适配层的实现,DFU核心逻辑完全复用。下图展示了这一分层关系以及各载体接入的位置。

镜像管理层 Flash写入 · 签名校验 · 启动标志 · 复位激活 DFU协议层 对象模型 · Create/Write/Execute · CRC校验 传输适配层 nrf_dfu_transport_t · open/close/send/recv 回调 BLE GATT 无线 · 手机/网关 UART 串口 有线 · 调试/产线 USB CDC 有线 · 高速/桌面 NFC 标签 近场 · 触发/小数据 选择依据:带宽需求 · 供电条件 · 现场可达性 · 安全等级 · 产线节拍 更换载体仅需替换传输适配层实现,协议层与镜像层完全复用

二、各载体的角色与能力对比

BLE GATT是消费类产品最常用的OTA方式。Nordic的BLE DFU服务使用两个特征值:一个用于发送控制命令(DFU Control Point),一个用于传输数据(DFU Packet)。受限于BLE MTU,默认每包有效载荷约20字节,协商MTU后可提升到244字节左右。以一颗256KB的固件为例,若MTU为247、每包有效数据约240字节,理论需要约1100个数据包;在连接间隔15ms、每间隔发4包的情况下,传输时间大致在数十秒量级。BLE的优势是无需插线、用户可自助升级;劣势是速率受连接参数和射频环境影响大,且升级期间设备通常无法正常使用。

UART串口是开发和产线环境的主力。它通过nrf_dfu_serial_uart适配层接入,主机侧使用nrfutil的串口模式发送。UART的速率由波特率决定,常见115200bps约合11.5KB/s,921600bps约合92KB/s。它的优势是稳定、可脚本化、便于自动化测试;劣势是需要物理接触,不适合终端用户现场升级。在产线烧录场景中,UART常与复位控制引脚配合,实现“进入Bootloader→传输→复位运行”的全自动流程。

USB CDC在nRF52840等带USB外设的芯片上可用,通过nrf_dfu_serial_usb接入。它把DFU数据封装成CDC ACM串口,主机侧同样用nrfutil操作。USB的带宽远高于UART和BLE,适合大容量固件或需要快速升级的桌面设备。其代价是硬件需要USB接口和相应供电设计,且线缆长度受限。

NFC在nRF DFU中扮演的是特殊角色。由于NFC标签本身带宽极低,它通常不用于传输完整固件,而是作为触发通道:手机靠近NFC标签后,标签中的NDEF记录携带一个URL或指令,引导手机App建立BLE连接并启动DFU。部分方案也支持通过NFC写入少量配置数据。因此NFC的定位是“入口”而非“管道”。

载体典型速率是否需要物理接触典型场景主要限制
BLE GATT约5~50 KB/s否消费类OTA受MTU和连接间隔影响
UART11.5~92 KB/s是开发调试、产线需串口工具和线缆
USB CDC数百KB/s以上是桌面设备、大固件需USB硬件支持
NFC极低近场触发升级入口不适合传大镜像

三、选择依据与工程决策

选择载体时,建议按以下顺序判断。第一看现场可达性:终端用户能否接触设备?能则优先BLE或NFC触发;不能则考虑网关代理升级。第二看固件体积与时间预算:若固件超过200KB且要求分钟级完成,BLE可能吃紧,应评估USB或UART。第三看供电与硬件资源:USB需要额外引脚和稳压设计,NFC需要天线布局,这些在PCB阶段就要确定。第四看安全要求:无论哪种载体,DFU镜像都应启用签名校验,BLE场景还应启用配对加密,防止中间人替换固件。

在同一个Bootloader中可以同时使能多种载体。Nordic的DFU会遍历已注册的传输实例,谁先收到有效请求谁就接管本次升级。例如产品同时开启BLE和UART,产线用UART快速烧录,用户现场用BLE升级,两者互不冲突。

四、一个可参考的配置示例

以nRF52840为例,若产品定位为“桌面USB设备+手机BLE配置”,可在sdk_config.h中同时打开两种传输:

// 使能BLE DFU传输
#define NRF_DFU_BLE_ENABLED 1
#define NRF_DFU_BLE_BUTTONLESS_SUPPRESS_LEDS 0

// 使能USB CDC DFU传输
#define NRF_DFU_USB_ENABLED 1
#define NRF_DFU_USB_VID 0x1915
#define NRF_DFU_USB_PID 0x521F

// 串口传输参数(若同时使用UART)
#define NRF_DFU_SERIAL_UART_ENABLED 1
#define NRF_DFU_SERIAL_UART_BAUDRATE 115200

烧录后,设备上电进入Bootloader,会同时等待BLE广播和USB枚举。用nrfutil dfu usb-serial -pkg app.zip -p COMx可从USB升级;用nrfutil dfu ble -pkg app.zip -ic 0x1234 -p COMx则通过BLE升级。判断升级是否成功,可观察设备复位后是否运行新版本,或读取Bootloader日志中的DFU completed与CRC校验结果。

不要为了“功能全”而盲目使能所有载体。每增加一种传输都会占用Flash和RAM,并扩大攻击面。产线专用UART可以在量产固件中关闭,仅保留BLE或USB,以减少资源占用和维护成本。

总结来说,BLE、UART、USB、NFC在nRF DFU中不是竞争关系,而是面向不同阶段和场景的互补通道。理解它们在协议栈中的位置,结合可达性、带宽、硬件和安全四个维度做取舍,才能设计出既好用又可靠的升级方案。