1. ESP32 BLE-OTA基础与自定义数据通信实现
在物联网设备开发中,无线固件升级(OTA)和蓝牙低功耗(BLE)通信是两个核心功能。乐鑫官方提供的ESP-IoT-Solution库虽然包含了BLE-OTA示例,但实际项目中我们往往需要同时实现OTA升级和自定义数据通信。本文将基于ESP-IDF开发环境,详细解析如何在官方BLE-OTA示例基础上扩展自定义BLE数据收发功能。
1.1 环境准备与组件配置
开发环境建议采用VSCode+WSL(Ubuntu)组合,这是目前最稳定的ESP32开发环境配置方案。确保已安装以下基础组件:
- ESP-IDF v4.4及以上版本
- ESP-IoT-Solution组件库
- NimBLE蓝牙协议栈(ESP-IDF默认使用Bluedroid,需手动切换)
在项目根目录的CMakeLists.txt中添加必要依赖:
cmake复制set(EXTRA_COMPONENT_DIRS
${IDF_PATH}/examples/common_components/protocol_examples_common
${IOT_SOLUTION_PATH}/components)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(my_ble_ota_project)
关键配置步骤:
- 通过VSCode的ESP-IDF插件界面搜索并安装"ble_ota"组件
- 在menuconfig中切换蓝牙协议栈:
Component config -> Bluetooth -> Bluetooth controller -> Bluetooth controller mode (BLE only) - 设置Host为
NimBLE:Component config -> Bluetooth -> Host -> Bluetooth host (NimBLE)
注意:组件安装后会自动存放在项目的managed_components目录下,引用组件头文件时需在CMake中明确声明组件名称,否则会导致编译错误。
1.2 BLE服务架构设计
官方BLE-OTA示例已经实现了一个完整的GATT服务,包含以下特征:
- 固件接收特征(WRITE)
- OTA状态特征(INDICATE/READ)
- 命令特征(WRITE)
- 自定义特征(WRITE)
我们需要在其基础上扩展自定义数据通信服务,采用128位UUID设计以避免冲突:
c复制#define CUSTOM_SERVICE_UUID \
0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, \
0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E
#define CHAR_RX_UUID \
0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, \
0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E
#define CHAR_TX_UUID \
0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, \
0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E
服务特性配置要点:
- RX特征:WRITE属性,用于
