You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过网页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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:15:04