You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的参数配置正确,尤其是广播类型需设置为符合需求的扩展广播类型(可连接/非连接)。
  • 若一定要使用底层APIesp_ble_gap_config_ext_adv_data_raw,需确保调用前已通过esp_ble_gap_create_ext_adv_instance完成实例创建(Arduino库的setAdvertisingParams通常会自动处理,但手动删除实例后需重新创建)。

内容的提问来源于stack exchange,提问作者Ken Sherman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:27:48