BLE地址类型 - ShenYj/ShenYj.github.io GitHub Wiki
一个BLE
设备,可以使用两种类型的地址 (一个BLE设备可同时具备两种地址)
在通信系统中,设备地址是用来唯一识别一个物理设备的,如TCP/IP网络中的MAC地址、传统蓝牙中的蓝牙地址等。对设备地址而言,一个重要的特性,就是唯一性(或者说一定范围内的唯一),否则很有可能造成很多问题。蓝牙通信系统也不例外。
对经典蓝牙(BR/EDR)来说,其设备地址是一个48bits的数字,称作"48-bit universal LAN MAC addresses(和电脑的MAC地址一样)“。正常情况下,该地址需要向IEEE申请(其实是购买[1],呵呵!)。企业交钱,IEEE保证地址的唯一性,皆大欢喜。
当然,这种地址分配方式,在BLE中也保留下来了,就是Public Device Address。Public Device Address由24-bit的company_id和24-bit的company_assigned组成,具体可参考蓝牙Spec中相关的说明
但是,在BLE时代,只有Public Device Address还不够,有如下原因:
1)Public Device Address需要向IEEE购买。虽然不贵,但在BLE时代,相比BLE IC的成本,还是不小的一笔开销。
2)Public Device Address的申请与管理是相当繁琐、复杂的一件事情,再加上BLE设备的数量众多(和传统蓝牙设备不是一个数量级的),导致维护成本增大。
3)安全因素。BLE很大一部分的应用场景是广播通信,这意味着只要知道设备的地址,就可以获取所有的信息,这是不安全的。因此固定的设备地址,加大了信息泄漏的风险。
为了解决上述问题,BLE协议新增了一种地址:Random Device Address,即设备地址不是固定分配的,而是在设备设备启动后随机生成的。根据不同的目的,Random Device Address分为Static Device Address和Private Device Address两类。
而
Random Device Address
又分为Static Device Address
和Private Device Address
两类其中
Private Device Address
又可以分为Non-resolvable Private Address
和Resolvable Private Address
它们的关系如下所示:
Public Device
+---> Address
+-------------+ |
| | |
| BLE | |
| Device +---+ or/and Static Device
| | | +--> Address
+-------------+ | |
| Random Device |
+----> Address +-+ or Non-resolvable
| +-> private address
| |
| Private Device | or
+--> Address +--+
| Resolvable
+-> private address
Static Device Address通过地址随机生成的方式,解决了部分问题,Private Device Address则更进一步,通过定时更新和地址加密两种方法,提高蓝牙地址的可靠性和安全性。根据地址是否加密,Private Device Address又分为两类,Non-resolvable private address和Resolvable private address。下面我们分别描述。
Non-resolvable private address和Static Device Address类似,不同之处在于,Non-resolvable private address会定时更新。更新的周期称是由GAP规定的,称作T_GAP(private_addr_int) ,建议值是15分钟。其格式如下:
LSB MSB
+----------------------------------------+---+
|Random part of nonresolvable address| 0 | 0 |
+----------------------------------------+---+
nonresolvable address
<--------------+ (48 bits) +--------------->
特征可总结为:
1)最高两个bit为“00”。
2)剩余的46bits是一个随机数,不能全部为0,也不能全部为1。
3)以T_GAP(private_addr_int)为周期,定时更新。
Non-resolvable private address有点奇怪,其应用场景并不是很清晰。地址变来变去的,确实是迷惑了敌人,但自己人不也一样被迷惑了吗?因此,实际产品中,该地址类型并不常用。
Resolvable private address比较有用,它通过一个随机数和一个称作identity resolving key (IRK) 的密码生成,因此只能被拥有相同IRK的设备扫描到,可以防止被未知设备扫描和追踪。其格式如下:
LSB MSB
+--------------------------+----------------------+---+---+
| | Random part of prand | 1 | 0 |
+--------------------------+----------------------+---+---+
<--------+ hash +---------> <-----------+ prand +------->
(24 bits) (24 bits)
特征如下:
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 address不能单独使用,因此需要使用该类型的地址的话,设备要同时具备Public Device Address或者Static Device Address中的一种。
通常使用的地址都是public address,即名为地址。有些场合为了提高设备的隐私性(Privacy),可以使用resolvable private address,如果将设备地址标记为这一类型,从外部看来,每次重连,设备的地址都会发生变化,与之绑定的另一端设备需要利用IRK(身份解析秘钥)对加密地址进行解码,进而获得原始地址。
估计很多刚接触蓝牙开发的人听到上面的描述可能就蒙蔽了,而网上大部分的CoreBluetooth
开发资料都是基础中的基础,估计都是相互拷贝的
接下来我以实际的工作经验讲解下地址类型对开发有何影响
17年4月份开始我从事蓝牙设备的开发,当时公司设备芯片从蓝牙3.0升级到蓝牙4.0(BLE, 准确的说是4.2)
而芯片生产产商为了降低成本(硬件厂商使用蓝牙,需要每年向SIG联盟缴纳费用,这个年费不低,而蓝牙设备也有对应的地址, 如果使用一个固定地址, 同样还需要一比费用)采用了随机设备地址
这一点对iOS
开发几乎毫无影响, 然而可苦逼了Android
的同事, 他们的API
默认是按照MAC
地址来搜索、配对和重连的
所以地址类型除了开发上的影响外,另外一方面决定着生产成本