低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

时间:2023-03-09 19:22:00
低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

链路层定义设备处于状态机中五种状态的一种:

(1)旁路状态;

处于此状态下的设备不发送或接收数据,处于其它状态下都可以转到此状态。

(2)广告状态;

处于此状态的设备发送广播包或者监听、响应广播包。可由旁路状态进入广告状态。

(3)扫描状态;

扫描状态监听广播信道上的处于广播状态发送的广播包。扫描状态也由旁路状态进入。

(4)发起状态;

处于此状态监听广播信道上的广播包并响应初始化一个连接。它也由旁路状态进入。

(5)连接状态。

由广播状态或发起状态进入。

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

任意时刻仅能处于五种状态中的一种,设备可能处于同时处于多种状态扮演不同的角色,但至少支持广告状态或扫描状态。

广播事件类型决定设备是否响应,下表每个广告事件允许响应的关系:

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

对于所有的非定向连接,两个广告事件之间的时间T_advEvent的计算公式如下:

T_advEvent = advInterval + advDelay

advInterval的值是0.625ms的倍数,介于20ms和10.24s之间的值。如果事件类型是一个可扫描的非连接事件,或者是一个非连接的非定向事件,它的值不能小于100ms;如果是可连接的非定向事件,它的值可以是20ms或更大。

advDelay的值是一个伪随机值,范围是0~10ms,它由广播事件产生。

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

advDelay的值的插入,使用两次广告事件之间的间隔是一个随机值,这样可以减小信道冲突的可能性。

可连接的非定向广播包使用ADV_IND PDU标志。可连接的非定向广播事件允许扫描者或发起响应。扫描者发送扫描请求(SCAN_REQ PDU)请求关于广告者的信息。发起者发送连接请求(CONNECT_REQ PDU)请求进入连接态。

如果广告者收到一个SCAN_REQ PDU(包含了扫描者的设备地址),它将在同一信道上回复一个SCAN_RSP PDU,当PDU发送完成后广告过滤器将禁止再处理SCAN_REQ PDU,它进入下一个信道发送ADV_IND PDU或停止广告事件。

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

如果广告者收到一个CONNECT_REQ PDU,如果广告发起者被广告过滤器允许,它将进入连接状态。如果不被允许,它将进入下一个信道发送ADV_IND PDU或停止广告事件。

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

两个连续ADV_IND PDUs之间的间隔必须小于或等于10ms:

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

设备地址

设备地址用于区分不同的设备,共48位,它是一个公共地址或是随机地址。设备至少包含一种地址或是两者都使用。

公共地址划分成两个部分:

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

随机地址划分成以下两个部分:

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

包格式

一个包由前导、访问地址、PDU和CRC组成:

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

前导是8位,访问地址32位、PDU2~39个字节、CRC是24位。

一个最短的包是80位,最长的包是376位。

PDU由头、净荷、MIC区域组成:

低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层