目录
2.2 广播态
3.1.3 关闭连接事件(Closing Connection Events)
4.1 LL控制PDU(LinkLayer Control PDU)
4.2 连接更新(Connection Update Procedure)
1 前言
低功耗蓝牙(BLE, v4.0)在LL(linklayer)层可以分为5个状态:
- Standby State (待机/空闲态)
- Advertising State (广播态)
- Scanning State (扫描态)
- Initiating State (发起态)
- Connection State (连接态)
LL中的状态在每次只有一个状态处于活跃,完整的LL可以是上面5个状态中某几个的组合,但组合中必须要有Adv或者Scan其中一个。状态切换参考图1-1。
状态 |
描述 |
空闲态 |
不发送也不接收任何数据包,可以从其它任何态进入此状态。 |
广播态 |
发送广播包,可能侦听和应答广播包。处于广播态中的设备叫广播者(advertiser)。广播态可以从空闲态进入。 |
扫描态 |
侦听广播通道上的广播包。处于扫描态中的设备叫扫描者(scanner)。扫描态可以从空闲态进入。 |
发起态 |
侦听广播通道上特定的设备发出的数据包,并且对这些包作出应答,来与其它设备发起连接。处于发起态中的设备被称为发起者(initiator)。发起态可以从空闲态进入。 |
连接态 |
参考下文描述。 |
图1-1:Linklayer状态切换
针对连接态,可简述如下:
广播态中的LL会发送广播包,广播者可以侦听和回复对广播包的相应;发起者的LL收到广播包后想与之建立连接则对收到的广播包作连接请求,此时进入连接态(若收到了不连接但是回复扫描应答,则是扫描态)。
连接态中定义了两个角色:master和slave。从发起态进入的设备叫master,从广播态进入的叫slave。
建立连接过程(只需要两种数据包:ADV_IND/ADV_DIRECT_IND和连接请求数据包CONNECT_IND)都是在1M 基础速率上进行的。在未建立连接时,LL是在广播通道上传输,在广播通道上建立连接成功后,进入数据通道进行数据的传输。
2 非连接态
2.1 空闲态
空闲态是LL上默认的态,在此状态下LL不发射也不接收任何数据包。空闲态可进入广播态、扫描态和发起态。
2.2 广播态
LL在Host命令下可进入广播态,广播者能发送的包有广播、扫描和发起PDU。
广播PDU有下面4种类型:
- ADV_IND:可连接非定向广播包
- ADV_DIRECT_IND:定向可连接广播包
- ADV_NONCONN_IND:非连接非定向广播包
- ADV_SCAN_IND:扫描非定向广播包
上面几种广播包都是在广播态中发送,在扫描态或者发起态中接收。
1. ADV_IND:最常见的广播包,可以被周边任何设备接收并做连接。(TYPE = 0000)
AdvA是广播者的地址,类型由TXADD标定。
AdvData是广播者的Host端下发的数据。
2. ADV_DIRECT_IND:用于对特定设备建立快速连接的广播包,一般用于对已连接过的设备在断开后的重连。(TYPE = 0001)
AdvA是广播者的地址,类型由TXADD标定。
InitA是该PDU想发给目标的地址,也就是发起者的地址,类型由RXADD标定。该包无Host端数据。
3. ADV_NONCONN_IND:可被周边设备扫描到,但不能进行连接,也不能被应答。
数据格式除了TYPE = 0010外,其余与ADV_IND相同。
4. ADV_SCAN_IND:可被扫描的广播包,不建立连接。与ADV_NONCONN_IND区别在于,它需要被应答。
数据格式除了TYPE == 0110外,其余与ADV_IND相同。
扫描PDU有下面两种类型:
SCAN_REQ:由处于扫描态的LL发出,处于广播态的LL接收。
SCAN_RSP:由处于广播态的LL发出,处于扫描态的LL接收。
SCAN_REQ:TYPE = 0011:
ScanA是扫描者的地址,类型由TXADD标定。
AdvA是该包要应答的广播者的地址,类型由RXADD标定。该包无Host端数据。
SCAN_RSP:TYPE = 0100:
AdvA是广播者的地址,类型由TXADD标定。
ScanRspData可以是广播者的Host端下发的任何数据。
发起PDU:
CONNECT_REQ:由处于发起态的LL发出,处于广播态的LL接收。
CONNECT_REQ:TYPE = 0101,
IniA是发起者的地址,类型由TXADD标定。
AdvA是广播者地址,类型由RXADD标定。
LLData较为复杂,但是很重要,它详细地定义了要建立连接的一些参数。数据格式如下:
AA:LL连接的Access Address,注意区分于广播包的0x8E89BED6。
CRCInit:LL中计算CRC的初始值,该值应该为由LL产生的一个随机值。
WinSize:开窗大小,用于决定建立连接里面的参数transmitWindowSize值,
transmitWindowSize = WinSize*1.25ms。
WinOffset:开窗偏移量,用于决定建立连接里面的参数transmitWindowOffset值,
transmitWindowOffset = WinOffset*1.25ms。
Interval:连接间隔,用于决定建立连接里面的参数connInterval值,
connInterval = Interval*1.25ms。
Latency:连接延时,用于决定建立连接里面的参数connSlaveLatency值,
connSlaveLatency = Latency。
Timeout:连接超时,用于决定建立连接里面的参数connSupervisionTimeout值,
connSupervisionTimeout = Timeout*10ms。
ChM:ChM指示channel map里面Used和Unused频道号,每一个频道号在channel index里面由1bit位置信息标记。LSB代表channel index 0,在位置36的bit代表channel index 36。bit0代表这个通道是Unused,bit1代表这个通道是Used。位置37,38,39的bits是RFU。
Hop:跳频步长,用于决定在跳频算法里面的hopIncrement值,该参数应该是5~16之间的一个随机值。
SCA:用于指示Master端睡眠时钟的最差精度,参考下表:
SCA |
masterSCA |
SCA |
masterSCA |
0 |
251 ppm~500 ppm |
4 |
51 ppm~75 ppm |
1 |