Web Bluetooth API报错:无法匹配电池服务UUID的求助
解决Web Bluetooth API获取小米手环电量时的NotFoundError问题
你遇到的问题其实很典型——小米手环并没有采用标准的BLE电池服务UUID(0000180f-0000-1000-8000-00805f9b34fb),它使用的是小米自研的私有BLE协议,标准服务根本不会对外暴露,所以代码里直接请求battery_service肯定会找不到。下面给你一步步的解决思路:
第一步:排查小米手环实际暴露的BLE服务
Chrome自带了一个实用的BLE调试工具,能帮你直观看到设备的所有服务和特征值:
- 在Chrome地址栏输入
chrome://bluetooth-internals/ - 切换到「Devices」标签页,点击「Start Scan」找到你的小米手环
- 点击设备条目并选择「Connect」,连接成功后就能看到所有服务的UUID和对应特征值了
你要重点找和电量相关的条目,小米手环的电量相关服务UUID通常是类似0000fee0-0000-1000-8000-00805f9b34fb这类(具体以你实际扫描到的为准),对应的特征值UUID也会是一串自定义编号。
第二步:调整代码适配小米私有协议
1. 修改设备过滤与服务声明
首先,不要用标准的battery_service作为过滤条件,小米手环根本没有这个服务。可以直接用设备名称过滤,同时提前声明要访问的私有服务:
navigator.bluetooth.requestDevice({ filters: [{ name: 'MI' }], optionalServices: ['0000fee0-0000-1000-8000-00805f9b34fb'] // 替换成你扫描到的小米手环服务UUID })
这里的optionalServices是必须的,因为Web Bluetooth默认只能访问请求时明确指定的服务,私有服务必须提前声明。
2. 处理认证步骤(关键)
小米手环的大部分私有服务都需要先完成认证才能访问,比如需要发送配对密钥或认证指令。这一步需要参考社区整理的小米手环BLE协议公开资料,找到对应的认证特征值,先写入认证数据,之后才能正常读取电量信息。
3. 读取电量特征值
假设你已经找到了电量对应的特征值UUID,替换掉代码里的battery_level即可:
.then(service => { console.log(3) return service.getCharacteristic('这里替换成你找到的电量特征值UUID') }) .then(characteristic => { console.log(4) return characteristic.readValue() }) .then(value => { console.log(5) // 注意:小米的电量数据格式可能不是直接Uint8,可能需要解析字节数组(比如取特定字节) console.log('电量:', value.getUint8(0), '%') })
额外注意事项
- 确保你的Chrome版本支持Web Bluetooth(你用的76版本是支持的,但建议升级到较新版本以获得更好的兼容性)
- 小米手环可能需要先在macOS系统蓝牙中完成一次配对,才能让Web Bluetooth访问到私有服务
- 本地开发必须使用
localhost或HTTPS环境,否则浏览器会禁用Web Bluetooth API
内容的提问来源于stack exchange,提问作者Baumannzone




