BLE - LINK LAYER SPECIFICATION
一、 BLE控制器链路层概述
蓝牙链路层(Link Layer)有五个状态:就绪、广播、扫描、初始化、链接。
- 连接状态下,可以同时为主和从
- 连接状态下,处于从可能支持多个连接。
- 连接状态下,处于主可能支持多个连接。
- 连接状态下,链路层和另外一个链路层只能保持最多一个链接。
- 分为广播通道(37-39)和数据通道(0-36)。
- 两个设备通信要在同一个物理通道上,所以在一个时间要在同一个RF通道上。
- 通道有限,为了避免碰撞,每一个物理通道上的传输都以一个接入码为开端。
- 每一个链路层都在一个给定的时间使用一个物理通道。
二、空中包
#######################################################
#######################################################
4 Air Interface Protocol根据地址筛选设备
白名单有一个白名单列表,包含了设备地址和地址类型(公共或者随机)
如果不是使用直接广播方式的话,筛选策略应该被忽略,否则应该使用其中一种
- 链路层从白名单中处理扫描和链接请求
- 链路层直接处理所有扫描和连接请求
- 链路层从所有设备中处理扫描请求,从白名单中处理连接请求
- 链路层从所有设备中处理连接请求,从白名单中处理扫描请求
- 链路层从白名单中处理广播包,可连接的直接广播包不包含在扫描设备地址会被忽略。
- 链路层从所有包中处理广播包,可连接的直接广播包不包含在扫描设备地址会被忽略。
如果支持拓展的扫描筛选策略,也可能支持
- 链路层从白名单中处理广播包,可连接的直接广播包z中的initA是一个可分解私有地址就不会被忽略。
- 链路层从所有包中处理广播包,可连接的直接广播包z中的initA是一个可分解私有地址就不会被忽略。
4.3.4 Initiator Filter Policy
- 链路层从白名单中的所有设备处理广播包。
- 链路层忽略白名单并且从一个指定的广播包中处理可连接包。
4.4 NON-CONNECTED STATES
4.4.1 Standby State
链路层的默认状态,必须不收不发,可以进入广播、扫描和初始化状态。
4.4.2 Advertising State
在这个状态,链路层发送广播PDU,处于广播事件。
四种广播事件
- a connectable undirected event
- a connectable directed event
- a non-connectable undirected event
- a scannable undirected event
广播事件类型 | PDU类型 | 允许的响应 | |
SCAN_REQ | CONNECT_REQ | ||
Connectable Undirected Event | ADV_IND | YES | YES |
Connectable Directed Event | ADV_DIRECT_IND | NO | YES |
Non-connectable Undirected Event | ADV_NONCONN_IND | NO | NO |
Scannable Undirected Event | ADV_SCAN_IND | YES | NO |
- advInterval要是20ms到10.24s,以0.625ms整数倍增减(根据事件还细分两个要求,在core中提及)
- advDelay是0到10ms的位随机数
4.4.3 Scanning State
进入扫描状态由Host指定
有两种扫描,passive和active
两个参数:scanWindow和scanInterval,必须小于等于10.24s,前者小于等于后者。
对于不重复的PDU,链路层必须发一个广播报告到HOST,并且包含广播者的设备地址和广播数据(或者扫描响应数据)。
重复的就不需要
##Passive Scanning
处于这个状态的时候,链路层只收包,不发包。
##Active Scanning
这个状态下,链路层必须根据广播PDU的类型监听广播包。
对于ADV_DIRECT_IND PDU 或 ADV_NONCONN_IND PDU,链路层不会发送SCAN_REQ的PDU。
链路层在进入扫描状态的时候必须至少发送一个SCAN_REQ给所有的广播者(广播ADV_IND和ADV_SCAN_IND的)。
扫描者跑一个补偿过程来减少SCAN_REQ的碰撞。
有两个参数,分别是backoffCount和upperLimit。在进入的时候,这两个要写1.
4.4.4 Initiating State
ADV_IND或者ADV_DIRECT_IND符合的话就发送CONNECT_REQ。
发送了CONNECT_REQ之后,链路层离开初始化状态,作为主,进入到连接状态。
4.5 CONNECTION STATE
设备发送CONNECT_REQ或者受到了CONNECT_REQ之后就进入到这个状态
进入以后,链接被认为是创建了(created),但是没有建立起来(established)。
一个连接被建立起来的条件是(established),一旦一个数据通道的包从另外一个设备那边受到。
created和established的区别是链路层的连接超时值是否有使用。(connection supervision timeout)
两个角色,master和slave。
master控制连接事件的定时,同步。
在两个设备地址之间只能有一个连接,一个初始化这不能喝一个已经连接的广播者发送连接请求。
另外,如果一个广播者收到了连接请求的话就应该无视掉另外同样设备发出的连接请求。
4.5.1 Connection Events
在这个事件中,主从选择收、发数据包,此时连接事件被认为是开放的。
从在收到一个从master那边发来的不理会合法CRC匹配的包的时候会一直发一个包,除非在几次以后根据Section4.5.6有其他做法。
主在收到从发来的不理会合法CRC匹配的包的时候会一直发一个包。
如果主没有收到从发来的包,那么主必须关闭连接事件。
根据4.5.6,两个设备中的任何一个都可以关闭连接事件。
两个参数connInterval和connSlaveLatency。
连接事件的开始称作一个锚点。在锚点上,主必须开始发送一个数据通道PDU到从。
连接事件的开始根据connInterval并且不能有重叠。
主必须确保一个连接事件在另外一个连接事件锚点之前的最少的T_IFS前关闭;同时slave在另外一个锚点收听包
conInterval必须是1.25的倍数,从7.5ms到4.0s,由Host指定。
"从延迟"用于使用在数量缩减的连接事件中。
connSlaveLatency不会造成一个监督超时,并且必须在0-((connSupervisionTimeout / (connInterval*2)) - 1)之间,且不能超过500.
如果在使用了从延迟没有收到包,那就会不适用从延迟,直到收到包为止。
主从都有一个16位的事件计数器(connEventCounter)
4.5.2 Supervision Timeout
这个参数是为了检查链路是否断开,记作 T(LLconnSupervision).
在连接建立(establish)之前,如果连接检查定时器达到6 * connInterval,连接必须被认为是丢失的。
connSupervisionTimeout这个参数指定了两个PDU互发间隔的最大的时间,并且必须是10ms的倍数,处于100ms到32s之间,并且必须大于((1 + connSlaveLatency) * connInterval * 2)。
断开以后链路层就离开了连接状态,转换为就绪状态。
4.5.3 Connection Event Transmit Window
这个东西用于灵活调度连接事件。
有三个参数来决定这个window
开始于一个CONNECT_REQ结束后的transmitWindowOffset + 1.25ms,
transmitWindowSize决定了window的大小,
connInterval用来计算window的偏移最大量。
transmitWindowOffset和transmitWindowSize都由链路层决定。
transmitWindowOffset必须是1.25ms的乘积,范围在0ms - connInterval之间,
transmitWindowSize必须是1.25ms的乘积,并且在小于10ms和connInterval-1.25ms之间。
4.5.4 Connection Setup – Master Role
在连接状态下,master发送的第一个包决定了第一个连接事件的锚点,还有接下去未来连接事件的timings。
第二个连接事件开始就必须为遵循connInterval。
4.5.5 Connection Setup – Slave Role
Slave负责监听,并且不管CRC匹配,在链接状态下都决定了第一个连接事件的锚点。
4.5.6 Closing Connection Events
如果在数据通道PDU没有设置MD位的话就会关闭连接事件,如果开启的话就会继续发送包。
如果没master没有从slave那边收到包的话,就会关闭连接事件。
、
4.5.7 Window Widening
用于 Slave和master同步连接事件
4.5.8 Data Channel Index Selection
有两件事要做
##Channel Classification
##Channel Selection
4.5.9 Acknowledgement and Flow Control
Ack和留空必须用于所有链路层连接。
对于每个连接,链路层有两个参数,都只有1bit:
transmitSeqNum:标记通过链路层发出去的包
nextExpectedSeqNum:用于对面ACK收到的包,或者请求重发。
两个参数要在进入到连接状态的时候设置为0。
4.6 FEATURE SUPPORT
4.6.1 LE Encryption
• LL_ENC_REQ (Section 2.4.2.4)
• LL_ENC_RSP (Section 2.4.2.5)
• LL_START_ENC_REQ (Section 2.4.2.6)
• LL_START_ENC_RSP (Section 2.4.2.7)
• LL_PAUSE_ENC_REQ (Section 2.4.2.11)
• LL_PAUSE_ENC_RSP (Section 2.4.2.12)
• Encryption Start Procedure (Section 5.1.3.1)
• Encryption Pause Procedure (Section 5.1.3.2)
4.6.2 Connection Parameters Request Procedure
如果支持,必须支持如下:
• LL_REJECT_IND_EXT (Section 2.4.2.18)
• LL_CONNECTION_PARAM_REQ (Section 2.4.2.16)
• LL_CONNECTION_PARAM_RSP (Section 2.4.2.17)
• Connection Parameters Request Procedure (Section 5.1.7)
4.6.3 Extended Reject Indication
• LL_REJECT_IND_EXT (Section 2.4.2.18)
4.6.4 Slave-initiated Features Exchange
• LL_SLAVE_FEATURE_REQ (Section 2.4.2.15)
• LL_FEATURE_RSP (Section 2.4.2.10)
4.6.5 LE Ping
• LL_PING_REQ (Section 2.4.2.19)
• LL_PING_RSP (Section 2.4.2.20)
• LE Ping Procedure (Section 5.1.8)
• LE Authenticated Payload Timeout (Section 5.4)
4.6.6 LE Data Packet Length Extension
• LL_LENGTH_REQ and LL_LENGTH_RSP (Section 2.4.2.21)
• Data Length Update Procedure (Section 5.1.9)
4.6.7 LL Privacy
• LL Privacy (Section 6)
4.6.8 Extended Scanner Filter Policies
• Scanner Filter Policy (Section 4.3.3)
5 LINK LAYER CONTROL
LLCP包括了连接、开始和暂停加密以及其他的一些过程。
5.1.1 Connection Update Procedure
如果master或(和)slave不支持连接参数请求的过程,master可能会通过LL_CONNECTION_UPDATE_REQ PDU来初始化链接参数的更新。
slave不能发这个PDU。
如果master或(和)slave不支持连接参数请求的过程,slave可以使用L2CAP LE信号通道来改变链接参数。
如果master和slave都支持连接参数请求过程的话,slave可能会请求更新一个连接参数。
如果在都支持连接参数请求过程的情况下,为了更新链接参数,master必须使用链接参数请求。如果slave拒绝了,那么master可能使用链接更新过程来更新。