Web Bluetooth API连接ESP32启动通知报错:DOMException: GATT Error: Not supported
Web Bluetooth连接ESP32后启动通知报错:DOMException: GATT Error: Not supported
你遇到的问题是Web蓝牙成功连接ESP32,但调用startNotifications()时触发"GATT Error: Not supported",尽管特征的notify属性显示为true。以下是几个关键排查和解决方向:
1. 检查ESP32端的CCCD配置
特征的notify属性为true只是基础,Web蓝牙启动通知时需要向**客户端特征配置描述符(CCCD,UUID 0x2902)**写入开启指令(0x0001)。如果ESP32没有正确初始化CCCD或设置权限,会导致操作失败。
确保ESP32代码中给目标特征添加了CCCD,并赋予读写权限。以Arduino-ESP32库为例:
// 创建特征时包含NOTIFY权限 BLECharacteristic *pNotifyChar = pService->createCharacteristic( YOUR_CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_NOTIFY | BLECharacteristic::PROPERTY_READ ); // 显式添加CCCD并设置读写权限 BLEDescriptor *pCCCD = new BLEDescriptor((uint16_t)0x2902); pCCCD->setAccessPermissions(ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE); pNotifyChar->addDescriptor(pCCCD);
2. 补充Web端requestDevice的optionalServices配置
即使能成功连接设备并获取服务,若未在requestDevice的参数中声明目标服务为可选服务,浏览器可能限制后续的GATT操作(比如启动通知)。修改Web代码:
let filters = [{name: 'Custom device name'}]; let options = { filters: filters, // 添加目标服务UUID,确保浏览器授权访问 optionalServices: ['__SERVICE_GUID__'] }; try { const device = await navigator.bluetooth.requestDevice(options); // ... 后续代码不变 } catch(error) { console.log(error); }
3. 排查ESP32 BLE栈兼容性
- 尝试升级Arduino-ESP32库到最新稳定版,旧版本可能存在Web蓝牙兼容性问题。
- 确认ESP32端服务和特征的UUID格式与Web端完全匹配(16位UUID要省略前缀,128位UUID要保持大小写和分隔符一致)。
4. 验证浏览器环境
Web蓝牙仅支持HTTPS环境(localhost除外),确保测试页面运行在HTTPS或localhost下。同时优先使用最新版Chrome浏览器测试,其Web蓝牙实现最完善。
内容的提问来源于stack exchange,提问作者BLB
相关产品推荐
相关产品推荐

