有客户用我司E92主从一体蓝牙模组去对接别家从机时,出现了发现服务失败的异常现象,但是用手机 nRF Connect APP测试却能连接成功,这个是什么原因?
为了回答这个问题, 下文将先对BLE蓝牙 MAC地址类型进行简述,再在文末进行解答。
1、MAC地址分类
我们从E92主从一体模组使用说明书0x02发起连接指令一节,可看出BLE设备有4种类型的设备MAC地 址,分别是:
•静态公开地址Static public address
•静态随机地址Static random address
•私有随机可解析地址 Resolvable private random address
•私有随机不可解析地址 Non-resolvable private random address
2、静态公开地址Static public address
在BR/EDR经典蓝牙设备中,其地址是一个48bits的数字,称作“48-bit universal LAN MACaddresses” (和电脑的MAC地址一样)。正常情况下,该地址需要向IEEE申请(其实是购买)。企 业交钱,IEEE保证地址的唯一性。
当然,这种地址分配方式,在BLE中也保留下来了,就是Static public address。
Static public address共6字节,由24-bit的company_id和24-bit的company_assigned组成,具体可 参考蓝牙Spec中相关的说明。
但是,在BLE时代,只有Static public address还不够,有如下原因:
1)Static public address需要向IEEE购买。虽然不贵,但在BLE时代,相比BLE IC的成本,还是不小 的一笔开销。
2)Static public address的申请与管理是相当繁琐、复杂的一件事情,再加上BLE设备的数量众多 (和传统蓝牙设备不是一个数量级的),导致维护成本增大。
3)安全因素。BLE很大一部分的应用场景是广播通信,这意味着只要知道设备的地址,就可以获取所 有的信息,这是不安全的。因此固定的设备地址,加大了信息泄漏的风险。
为了解决上述问题,BLE协议新增了一种地址: Static random address ,即设备地址不是固定分配 的,而是在设备启动后随机生成的。
3、静态随机地址Static random address
Static random address是设备在上电时随机生成的地址,共6字节。
1)最高两个bit为“11”。
2)剩余的46bits是一个随机数,不能全部为0,也不能全部为1。
3)在一个上电周期内保持不变。
4)下一次上电的时候可以改变。但不是强制的,因此也可以保持不变。如果改变,上次保存的连接等 信息,将不再有效。
Static random address的使用场景可总结为:
1)46bits的随机数,可以很好地解决“设备地址唯一性”的问题,因为两个地址相同的概率很小。
2)地址随机生成,可以解决Static public address申请所带来的费用和维护问题。
4、私有随机可解析地址 Resolvable private random address
Resolvable private address比较有用,它通过一个随机数和一个称作identityresolving key (IRK) 的密 码生成,因此只能被拥有相同IRK的设备扫描到,可以防止被未知设备扫描和追踪。
1)由两部分组成:
高位24bits是随机数部分,其中最高两个bit为“10”,用于标识地址类型;
低位24bits是随机数和IRK经过hash运算得到的hash值,运算的公式为hash = ah(IRK,prand)。
2)当对端BLE设备扫描到该类型的蓝牙地址后,会使用保存在本机的IRK,和该地址中的prand,进行 同样的hash运算,并将运算结果和地址中的hash字段比较,相同的时候,才进行后续的操作。这个过 程称作resolve(解析),这也是Non-resolvable private address/Resolvable private address命名的 由来。
3)以T_GAP(private_addr_int)为周期,定时更新。哪怕在广播、扫描、已连接等过程中,也可能改 变。
4)Resolvable private random address不能单独使用,因此需要使用该类型的地址的话,设备要同 时具备Static public address或者Static random address中的一种。
5、私有随机不可解析地址 Non-resolvable private random address
Non-resolvable private random address 和Static random address类似,不同之处在于,Nonresolvable private random address 会定时更新。更新的周期称是由GAP规定的,称作 T_GAP(private_addr_int),建议值是15分钟。
1)最高两个bit为“00”。
2)剩余的46bits是一个随机数,不能全部为0,也不能全部为1。
3)以T_GAP(private_addr_int)为周期,定时更新。
注: Non-resolvable private random address 有点奇怪,其应用场景并不是很清晰。地址变来变去 的,确实是迷惑了敌人,但自己人不也一样被迷惑了吗?因此,实际产品中,该地址类型并不常用。
回答文章开头的用户疑问,E92主从一体模组对接别家从机发现服务失败的原因,可能是客户把发起连 接指令中的从机MAC地址类型给填错了,因为客户按照惯例一般会填成0x00(我司模组addr_type 默 认都是0x00,代表静态公开地址),而别家从机用的是0x02,代表私有随机可解析地址。
正确的做法如下所示: 当E92开启扫描后,MCU串口会收到模组0x82广播事件上报,用户需从中解析出该广播的addr_type 设备地址类型,之后在0x02发起连接指令中需正确填入该广播的addr_type,这样才能成功建立连接 并发现服务。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号? 立即注册