HarmonyOS 鸿蒙Next中NearLinkKit的startScan如何通过address搜索
HarmonyOS 鸿蒙Next中NearLinkKit的startScan如何通过address搜索 使用手机搜索星闪模组设备时,使用地址过滤,未搜到对应的设备,通过名字可以搜索到,请问地址是在手机系统层做了什么转换吗?而且通过搜索拿到的地址也不是设备的真实地址,是一个随机的地址,那这个随机的地址在时候会发生变化?


更多关于HarmonyOS 鸿蒙Next中NearLinkKit的startScan如何通过address搜索的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你ScanFilters中填入的address是设备的真实MAC地址,但星闪扫描结果中返回的地址是随机地址,两者不匹配的,所以过滤失败。
而且星闪协议与蓝牙类似,出于用户隐私保护考虑,设备在广播时使用的是随机地址而非真实地址。startScan的ScanFilters.address字段用于匹配的是扫描结果中携带的地址(即随机地址),而非设备的真实MAC地址
如果你需要通过address过滤,建议你使用之前扫描获得的随机地址,而非设备的真实MAC地址。
至于你问的,随机地址什么时候刷新变化?
一般来说默认周期刷新是星闪协议标准设备每 15 分钟自动轮换一套新 RPA 随机地址;
另外当断开所有连接后也强制刷新:模组与手机断开星闪会话,下一次广播立刻换新随机地址;
还有比如模组重启,断电重上电,也会刷新的、
更多关于HarmonyOS 鸿蒙Next中NearLinkKit的startScan如何通过address搜索的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
看下,是分这几种地址的。配对后会获取固定地址。

希望HarmonyOS能加强与其他品牌设备的兼容性,让更多人受益。
这个现象其实比较像 BLE 里的“随机地址(Random Address)”机制,不一定是鸿蒙系统把地址改掉了。
从 NearLinkKit 当前公开接口来看,ScanResults.address 返回的是扫描结果中的设备地址,但文档并没有说明这个地址一定是设备烧录的真实 MAC 地址。
结合你的现象:
模组真实地址
22:99:88:77:66:55
扫描结果返回
随机地址
而且:
按 deviceName 能搜到
按 address 搜不到
我怀疑有两种可能:
1. 广播时使用了随机地址(可能性最大)
很多无线协议为了隐私保护,会使用 Random Address 或 Private Address。
此时:
AT配置的MAC
≠
广播包里的Address
手机扫描到的是广播地址。
如果你拿真实 MAC:
scanFilter.push({
address: '22:99:88:77:66:55'
})
系统匹配的却是广播地址,自然过滤不到。
2. NearLinkKit 返回的是系统映射地址
也不排除 NearLinkKit 内部做了一层地址映射。
类似:
真实设备地址
↓
系统生成临时地址
↓
ScanResults.address
这种情况通常是为了避免应用直接获取设备真实标识。
关于随机地址会不会变化
如果确实是随机地址机制,那么答案是:
会变化
常见触发时机:
- 设备重启
- 重新广播
- 重新配对
- 一定时间周期轮换
因此通常不建议:
通过 address 作为唯一标识
更稳妥的是:
deviceName
manufacturerId
manufacturerData
自定义广播数据
进行过滤。
结合你这个案例,我建议先做一个验证:
模组连续重启几次
↓
手机扫描
↓
记录 ScanResults.address
如果每次都变化,那基本可以确认拿到的是随机地址,不是真实 MAC。
如果每次都固定,但和模组真实 MAC 不一致,那更像是 NearLinkKit 返回了系统侧映射地址。
从实际项目经验来说,星闪设备发现阶段最好不要依赖 address 过滤,而是通过:
manufacturerId
manufacturerData
deviceName
来识别目标设备,会稳定很多。
应该是使用虚拟随机地址,这个随机地址应该会每一段时间就会自己调整,类似mac地址之类。
设备的真实物理地址肯定不会开放出来,为了安全考虑
例如MAC地址一样,是一个随机生成的虚拟地址; 大概率是系统做处理了
在HarmonyOS Next中,使用NearLinkKit的startScan按address搜索时,需构建ScanFilter并设置deviceAddress属性,再通过startScan(ScanFilter)传入。示例:
let filter: ScanFilter = { deviceAddress: "xx:xx:xx:xx:xx:xx" };
startScan(filter);
确保地址格式为MAC地址,且设备处于可扫描状态。
这是HarmonyOS星闪NearLink的隐私保护机制导致的。系统确实对地址做了随机化处理:
-
扫描阶段地址随机化:手机系统为了保护隐私,对外扫描拿到的设备地址是随机可解析地址,不是设备物理MAC。这个随机地址会定期变化(类似蓝牙BLE的RPA机制),断开重连、设备重启或超时后都可能改变。
-
用地址过滤不生效:正因如此,你用
startScan时传入的真实物理地址去过滤是匹配不到的,系统底层已经完成了地址映射转换。 -
正确做法:扫描过滤应使用设备广播名或service UUID这类稳定标识,而不是地址。你通过名字能搜到恰好印证了这点。
-
地址获取时机:只有配对或连接成功后,通过
getRemoteDevice().getAddress()拿到的才是设备真实物理地址,此时可持久化用于后续快速直连(因为已绑定信任关系,系统会解析随机地址)。


