1.1 链路层的状态
链路层的运行可以用状态机来描述,状态机有以下五种状态:
- Standby State
- Advertising State
- Scanning State
- Initiating State
- Connection State
链路层状态机同一时间只允许处于一个状态。 链路层应该至少有一个支持广播或者扫面状态的状态机。链路层可能存在多个状态机的实例。
链路层处于Standby 状态时是不会发送或者接收任何包的。Standby状态是可以通过其它任何状态进入的。
链路层处于广播态时,将会发送广播通道包,并且也可能监听和响应这广播信道包触发的响应。处于广播态的设备称为广播者。Advertising State 可以从Standby状态进入。
处于扫描状态的链路层将侦听来自正在广播的设备的广播信道包。 处于扫描状态的设备称为scanner。 Scanning State 可以从Standby State进入。
处于 Initiating State的链路层将监听来自特定设备的广播信道的数据包,并对这些数据包作出响应,以发起与另一台设备的连接。 处于Initiating状态的设备称为initiator。 Initiating State可以从Standby State 进入 。
连接态可以从Initiating State 或者Advertising State 进入。
在 Connection State 中定义了两个角色:
- Master Role
- Slave Role
从Initiating State进入到 Connection State的设备称为Master,从广播态进入到连接态的设备为Slave。
链路层的Master会与Slaver设备进行通信,并定义传输时间。
1.1.1 状态和角色组合限制
链路层可以选择性的支持多个状态机。如果他支持多个状态机,那么:
- 处于连接状态的链路层可以以主角色和从角色运行。
- 处于“连接状态”(Connection State)的链路层(Link Layer)在“从角色”(Slave Role)中可能有多个连接。
- 处于“连接状态”的链路层在“主角色”中可能有多个连接。
- 还可以支持所有其他状态和角色的组合。
- 处于连接状态的链路层应该最多有一个连接到另一个处于连接状态的链路层。
链路层实现不需要支持本规范允许的所有可能的状态组合。但是,支持下表中“组合a”列所列状态或者状态组合的,还应当支持表中相应的状态或者状态组合
结合B”列。
Combination A | Combination B |
---|---|
初始化加上其他状态C的任意组合 | 连接(主角色)加上相同的组合C |
连接(主角色)+初始化+其他状态的任意组合 | 连接(主角色)到多个从属角色的设备加上相同的组合C |
可连接状态或定向发布状态加上其他状态的任意组合C | 连接(从角色)加上相同的组合C |
连接(从属角色)加上可连接状态或定向发布状态,再加上其他状态的任意组合C | 连接(从角色)到一个以上的设备在主角色加上相同的组合C |
在每种情况下,其他状态C的组合可能为空。注意,在最后两行中,“其他状态”包括其他可连接或定向广播状态。
1.2 比特顺序
在链路层规范中定义数据包或协议数据单元(PDU)中的字段时,比特顺序遵循小端字节格式。适应一下规则:
- LSB (Least Significant Bit)对应于b0
- LSB是第一个通过空中发送的比特
- 在插图中,LSB显示在左边
此外,链路层定义的数据字段,如PDU报头字段,需要先通过LSB传输。例如,一个3位参数X=3被发送为:
b0b1b2 = 110
在空中,首先发送1,然后发送1,最后发送0。 这在规范中显示为110。
本规范中指定的二进制字段值遵循格式10101010b.
1.3 设备地址
设备通过设备地址进行标识。设备地址可以是公共设备地址,也可以是随机设备地址。公共设备地址和随机设备地址的长度均为48位。
一个设备应该使用至少一种类型的设备地址,并且可能包含这两种地址。
如果一个设备使用可解析的私有地址,它也应该有一个标识地址,可以是一个公共设备地址或随机静态设备地址类型。
1.3.1 Public Device Address
公共设备地址分为以下两个字段:
- Company_assigned字段包含在低24位中
- Company_id字段包含在高24位中
1.3.2 Random Device Address
随机设备地址可以是以下两种子类型中的任何一种:
- Static address
- Private address.
发送随机设备地址是可选的。设备应接受来自远端设备的随机设备地址的接收.
1.3.2.1 Static Device Address
静态地址是随机生成的48位地址,需要满足以下要求:
- 地址中高两位应等于1
- 地址的随机部分的所有位不应等于1
- 地址的随机部分的所有位不应等于0
设备可以选择在每次上电将其静态地址初始化为一个新值。 一个设备不能改变它的静态地址值,一旦初始化,直到设备掉电。
注意:如果设备的静态地址改变了,那么存储在对端设备中的地址将无效,使用旧地址重新连接将会失败。
1.3.2.2 Private Device Address Generation
私有地址可以是以下两种子类型中的任何一种:
- 不可解析的私有地址
- 可解析的私有地址
为了生成不可解析地址,设备需要生成一个48位的地址,要求如下:
- 地址中的高两位应等于0
- 地址的随机部分的所有位不应等于0
- 地址的随机部分的所有位不应等于1
- 地址不得与公开地址相等
为了生成一个可解析的私有地址,设备必须具有本地身份解析密钥(IRK)或对等身份解析密钥(IRK)。 可解析的私人地址应与IRK和随机生成生成的24位的数字。 该随机数称为prand和shall满足以下要求:
- prand的高两位应该等于01
- prand的随机部分的所有位不应等于0 或者1
1.3.2.3 Private Device Address Resolution
如果在这个过程对应的设备IRK是可用的,那么这个可解析的私有地址可以被解析。 如果一个可解析的私有地址被解析了,那么设备可以将该地址与对端设备关联。
注意:一个不能在T_IFS内解析私有地址的设备可能会在接收到下一个事件时做出响应。
无法解析不可解析的私有地址 。
1.4 物理通道
蓝牙在2.4G ISM 频段定义了40个RF 信道,分为两种,广播信道和数据信道。 广播信道使用三个RF通道来发现设备、发起连接和广播数据。数据通道有37个,用于连接设备之间的通信,每个RF信道都被分配一个唯一的信道索引。希望通信的两个设备使用一个共享的物理通道。为此,它们的收发器必须同时调到相同的射频信道。
考虑到RF信道的数量是有限的,并且许多蓝牙设备可能在相同的空间和时间区域内独立运行,两个独立的蓝牙设备的收发器将调谐到相同的RF信道的可能性很大,从而导致物理信道碰撞。为了减轻这种冲突的不利影响,物理通道上的每次传输都从一个Access Address开始,该地址被调优到物理通道的设备用作相关代码。此访问地址是物理通道的一个属性。访问地址出现在每个传输包的开始。
链路层在给定的时间使用一个物理通道。
当链路层被同步到一个物理通道的时间,频率和访问地址时,它被称为“连接”到这个通道(它是否积极地参与信道上的通信)。
本文参考:BLUETOOTH SPECIFICATION Version 4.2 [Vol 6, Part B]