一个 BLE 设备,可以使用两种类型的地址(一个 BLE 设备可同时具备两种地址),粗略可分两类: 1. 公共地址(Public Address); 2. 随机地址(Random Address), 这里“随机地址”又分两类, 1. 静态随机地址(Static Random Address); 2. 私有地址(Private Address). 这里“私有地址”又分两类, 1. 可解析的私有地址(Resolvable Address); 2.不可解析的私有地址( Unresolvable Address)。 对经典(Classic)蓝牙只支持公共地址,而蓝牙低功耗两类地址都有使用。 例如,在NB860模组中,使用AT指令AT+BLEADDR?查询蓝牙MAC地址, AT+BLEADDR?
+BLEADDR:301B97FFAE67
OK
此时仅返回一个公用地址。而在NT35模组中,使用AT+LBLEADDR?查询蓝牙MAC地址,
AT+LBLEADDR? +LBLEADDR: “50:56:1E:0D:E3:4F”,“E8:AF:32:8A:8D:09”
OK 此时返回一个公用地址和随机地址。 1、Public Device Address 由 24-bit 的 company_id 和 24-bit 的 company_assigned 组成。 在通信系统中,设备地址是用来唯一识别一个物理设备的,如 TCP/IP 网络中的 MAC 地址、传统蓝牙中的蓝牙地址等。 对设备地址而言,一个重要的特性,就是唯一性。 对经典蓝牙(BR/EDR)来说,其设备地址是一个 48bits 的数字,称作 "48-bit universal LAN MAC addresses“。 正常情况下,该地址需要向 IEEE 申请。 缺点: 1)Public Device Address 需要购买和维护,增加成本; 2)安全因素:BLE 很大一部分的应用场景是广播通信,这意味着只要知道设备的地址,就可以获取所有的信息。 2、Random Device Address Random Device Address:是在设备设备启动后随机生成的。 根据不同的目的 Random DeviceAddress 分为 Static DeviceAddress 和 Private Device Address 两类。 1)Static Device Address Static Device Address 是在设备上电时随机生成的, 特性如下: 1)最高两个bit为“11”; 2)剩余的 46bits 是一个随机数,不能全部为 0,也不能全部为 1; 3)在一个上电周期内保持不变; 4)下一次上电的时候可以改变,但不是强制的,如果改变,上次保存的连接等信息,将不再有效。 2)Private Device Address Static Device Address 通过地址随机生成的方式,解决了部分问题,Private Device Address 则更进一步,通过定时更新和地址加密两种方法,提高蓝牙地址的可靠性和安全性。 根据地址是否加密,Private DeviceAddress 又分为两类,Non-resolvableprivate address 和 Resolvable private address。 Non-resolvable private address 会定时更新,更新的周期是由 GAP 规定的,称作 T_GAP(private_addr_int) ,建议值是 15 分钟。 特性如下: 1)最高两个 bit 为 “00”; 2)剩余的 46bits 是一个随机数,不能全部为 0,也不能全部为 1; 3)以 T_GAP(private_addr_int) 为周期,定时更新。 Resolvable private address 比较有用,它通过一个随机数和一个称作 identity resolving 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 privateaddress 命名的由来。 3)以 T_GAP(private_addr_int) 为周期,定时更新,哪怕在广播、扫描、已连接等过程中,也可能改变。
|