ESP32使用NimBLE开发蓝牙时调用ble_gatts_count_cfg报错求助
问题根因
你调用gatt_svrs_init()的时机错误:NimBLE的GATT服务配置注册操作,必须在蓝牙主机完成同步(即ble_on_sync回调触发)之后才能执行,你直接在app_main初始化阶段就调用该接口,此时蓝牙主机还未完成初始化同步,触发了无效状态错误(返回码0x3对应ESP_ERR_INVALID_STATE)。
修复步骤
- 把
app_main里的ESP_ERROR_CHECK(gatt_svrs_init());、ble_svc_gap_device_name_set()、ble_store_config_init()这三行代码移除,移动到ble_on_sync回调函数内部实现,参考回调实现逻辑:
static void ble_on_sync(void) { int rc; /* 同步完成后再注册GATT服务 */ rc = gatt_svrs_init(); assert(rc == 0); /* 设置设备名称 */ rc = ble_svc_gap_device_name_set(DEVICE_NAME); assert(rc == 0); /* 初始化存储配置 */ ble_store_config_init(); /* 此处补充你自己的广播启动逻辑 */ }
- 检查自定义UUID合法性:确保
DEVICE_STATE_SERVICE、CURRENT_SPECTRUM这类自定义128位UUID的定义格式符合NimBLE要求,不要出现未初始化、类型不匹配的问题。 - 权限匹配检查:如果开启了蓝牙加密功能,确保NimBLE配置里的安全管理器选项已打开,匹配你特征值上配置的
BLE_GATT_CHR_F_READ_ENC加密读权限要求。 - 编译烧录后即可正常运行。
内容的提问来源于stack exchange,提问作者userK123
相关产品推荐
相关产品推荐

