
当前 Web Bluetooth API 不支持在标准环境下直接获取蓝牙设备的 RSSI 值;watchAdvertisements() 和 advertisementreceived 事件仅限实验性标志启用,且该功能已被弃用,Chrome 已明确不计划正式发布。
当前 web bluetooth api 不支持在标准环境下直接获取蓝牙设备的 rssi 值;`watchadvertisements()` 和 `advertisementreceived` 事件仅限实验性标志启用,且该功能已被弃用,chrome 已明确不计划正式发布。
在构建基于 Web 的室内定位系统时,开发者常期望通过浏览器直接读取蓝牙信标(如 ESP32)广播的 RSSI(Received Signal Strength Indicator)值,进而估算距离、实现三角定位或指纹匹配。然而,现实是:标准 Web Bluetooth API 并未开放 RSSI 读取能力——你提供的代码看似合理,实则无法在生产环境运行。
❌ 为什么你的代码不工作?
你使用了 device.addEventListener('advertisementreceived', ...),但该事件 并非标准 Web Bluetooth 规范的一部分。它源自已废弃的实验性 API watchAdvertisements(),仅在 Chromium 浏览器中通过启动参数启用:
chrome --enable-features=WebBluetoothNewPermissionsBackend
即使启用,该 API 也已于 Chrome 123+ 彻底移除(参见 Chromium Issue #40488594),官方明确表示:不会上线,且无替代方案正在标准化中。
✅ 可行的替代路径
由于浏览器安全沙箱限制,直接访问底层射频信号强度(RSSI)会暴露设备位置敏感信息,因此主流浏览器(Chrome、Edge、Firefox)均拒绝开放此能力。实际项目中,推荐以下合规方案:
1. 使用原生桥接(推荐用于混合应用)
通过 Capacitor、Cordova 或 Electron 封装 Web 应用,并调用原生蓝牙模块(如 Android 的 BluetoothLeScanner 或 iOS 的 CoreBluetooth)获取 RSSI,再通过 JS Bridge 传回网页:
// 示例(Capacitor + @capacitor-community/bluetooth-le)
import { BluetoothLe } from '@capacitor-community/bluetooth-le';
async function startScan() {
await BluetoothLe.requestPermission();
await BluetoothLe.startScan({
acceptAll: true,
reportDuplicates: true
});
BluetoothLe.addListener('scanResult', (result) => {
console.log(`Device: ${result.deviceName}, RSSI: ${result.rssi} dBm`);
// 更新页面 UI
document.getElementById('rssi').textContent = result.rssi;
});
}2. 后端中继方案(纯 Web 场景)
让 ESP32 等蓝牙设备通过 Wi-Fi 或 BLE+ESP-NOW 将 RSSI 数据发送至 HTTP/WebSocket 服务端,前端通过 fetch 或 WebSocket 实时订阅:
// 前端监听 WebSocket 服务端推送的 RSSI
const ws = new WebSocket('wss://your-api.com/rssi-stream');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
document.getElementById('rssi').textContent = data.rssi;
};3. 利用 Web Bluetooth 的「连接后读取」(有限场景)
若设备支持通过 GATT 特征暴露 RSSI(例如自定义服务中定义一个 0000ff01-0000-1000-8000-00805f9b34fb 特征返回当前 RSSI),可建立连接后读取:
const server = await device.gatt.connect();
const service = await server.getPrimaryService('your-custom-service-uuid');
const rssiChar = await service.getCharacteristic('rssi-characteristic-uuid');
const value = await rssiChar.readValue();
const rssi = value.getInt8(0); // 假设为单字节有符号整数⚠️ 注意:这要求硬件固件主动上报 RSSI(非广播包中的真实 RSSI),精度和实时性受限。
? 总结与建议
-
不要依赖
advertisementreceived或watchAdvertisements():它们已废弃,无兼容未来浏览器的可能; - 纯 Web 室内定位需重构架构:优先采用“设备上报 → 服务端聚合 → Web 订阅”模式;
- 对精度要求高时,放弃纯浏览器方案:选用 PWA + 原生插件,或转向专用移动 App;
- 关注 Web Bluetooth 规范演进:目前 W3C Web Bluetooth CG 未将 RSSI 列入路线图,短期无解。
RSSI 是物理层指标,而 Web 平台本质是受控应用层环境——理解这一边界,才能避开不可行的技术陷阱,选择真正可落地的室内定位路径。

















