软件
- esp-iot-solution\examples\bluetooth\ble_ota 例程
- BLE OTA 组件库:espressif/ble_ota
硬件
用于 BLE OTA 测试的手机 APP
-
安卓版本:esp-ble-ota-android
-
IOS 版本: esp-ble-ota-ios
扫描完成后,系统提示输入密码,密码为"esp"
1. 首先,准备一个 hello-world.bin
,用于 OTA 固件测试
- 基于 esp-idf-v5.0.2\examples\get-started\hello_world 例程,使用如下指令,直接编译,获取
hello-world.bin
idf.py set-target esp32c3
idf.py build
2. 将 hello-world.bin
导入到手机中,为后续 OTA 固件做准备
- 在安卓手机中,将
hello-world.bin
放到Android/data/com.espressif.bleota.android/files/BLE-OTA/
路径下
- 在 IOS 手机中,将
hello-world.bin
放到手机 --> esp-ble-ota --> 文件 --> 拖入要升级的文件
路径下
3. 下载 esp-iot-solution\examples\bluetooth\ble_ota 例程
-
在安卓手机上,如果使用的是 Bluedroid 协议栈进行
BLE-OTA
测试,需要进行如下设置:→ Component config → Bluetooth → Bluetooth → Host
→ Component config → Bluetooth → Bluedroid Options
-
然后编译、下载
idf.py build idf.py -p COM* flash monitor
4. 打开 APP 进行 OTA 测试
-
如果设置的是 Bluedroid 协议栈,对应的设备名称是
ESP&C919
,参见 esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/ble_ota.c-
软件配置设置协议栈类型
→ Component config → Bluetooth → Bluetooth → Host
-
设备广播名称
-
如果要修改 BLE OTA 设备的广播名称,在 esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/ble_ota.c 中修改 BLE 广播数据即可,如下:
-
BLE OTA 例程默认使用的是 GATT Server 协议,如果要改成 SPP Server ,那么也是修改 esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/ble_ota.c 中的代码。
-
-
如果设置的是 Nimble 协议栈,对应的设备名称是
nimble-ble-ota
,参见 esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/nimble_ota.c→ Component config → Bluetooth → Bluetooth → Host
-
选择要 OTA 的固件,进行 BLE-OTA
- 如果要修改 nimble ota 设备名称,也是修改 esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/nimble_ota.c 中的广播数据,如下:
- 如果要修改 nimble ota 设备名称,也是修改 esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/nimble_ota.c 中的广播数据,如下:
-
OTA 完成
5. 检查固件运行日志
6、如果要适配更多产品,例如 ESP32-C2 ,需要基于 esp-idf v5.0 及以上版本的 SDK ,并在 ble_ota 组件库中增加要适配的产品型号,例如:
BLE OTA 安全应用拓展测试
BLE OTA 测试例程默认使用未加密的 OTA 进程,若希望 OTA 进程中的 app.bin
数据流被加密,可增加 BLE 安全加密的应用以保证在 BLE OTA 进程中的 app.bin
数据流安全。
1 - 当使用 Bluedroid 时,可增加如下代码进行测试:
- 在 “esp-iot-solution\components\bluetooth\ble_profiles\esp\ble_ota\src\ble_ota.c” 文件中的 case ESP_GATTS_CONNECT_EVT: 事件下增加如下代码:
/* start security connect with peer device when receive the connect event sent by the master */
esp_ble_set_encryption(param->connect.remote_bda, ESP_BLE_SEC_ENCRYPT_MITM);
-
- 在 软件配置下,选择
Bluedroid - Dual-mode
模式
→ Component config → Bluetooth → Bluetooth → Host → (X) Bluedroid - Dual-mode
- 在 软件配置下,选择
-
注意:BLE OTA 测试 APP 不支持 BLE5.0 , 当使用 ESP32-C 、 ESP32-S3 系列的产品时,请关闭 BLE5.0 特性来测试:
→ Component config → Bluetooth → Bluedroid Options → [ ] Enable BLE 5.0 features
-
测试结果如下:
- 当 BLE 加密未设置时,在 BLE OTA 进程中通过蓝牙抓包可以看到明文数据流
-
- 当 BLE 加密设置时,在 BLE OTA 进程中通过蓝牙抓包可以看到数据流被加密
2 - 当使用 nimble 时,可增加如下代码进行测试:
- 在 “esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/nimble_ota.c” 文件中的 case BLE_GAP_EVENT_CONNECT 事件下增加如下代码:
rc = ble_gap_security_initiate(event->connect.conn_handle);
if (rc != 0) {
MODLOG_DFLT(INFO, "Security could not be initiated, rc = %d\n", rc);
return ble_gap_terminate(event->connect.conn_handle,
BLE_ERR_REM_USER_CONN_TERM);
} else {
MODLOG_DFLT(INFO, "Connection secured\n");
- 在 “esp-iot-solution/components/bluetooth/ble_profiles/esp/ble_ota/src/nimble_ota.c” 文件中的 ble_hs_cfg.sm_their_key_dist = BLE_SM_PAIR_KEY_DIST_ENC; 事件下增加如下代码:
ble_hs_cfg.sm_sc = 1;
ble_hs_cfg.sm_mitm = 1;
-
在 软件配置下,选择
NimBLE - BLE only
模式
→ Component config → Bluetooth → Bluetooth → Host → (X) NimBLE - BLE only
-
在 esp-ble-ota-android/releases/tag/rc 下载最新版本 ble-ota
apk
安装 APP 来测试。 -
测试结果抓包如下: