HarmonyOS 鸿蒙Next中NearLinkKit的startScan如何通过address搜索

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

cke_316.png

cke_23353.png


更多关于HarmonyOS 鸿蒙Next中NearLinkKit的startScan如何通过address搜索的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

你ScanFilters中填入的address是设备的真实MAC地址,但星闪扫描结果中返回的地址是随机地址,两者不匹配的,所以过滤失败。

而且星闪协议与蓝牙类似,出于用户隐私保护考虑,设备在广播时使用的是随机地址而非真实地址。startScan的ScanFilters.address字段用于匹配的是扫描结果中携带的地址(即随机地址),而非设备的真实MAC地址

如果你需要通过address过滤,建议你使用之前扫描获得的随机地址,而非设备的真实MAC地址。

至于你问的,随机地址什么时候刷新变化?

一般来说默认周期刷新是星闪协议标准设备每 15 分钟自动轮换一套新 RPA 随机地址;

另外当断开所有连接后也强制刷新:模组与手机断开星闪会话,下一次广播立刻换新随机地址;

还有比如模组重启,断电重上电,也会刷新的、

更多关于HarmonyOS 鸿蒙Next中NearLinkKit的startScan如何通过address搜索的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


背景知识:

是的,为了设备安全,搜索到的是一个随机的地址。这个与蓝牙搜索的地址一样是随机的,他们底层记录这个并与真实的地址有绑定。

参考:星闪扫描

看下,是分这几种地址的。配对后会获取固定地址。

cke_276.png

希望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()拿到的才是设备真实物理地址,此时可持久化用于后续快速直连(因为已绑定信任关系,系统会解析随机地址)。

回到顶部