跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何利用 Web Bluetooth Scanning 异步扫描周边的原始蓝牙设备广播信号

Web Bluetooth 通过 requestLEScan() 异步监听 BLE 广播包,不建立连接、纯事件驱动,需用户手势触发且仅支持 HTTPS 及 Chromium 内核浏览器;扫描持续派发 advertisementreceived 事件,携带设备名、RSSI、厂商数据、服务数据等完整广播信息,并支持过滤、去重等配置,须显式调用 .stop() 终止。 Web Bluetooth 的扫描能力不依赖用户手动选择设备,而是通过
requestLEScan()
异步监听广播包,直接获取原始 BLE 广告数据(如名称、RSSI、服务 UUID、制造商数据等)。关键在于它不建立连接,只“听”设备在广播信道上发出的信号。 启动基础异步扫描 调用
requestLEScan()
后立即返回一个
BluetoothLEScan
对象,扫描过程在后台持续运行,无需等待设备列表生成。整个流程是纯事件驱动的: 必须由用户手势(如点击)触发,不能自动执行 需 HTTPS 环境(
localhost
也允许) 仅 Chromium 内核浏览器支持(Chrome ≥ 56、Edge ≥ 79) 扫描启动后,系统会持续派发
advertisementreceived
事件 监听原始广播数据 每个
advertisementreceived
事件携带完整广播载荷,包括未解析的原始字节和结构化解析字段:
event.device.name
:设备广播名(可能为空或被截断)
event.rssi
:接收信号强度(负值,单位 dBm),用于粗略估算距离
event.advertisementData.manufacturerData
:厂商自定义数据(
DataView
对象),需按厂商协议解析
event.advertisementData.serviceData
:按服务 UUID 组织的键值对,例如
{'0000feaa-0000-1000-8000-00805f9b34fb': DataView}
event.advertisementData.serviceUuids
:广播中声明的服务 UUID 列表(字符串数组) 配置扫描行为以适配场景 通过
BluetoothLEScanOptions
控制扫描粒度与资源消耗:
acceptAllAdvertisements: true
—— 接收所有广播,适合发现未知设备
filters: [{ namePrefix: 'Temp' }, { services: ['battery_service'] }]
—— 按名称前缀或服务 UUID 预筛选,减少事件量
keepRepeatedDevices: false
—— 同一设备重复广播只触发一次事件(默认为
false
listenOnlyGrantedDevices: true
—— 仅监听已获用户授权的设备(需先调用
requestDevice()
授权过) 停止与清理 扫描不会自动终止,必须显式调用
.stop()
: 推荐搭配
setTimeout
设置超时(如 10 秒),避免长期占用蓝牙资源 调用
scan.stop()
后,不再触发
advertisementreceived
事件 若页面卸载前未停止,浏览器通常会自动清理,但主动管理更可靠

相关文章