尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP32 BLE OTA 固件升级实战:基于 esp-iot-solution 的 ble_ota 示例协议解析与实现指南

ESP32 BLE OTA 固件升级实战:基于 esp-iot-solution 的 ble_ota 示例协议解析与实现指南 物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载导读本文围绕 esp-iot-solution 仓库中的 ble_ota 示例系统讲解如何基于自定义 BLE Services 实现 ESP32 系列芯片的空中固件升级OTA。文章首先剖析 OTA Service 的 4 个 characteristic 与命令包/固件包/应答包的二进制协议格式随后深入从机端源码验证扇区化写入、CRC 校验与 ACK 应答的完整调用链最后覆盖 NimBLE、Bluedroid 双协议栈的编译配置以及 Protocomm 安全升级、预加密 OTA 与 Delta OTA 三种增强方案。读完本文你将具备独立移植并调试 BLE OTA 升级链路、对接主机端固件推送工具的能力。1. 示例整体架构从 BLE 收包到 flash 落盘ble ota demo基于ble ota component组件源码位于 components/bluetooth/ble_profiles/esp/ble_ota工作流程如下主机手机 App 或上位机通过 BLE 将待升级固件分包发送从机ESP32 设备通过自定义 GATT Service 接收数据以扇区sector为单位依次写入 flash每收到一个扇区数据从机校验包序列与 CRC16 并向主机回复 ACK全部固件写入完成后切换启动分区并重启完成升级。从机侧的数据通路分为两层BLE 协议栈层负责收包与应答应用层负责把收到的数据经由 RingBuffer 交给 OTA 任务最终通过esp_ota_write写入 OTA 分区。ble_ota组件的公共 API 集中在 ble_ota.h其中esp_ble_ota_host_init()负责初始化 BLE OTA hostesp_ble_ota_recv_fw_data_callback()注册固件接收回调esp_ble_ota_get_fw_length()返回待升级固件总长度esp_ble_ota_finish()通知 OTA 流程结束。2. Services 定义DIS 与 OTA组件共提供两个 GATT 服务DIS ServiceDevice Information Service展示软硬件版本信息OTA Service用于 OTA 升级包含 4 个 characteristic定义于 ble_ota.h 中的esp_ble_ota_char_t/esp_ble_ota_service_index_t枚举特征值UUID权限说明RECV_FW_CHAR0x8020Write, notify固件接收回复 ACKPROGRESS_BAR_CHAR0x8021Read, notify读取进度条上报进度条COMMAND_CHAR0x8022Write, notify命令下发与 ACK 回复CUSTOMER_CHAR0x8023Write, notify用户自定义数据收发其中RECV_FW_CHAR是升级数据的主通道COMMAND_CHAR负责传输 OTA 开始/结束等控制命令PROGRESS_BAR_CHAR用于向主机上报升级进度CUSTOMER_CHAR则留给业务侧自定义数据交换。组件还通过esp_ble_ota_notification_check_t结构体记录各 characteristic 的 notify 是否使能从机只有在主机订阅通知后才会推送 ACK 与进度。3. 数据传输协议3.1 命令包格式主机向COMMAND_CHAR0x8022写入的控制命令固定为 20 字节格式如下单位Command_IDPayLoadCRC16字节Byte: 0 ~ 1Byte: 2 ~ 17Byte: 18 ~ 19其中 CRC16 计算范围为bytes(0 ~ 17)即整个头部与 Payload 区。Command_ID 定义0x0001开始 OTA。Payload bytes(2 ~ 5) 用于指示固件的长度信息其余 Payload 默认置 0。从机据此获知本次待接收固件的总字节数对应esp_ble_ota_get_fw_length()的返回值。0x0002结束 OTA。剩余 Payload 全部置 0从机收到后结束本次接收流程。0x0003命令包的回复。Payload bytes(2 ~ 3) 填充准备回复的 Command_IDPayload bytes(4 ~ 5) 是对该命令的响应0x0000 表示接受0x0001 表示拒绝其余 Payload 全部置 0。3.2 固件包格式主机向RECV_FW_CHAR0x8020发送的固件数据包格式如下每包长度与 MTU 相关单位Sector_IndexPacket_SeqPayLoad字节Byte: 0 ~ 1Byte: 2Byte: 3 ~ (MTU_size - 4)Sector_Index指示写入的是第几个扇区扇区号从 0 开始递增不能跳跃必须发送完 4K 数据才能开始下一个扇区否则从机立即回复错误 ACK 请求重传。Packet_Seq包序号。若 Packet_Seq 为0xFF表示这是该扇区的最后一包此时 Payload 有效载荷的最后 2 字节是整个扇区 4K 数据的 CRC16 值剩余字节填充 0x0。从机会校验数据总长度和 CRC向主机回复正确 ACK 后再开始接收下一个扇区。这种4K 扇区 扇区末包携带整扇区 CRC的设计使从机能在每个扇区边界快速定位错误包避免整包重传同时兼顾了 BLE MTU 较小的传输约束。3.3 从机应答包格式从机回复主机的应答包ACK格式如下单位Sector_IndexACK_StatusCRC16字节Byte: 0 ~ 1Byte: 2 ~ 3Byte: 18 ~ 19ACK_Status 取值0x0000成功0x0001CRC 错误0x0002Sector_Index 错误此时 bytes(4 ~ 5) 表示期望的 Sector_Index主机据此定位应从哪个扇区开始重传0x0003Payload length 错误4. 从机端源码剖析RingBuffer 与 OTA 任务示例主程序位于 examples/bluetooth/ble_ota/main/app_main.c从机侧的接收与落盘逻辑清晰可循第一步建立数据缓冲。ble_ota_ringbuf_init(OTA_RINGBUF_SIZE)创建大小为 8192 字节的 FreeRTOS RingBufferRINGBUF_TYPE_BYTEBUF。BLE 回调收到的固件数据由write_to_ringbuf()放入缓冲实现协议栈回调与 flash 写入的解耦。第二步注册固件接收回调。esp_ble_ota_recv_fw_data_callback(ota_recv_fw_cb)注册回调ota_recv_fw_cb直接调用write_to_ringbuf(buf, length)入队在启用预加密 OTACONFIG_EXAMPLE_USE_PRE_ENC_OTA时还会同时传入esp_decrypt_handle_t解密句柄实现边接收边解密。第三步OTA 任务消费数据。ota_task是核心其关键调用链为通过esp_ota_get_boot_partition()/esp_ota_get_next_update_partition()确定目标 OTA 分区若当前为 factory 分区则固定选ESP_PARTITION_SUBTYPE_APP_OTA_0调用esp_ota_begin(partition, OTA_SIZE_UNKNOWN, out_handle)开启 OTA 写入句柄循环xRingbufferReceive()取出数据块调用esp_ota_write(out_handle, data, item_size)依次写入 flash累计recv_len直到recv_len esp_ble_ota_get_fw_length()即认为固件接收完毕调用esp_ota_end(out_handle)校验并结束写入随后esp_ota_set_boot_partition()设置新启动分区并esp_restart()重启生效。整个任务通过计数信号量notify_sem与 BLE 回调线程同步保证不会丢包或重复消费。任一环节失败都会走OTA_ERROR分支打印OTA failed并删除任务避免写坏 flash。分区表要求示例使用双 OTA 分区方案见 partitions.csvnvs, data, nvs, , 0x4000, otadata, data, ota, , 0x2000, phy_init, data, phy, , 0x1000, ota_0, app, ota_0, , 1500K, ota_1, app, ota_1, , 1500K,并在 sdkconfig.defaults 中开启CONFIG_PARTITION_TABLE_CUSTOMy、CONFIG_ESPTOOLPY_FLASHSIZE_4MBy及CONFIG_BT_BLE_42_FEATURES_SUPPORTEDy。传输的固件镜像必须与示例设置的 FLASHSIZE4MB一致即确保ESPTOOLPY_FLASHSIZE_4MB生效。5. 编译与配置指南5.1 基础构建在 examples/bluetooth/ble_ota 目录下执行标准 ESP-IDF 流程idf.py set-target esp32s3 idf.py menuconfig idf.py build idf.py -p PORT flash monitor组件依赖由 main/idf_component.yml 声明包括espressif/esp_delta_ota、espressif/esp_encrypted_img以及通过override_path指向仓库内components/bluetooth/ble_profiles/esp/ble_ota的本地ble_ota组件。5.2 NimBLE 配置推荐高吞吐在menuconfig中Component config → Bluetooth → Bluetooth → Host → NimBLE - BLE only为获得最大吞吐设置最大 MTUComponent config → Bluetooth → NimBLE Options → Preferred MTU size in octets填517使用 NimBLE 时若任务栈不足可增大CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE预加密场景下 ESP32-S3 建议设为 8192。也可直接使用仓库提供的sdkconfig.ci.nimble作为构建参考。5.3 Bluedroid 配置与 ESP32-H2 注意事项选择 Bluedroid 协议栈时在menuconfig中选择Bluedroid - Dual-mode。若使用 ESP32-H2 并希望与第 7 节提到的主机示例 App 兼容需使用 ESP-IDF 5.0 及以上版本并关闭 BLE 5.0 特性Component config → Bluetooth → Bluedroid Options取消勾选Enable BLE 5.0 featuresComponent config → Bluetooth → Controller Options取消勾选Enable BLE 5 feature。对应 Bluedroid 构建配置可直接参考 sdkconfig.ci.bluedroid。6. 三种增强升级方案示例除基础 BLE OTA 外还通过menuconfig的Example Configuration → Type of OTA提供三种可切换的增强方案。6.1 Protocomm 安全 OTA在menuconfig中Example Configuration → Type of OTA → Use protocomm layer for securityComponent config → OTA Manager → Type of OTA → Enable protocomm level security该方案复用protocomm协议层提供安全传输Security 1 基于 Proof-of-PossessionSecurity 2 基于 SRP6a 的 salt/verifier回调结构体ota_handlers_t见 ota.h定义了ota_start_cmd、ota_send_file、ota_finish_cmd三个处理器通过protocomm_add_endpoint()注册为recv-fw、ota-command等端点。设备广播的服务名为OTA_123456示例中安全模式默认使用 Security 2其 salt 与 verifier 在开发模式下硬编码于app_main.c生产模式需自行实现获取逻辑。6.2 预加密 OTAPre-Encrypted OTA流程先用仓库提供的 rsa_key/private.pem 私钥对固件镜像加密再通过 BLE 传输从机内置公钥边接收边解密后写入 flash。配置步骤Example Configuration → Type of OTA → Use Pre-Encrypted OTAComponent config → OTA Manager → Type of OTA → Enable pre encrypted OTA若使用 ESP32-S3 且为 NimBLEComponent config → Bluetooth → Bluetooth → NimBLE Options → NimBLE Host task stack size设为 8192加密文件生成方法依赖esp_encrypted_img组件已在idf_component.yml中声明设备侧通过esp_decrypt_cfg_t装载rsa_private_pem_start/end指定公钥调用esp_encrypted_img_decrypt_start()创建解密句柄并随回调注册。6.3 Delta OTA差分升级Delta OTA 只传输新旧固件间的差分补丁可显著减小 BLE 传输量。配置方式NimBLE 路径Component config → Bluetooth → Bluetooth → Host → NimBLE - BLE onlyComponent config → Bluetooth → NimBLE Options → Preferred MTU size in octets填 517Example Configuration → Type of OTA → Use Delta OTA若使用 ESP32-H2 / ESP32-C6在 NimBLE Options 取消勾选Enable BLE 5 feature并在 Example Configuration 取消勾选Enable Extended AdvBluedroid 路径Component config → Bluetooth → Bluetooth → Host → Bluedroid - Dual-mode在 Bluedroid Options 中取消勾选Enable BLE 5.0 feature与Enable BLE 4.2 featureExample Configuration → Type of OTA → Use Delta OTA从机侧 Delta OTA 的核心逻辑同样在 app_main.c 中通过esp_delta_ota_init()初始化配置read_cb读取当前固件、write_cb写入新固件收到补丁前 64 字节头部时校验 magic0xfccdde10与当前固件 SHA-256 摘要随后esp_delta_ota_feed_patch()边接收边合成新固件最终esp_delta_ota_finalize()完成差分合并。生成补丁文件先安装依赖再调用仓库提供的 Python 工具 esp_delta_ota_patch_gen.pypip install -r tools/requirements.txt python esp_delta_ota_patch_gen.py create_patch --chip target --base_binary base_binary --new_binary new_binary --patch_file_name patch_file_name注意生成补丁时必须使用设备当前正在运行的固件作为base_binary因此建议对设备内固件保留备份。验证补丁确认补丁由指定的 base 与新固件正确生成python esp_delta_ota_patch_gen.py verify_patch --chip target --base_binary base_binary --new_binary new_binary --patch_file_name patch_file_name7. 主机端配套示例的无线传输方向为主机推送到从机主机侧可选用 Espressif 官方 Android 示例 Appesp-ble-ota-android配合调试其固件分包、命令下发与 ACK/进度解析逻辑应严格遵循第 3 节的协议格式若主机使用自研工具也需按同一协议实现 Sector_Index 递增、扇区末包 CRC16 填充以及 ACK_Status 的重传处理。仓库内components/bluetooth/ble_profiles/esp/ble_ota/python/目录下的 protobuf 生成代码则服务于 Protocomm 方案的 OTA 请求/响应序列化。8. 小结BLE OTA 的关键在于可靠的小包传输协议 正确的分区管理与写盘时序本文解析的 4K 扇区 末包 CRC16 逐包 ACK 机制保证了 BLE 链路上的丢包可定位、可重传RingBuffer ota_task的架构则保证了协议栈回调与 flash 写入的异步解耦。实际落地时建议优先确认 MTU 配置、固件 FLASHSIZE 与分区表三者一致再根据安全等级需求选择基础模式、Protocomm、预加密或 Delta OTA 方案。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐ESP32 USB Host MSC OTA 实战指南基于 esp-iot-solution 实现 U 盘固件升级ESP32 USB Host MSC OTA 实战指南基于 esp iot solution 实现 U 盘固件升级 导读 本文以 examples/usb/h物联网嵌入式驱动开发硬件开发ESP IoT Solution BLE OTA 实战基于 ble_conn_mgr 与 ble_ota_raw 的无线固件升级方案ESP IoT Solution BLE OTA 实战基于 ble_conn_mgr 与 ble_ota_raw 的无线固件升级方案 本文以 examples物联网嵌入式驱动开发硬件开发基于 esp_ble_conn_mgr 的 BLE OTA 分扇区固件升级方案esp-iot-solution 实战指南基于 esp_ble_conn_mgr 的 BLE OTA 分扇区固件升级方案esp iot solution 实战指南 本文基于 esp iot solu物联网嵌入式驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表