如何通过网页Web蓝牙广播安卓及iOS手机的唯一识别标识(如蓝牙MAC地址)
Web蓝牙设备唯一标识广播方案说明
MAC地址随机化说明
安卓(Android 8.0及以上)、iOS(iOS 13及以上)系统均默认开启BLE MAC地址随机化策略,对外广播、配对时均使用临时随机MAC,且定期自动轮换,系统层已屏蔽应用/网页获取真实物理MAC的权限,无法通过任何方法获取并广播真实MAC地址作为设备唯一标识。
测试时每次配对MAC变化就是该策略的正常表现。
可行替代方案:BLE广播自定义唯一标识
无需依赖MAC地址,直接在BLE广播包中写入自定义的唯一设备标识即可实现需求,不需要配对,扫描即可读取,完全满足低延迟的要求,具体实现步骤如下:
- 生成唯一设备标识:调用浏览器
crypto.randomUUID()生成全局唯一UUID,存储在localStorage中,只要用户不清除浏览器数据,该标识就会永久保留,可稳定识别设备。 - 调用Web蓝牙广播接口对外广播该标识:通过Web蓝牙的
navigator.bluetooth.advertise()接口,将标识写入广播包的厂商自定义数据段,树莓派扫描BLE广播包后直接解析对应字段即可获取设备标识。
示例实现代码
// 读取或生成唯一设备ID let deviceId = localStorage.getItem('uniqueDeviceId') if (!deviceId) { deviceId = crypto.randomUUID() localStorage.setItem('uniqueDeviceId', deviceId) } // 转换ID为字节流 const idBytes = new TextEncoder().encode(deviceId.slice(0, 16)) // 截取前16位适配广播包长度限制 // 启动BLE广播 try { await navigator.bluetooth.advertise({ advertisementData: { manufacturerData: { 0xFFFF: idBytes // 0xFFFF为自定义厂商ID,可自行调整为未被占用的16位值 } }, options: { interval: 1000 // 广播间隔1秒,可根据功耗、扫描灵敏度需求调整 } }) } catch (err) { console.error('广播启动失败', err) }
安卓端兼容性
安卓端Chrome 79及以上版本已全面支持该接口,仅需要页面运行在HTTPS环境下(本地调试可使用localhost),且用户授予页面蓝牙权限即可正常运行。
iOS端适配说明
iOS端Safari暂不支持Web蓝牙的对外广播功能,仅支持作为中心设备扫描连接其他BLE设备,若需要兼容iOS设备,可采用折中方案:
- 树莓派开启BLE广播作为服务端,手机作为中心设备扫描到树莓派的广播后主动发起连接,将自身的唯一标识发送给树莓派,该方案在iOS Safari上可正常运行。
注意事项
- 若用户清除浏览器缓存或使用无痕模式,
localStorage存储的唯一ID会重置,若需要更高的标识稳定性,可引导用户登录账号,将ID与账号关联存储在服务端。 - BLE标准广播包最大长度为31字节,自定义标识不要超过该长度限制。
- 无需进行配对操作,仅扫描广播包即可读取标识,不会触发临时MAC轮换的问题。
内容的提问来源于stack exchange,提问作者user17564322
相关产品推荐
相关产品推荐

