Web Bluetooth API 允许网页在 HTTPS 环境下通过用户手势触发,扫描、选择并连接 BLE 设备,建立 GATT 连接后读写特征值或订阅通知,需声明 optionalServices 且须处理断连与资源清理。
web bluetooth api 允许网页在支持的浏览器中(主要是 chrome、edge、opera,需 https 环境)安全地扫描、连接并通信蓝牙设备。它不直接“配对”,而是通过用户主动授权选择设备,再建立 gatt 连接进行读写操作。
确保环境和权限前提
Web Bluetooth 有严格的安全限制:
- 必须运行在 HTTPS 协议下(localhost 也允许,但 HTTP 域名会被拒绝)
- 只能在用户手势触发的上下文中调用(比如点击按钮后执行
navigator.bluetooth.requestDevice()) - 浏览器需启用 Web Bluetooth(Chrome 默认开启;可在 chrome://flags 搜索 “Web Bluetooth” 确认)
- 目标设备需支持 Bluetooth Low Energy(BLE),且广播服务或可被发现
请求并选择蓝牙设备
调用 requestDevice() 弹出系统设备选择框,用户手动确认:
document.getElementById('connectBtn').addEventListener('click', async () => {
try {
const device = await navigator.bluetooth.requestDevice({
filters: [{ services: ['battery_service'] }], // 可选:按服务 UUID 筛选
optionalServices: ['device_information'] // 连接后可访问的额外服务
});
console.log('已选择设备:', device.name);
// 后续连接 GATT 服务器
} catch (error) {
console.error('选择失败:', error);
}
});
注意:filters 提高精准度(避免列出所有设备),optionalServices 必须声明才能后续读取对应服务。
连接 GATT 服务并读写特征值
选中设备后,连接其 GATT 服务器,获取服务与特征(Characteristic):
立即学习“Java免费学习笔记(深入)”;
const server = await device.gatt.connect();
const service = await server.getPrimaryService('battery_service');
const characteristic = await service.getCharacteristic('battery_level');
// 读取电池电量(只读特征)
const value = await characteristic.readValue();
console.log('电量:', value.getUint8(0));
// 订阅通知(如传感器实时数据)
await characteristic.startNotifications();
characteristic.addEventListener('characteristicvaluechanged', (event) => {
console.log('新值:', event.target.value.getUint8(0));
});
常见操作包括:readValue()、writeValue()(需特征支持写)、startNotifications()(需特征支持 notify/indicate)。
处理断连与清理
连接可能因超时、设备关机或信号丢失中断,建议监听事件并做恢复或提示:
- 监听
device.gatt.onconnect和device.gatt.ondisconnect - 断连后不要自动重连,应由用户再次触发(避免滥用)
- 关闭通知时调用
characteristic.stopNotifications() - 页面卸载前建议取消监听器,释放资源


















