You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动