基于 BLE 5.1 协议 Core Spec。
根据 《BLUETOOTH CORE SPECIFICATION Version 5.1 | Vol 6, Part B》叙述,BLE 设备状态机包含下列状态:
• Standby State--------------------等待业务状态
• Advertising State-----------------广播状态
• Scanning State--------------------扫描状态
• Initiating State----------------------发起态(用于连接指定设备)
• Connection State -----------------连接态
• Synchronization State-----------同步态(用于周期性广播的数据同步)
在同一时刻,BLE 设备只能处于上述状态中的一种(当然,BLE 支持多连接,可以在建立连接后,再次发起其他的链接,不过呢,同一时空中,只能处于一种状态,对于上层来说,BLE 在Connection 同时在 Initiating,对于实际的物理设备,其实是分时复用的)。这几种状态的状态机转换图为:
具体的描述,等到专门讲各个状态的时候,在细致的描述状态之间的转换关系,这里可以暂时先有一个大致的印象即可。
BLE 设备的角色的概念,只出现在 Connection 状态,类似于 USB/SPI/I2C 等数据传送,角色的定义有两个:
• Master Role
• Slave Role
由 Initiating State 主动发起连接的一方,并最终建立连接后,我们称之为 Master Role,另一方由 Advertising State 被连接后,成为 Slave Role。这里也只是先有这个概念即可,后面分析完 Advertising 和 Initiating 后,这些玩意,自然了然于胸。
既然是数据传送,咱们就需要关系传送的字节序 (BIT ORDERING)。BLE 协议规定,空中数据传送都使用 little-endian format,即 Least Significant Bit (LSB) 。还是解释一下:
比如:b0b1b2 = 110,传送的时候,在空中,先传输 1,在传输 1,最后是 0;
在同一时刻,空气中弥漫了诸多蓝牙设备,那,咱哥如何才分辨不同的设备呢?当然是给每个 BLE 一个 ID,这个 ID 就是 BLE 的 Device Address,也叫 BD Address;
设备地址有 48 bits 构成,用于区分不同的 BLE 设备。
设备地址呢,又分为两大类:
- Public device address
- Random device address
Public device address 的地址由 company_assigned [24 bits] 和 company_id [24 bits] 构成
这种地址呢,需要到蓝牙组织那里去申请(花钱买),防止冲突
这种用得更为广泛,Random device address 又细分为两类:
• Static address
• Private address.
Static address 也是需要遵循标准的 48 bits,除了这个以外,还需要遵循以下规则:
1)最高两bit恒定为 11
2)上电的时候随机生成,并且在一个上电周期内保持不变
3)除开最高两位,剩余的46bits是一个随机数,不能全部为0,也不能全部为1。
4)下一次上电的时候可以改变。但不是强制的,因此也可以保持不变。
私有地址呢,根据地址是否加密,又分为了两类(过场真多):
• Non-resolvable private address-----不加密,但定时更新
• Resolvable private address-----------加密,且定时更新
4.2.2.1 Non-resolvable private address
当然,这个 Non-resolvable private address 也是 48 bits 的,Non-resolvable private address和Static Device Address类似,不同之处在于,Non-resolvable private address会定时更新。更新的周期称是由GAP规定的,称作T_GAP(private_addr_int) ,建议值是15分钟。要求如下:
1)最高两bit恒定为 00
2)除开最高两位,剩余的46bits是一个随机数,不能全部为0,也不能全部为1。
3)以T_GAP为周期,定时更新。
4)此地址不能和 public device address 冲突。
4.2.2.2 Resolvable private address
这种地址也称 RPA 加密地址,只能被拥有相同 Identity Resolving Key (IRK) 的设备扫描到,可以防止被未知设备扫描和追踪。
• 最高两位是 10
• 至少在 random part of prand 有一个 1
• 至少在 random part of prand 有一个 1
prand 除了最高两位以外,是一个随机数。
hash 部分是通过公式 hash = ah(IRK, prand) 计算出来的 hash 值。
当对 A 端发送 RPA 的时候呢,B 端接收到 RPA ,B 端会使用 A 的这个 prand 和 B 端的 IRK 进行同样的 hash 运算,并将计算的 hash 和 A 的 RPA 中的 hash 字段进行比较,相同的话,才证明这个才是他想要的,才可正常通信。
RPA 配合 RAL 才能发挥其过滤的作用(Resolvable address List)。是一种地址过滤策略,只有正确解析了以后,才能够进行后续动作,后面再详细聊。
综上所述,48bits 地址的最高两位 bits,用于表示地址的类型
蓝牙 BLE 工作在 2.4GHz 的频段上,分为 40 个 RF 信道,每个信道 2M。同一时刻,只能用一个信道进行数据的传输/接收。
这 40 个 RF Channel 上,并不是平等的, SIG 把物理信道转换成为一个叫做 Channel Index 的玩意(其实就是简单的转换关系):
物理信道从 0 - 39 进行编号。Index 却是,PHY Ch0 对应 37,PHY Ch12 对应 38,PHY 39 对应 39。
在 BLE 4.2 时代,Advertising、Scanning、Initiating 状态只允许在 Ch Index 的 37/38/39 上执行数据的收发。Advertising 是为了让其他 BLE 设备发现本设备,Scanning 是为了扫描到其他设备。为了让发现设备和广播更容易不受诸如 WIFI 的干扰,专门将 Advertising、Scanning、Initiating 数据收发放到了 与 WIFI 频段隔离的部分,起到一定抗干扰作用:
除了 37、38、39 这些频段,在 Connection 状态下使用了 其他的 37 个 Channel,通过跳频技术(Hopping),来减少数据干扰,增强系统的可靠性。