ESP32 C3发送动态蓝牙扩展广播遇0x12错误的解决方案问询
解决ESP32 C3动态更新BLE扩展广播数据的问题
错误码0x12的含义
错误码0x12对应HCI层的ADVERTISING_DATA_TOO_LONG,说明你传入的广播数据长度超过了BLE扩展广播的最大允许值(扩展广播的ADV payload上限为255字节)。先检查你的ble_message长度是否超出这个限制。
代码逻辑问题修正
你的代码每次更新都删除并清空广播实例,这会导致实例未正确初始化就配置数据,进而触发错误。正确的动态更新流程无需删除实例,仅需停止广播、更新数据、重启广播即可:
修正后的代码
int transmit_ble2(uint8_t *ble_message, int length) { esp_err_t ble_status; bool status; static int advertising = 0; const int advertno = 0; // 校验数据长度是否合规 if (length > 255) { Serial.println("错误:数据长度超过255字节上限"); return -1; } if (advertising) { // 仅停止广播实例,无需删除或清空 const uint8_t inst[] = {0x00}; status = advert.stop(0, inst); if (!status) { Serial.println("停止广播失败"); return -1; } } else { // 首次启动时完成广播参数初始化 advert.setAdvertisingParams(advertno, &ext_adv_params_1M); advert.setDuration(0); advert.setScanRspData(advertno, sizeof(raw_scan_rsp_data_coded), raw_scan_rsp_data_coded); advert.setInstanceAddress(advertno, addr_1m); } // 使用库封装方法更新广播数据,替代底层API ble_status = advert.setAdvData(advertno, length, ble_message); if (ble_status != ESP_OK) { Serial.print("设置广播数据失败:"); Serial.println(ble_status); return ble_status; } // 启动/重启广播 status = advert.start(1, advertno); if (status) { advertising = 1; } else { Serial.println("启动广播失败"); return -1; } return 0; }
额外注意事项
- 避免频繁删除重建广播实例,这既容易引发错误,也会增加系统开销。
- 确保
ext_adv_params_1M的参数配置正确,尤其是广播类型需设置为符合需求的扩展广播类型(可连接/非连接)。 - 若一定要使用底层API
esp_ble_gap_config_ext_adv_data_raw,需确保调用前已通过esp_ble_gap_create_ext_adv_instance完成实例创建(Arduino库的setAdvertisingParams通常会自动处理,但手动删除实例后需重新创建)。
内容的提问来源于stack exchange,提问作者Ken Sherman
相关产品推荐
相关产品推荐

