HarmonyOS鸿蒙Next中蓝牙每次扫描或者手机蓝牙重启、外设重启,mac地址还是会随机变化么?现在支不支持获取蓝牙设备真实mac地址?
HarmonyOS鸿蒙Next中蓝牙每次扫描或者手机蓝牙重启、外设重启,mac地址还是会随机变化么?现在支不支持获取蓝牙设备真实mac地址? 蓝牙每次扫描或者手机蓝牙重启、外设重启,mac地址还是会随机变化么?现在支不支持获取蓝牙设备真实mac地址?想持久化储存mac地址是不是还是只能通过access.addPersistentDeviceId这个接口实现?
【解决方案】
- HarmonyOS基于信息安全考虑,每次扫描获取到的蓝牙设备地址是虚拟的,若和该设备配对成功,该地址不会变更,若取消配对或蓝牙关闭后,再次重新发起扫描,则该虚拟地址会变更。蓝牙虚拟地址设计上有个缓存时间,取消配对后不会立即清除,此时重新配对蓝牙设备虚拟地址不变,等待一段时间缓存过期后,重新配对,系统会分配新的虚拟地址。
- 基于信息安全考虑,HarmonyOS暂不支持获取真实的mac地址,connection.on(‘bluetoothDeviceFind’)获取的设备地址为随机mac地址。配对成功后,该地址不会变更,已配对设备取消配对后重新扫描或蓝牙服务下电时,该随机地址会变更。
为了区分不同的蓝牙设备,有以下两种方案可参考:
方案一: 使用蓝牙设备的名称进行区分,详情请参考接口connection.getRemoteDeviceName。
方案二: HarmonyOS对标iOS提供了获取蓝牙设备的uuid的接口,详情请参考接口connection.getRemoteProfileUuids。
- API16上提供了addPersistentDeviceId接口,该接口可以对蓝牙虚拟设备地址进行持久化,但如果对端设备地址发生变化,持久化保存的地址信息也会失效,无法继续使用。具体使用方法如下:
- 申请ohos.permission.ACCESS_BLUETOOTH和ohos.permission.PERSISTENT_BLUETOOTH_PEERS_MAC权限。
- 调用access.addPersistentDeviceId接口将相应的蓝牙虚拟设备地址持久化。
import { access } from '@kit.ConnectivityKit';
let deviceId = '11:22:33:44:55:66' // 该地址可通过BLE扫描获取
try {
access.addPersistentDeviceId(deviceId);
} catch (err) {
console.error('errCode: ' + err.code + ', errMessage: ' + err.message);
}
更多关于HarmonyOS鸿蒙Next中蓝牙每次扫描或者手机蓝牙重启、外设重启,mac地址还是会随机变化么?现在支不支持获取蓝牙设备真实mac地址?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,蓝牙MAC地址随机化机制仍然存在,每次扫描、蓝牙重启或外设重启时,随机地址可能会变化。目前系统不支持获取蓝牙设备的真实MAC地址,这是出于隐私保护的设计。
在HarmonyOS Next中,蓝牙设备的MAC地址随机化策略依然是默认开启的,这是为了增强用户隐私保护。因此,在每次扫描、或手机/外设蓝牙重启后,扫描到的公开广播地址(Public Address)通常仍是随机变化的。
目前,系统不向应用层提供获取蓝牙设备真实、固定物理MAC地址的接口。这是出于隐私和安全考虑的主动设计,与主流操作系统(如iOS、Android高版本)的策略保持一致。
对于您提到的设备持久化识别需求,是的,当前推荐的方案仍然是使用 access.addPersistentDeviceId() 接口。该接口会为已配对的设备生成一个唯一、稳定的虚拟标识符(Persistent Device ID)。即使设备的广播MAC地址发生变化,只要配对关系存在,应用通过这个ID就能可靠地识别出同一台物理设备。
总结:
- 扫描到的MAC地址会变:随机化策略有效,无法获取固定物理地址。
- 持久化存储方案:
access.addPersistentDeviceId()是正确且主要的实现方式,用于在应用层建立设备与虚拟ID的稳定绑定。
因此,您的应用逻辑应基于系统提供的这个持久化ID来识别和管理设备,而不是依赖可能变化的MAC地址。

