BLE Link Layer数据包和事件交互
BLE设备的状态迁移图:
Standby State:不会发送和接收数据包
Advertising State:转发广播数据包并且能够监听广播通道的数据,在这个状态下,设备被认为是广播者
Scanning State:监听广播通道的数据,这个状态下被当做扫描者。
Initiating State:监听广播广播通道数据从一个特定的设备,然后发起连接。
Connection State:设备连接起来
Link Layer pack格式:
主要有两种 pack:
Advertising pack、Data pack
Preamble(这个值取决于Accesss Address的最低位):
如果是0就是 10101010
如果是1就是 01010101
Accesss Address:
对于广播信道的是个固定的值: 0x8E89BED6
如果是数据通道的话,Accesss Address这个值由在Initiating设备所产生的随机值
产生的随机值有六大要求:
(1)不能是6个连续的0或者1
(2)不能和广播信道的值一样
(3)最少要和广播信道的值保持两位不一样
(4)四个字节的值不能一样
(5)不能出现24个翻转
(6)每六个相同的bit要翻转一次
PDU:具体决定这个数据包是什么类型
Advertising PDU:
Header:
PDU Type:决定广播pack是哪一种类型
RFU:保存用在以后使用
TxAdd: 发送数据发送设备Device Address是公开的(Txadd = 0)或者随机的(Txadd = 1)
RxAdd: 接收数据是接收设备Device Address是公开的(Txadd = 0)或者随机的(Txadd = 1)
Length:表明Payload的长度
PDU Type有以下具体的广播事件:
Advertising State:
ADV_IND:没有确定连接方向的可连接广播事件
ADV_DIRECT_IND:确定连接设备的广播事件
ADV_NONCONN_IND:不可连接的广播事件
ADV_SCAN_IND:扫描没有连接的广播事件
ADV_IND:当PDU_TYPE = ADV_IND TxAdd 反应广播地址是公开的(Txadd = 0)或者随机的(Txadd = 1)
AdvData:包含广播数据来自于广播的主机(I2CAP)
ADV_DIRECT_IND:
AdvA:广播设备的地址
InitA:发起连接的设备地址
这个包不包含任何主机数据
RxAdd : (RxAdd = 0) (RxAdd = 1)
表明发起的广播地址是公开还是随机的
ADV_NONCONN_IND:
ADV_SCAN_IND
扫描PDU:
SCAN_REQ:数据的发送在Scaning State接收在Advertising State
SCAN_RESP:数据发送在Advertising State接收在Scaning State
发起状态的PDU:
CONNECT_REQ:数据发送在Initiating State接收在Advertising State
AA:Access Address
CRC:
WinSize:表示传输的大小
WinOffset:
Interval:传输间隔
Latency:
Timeout:
ChM:表示数据通道是否使用,总共有37个数据通道(0~36)
bit 0 对应的是数据通道 0
bit 36 对应的是通道 36
37 38 39 保存
SCA:
LL Data PDU:
Header:
LL DATA Control PDU:
Length: 不能设置0
Opcode表示不同的控制类型
LL_CONNECTION_UPDATE_REQ:
LL_CHANNEL_MAP_REQ:
LL_TERMINATE_IND:
LL_ENC_REQ:
LL_ENC_RSP:
LL_START_ENC_REQ:
没有CtrData
LL_START_ENC_RSP:
没有CtrData
LL_UNKNOWN_RSP:
LL_FEATURE_REQ:
LL_FEATURE_RSP:
LL_PAUSE_ENC_REQ:
没有CtrData filed.
LL_PAUSE_ENC_RSP:
没有CtrData filed.
LL_VERSION_IND:
LL_REJECT_IND:
LL_SLAVE_FEATURE_REQ:
LL_CONNECTION_PARAM_REQ:
LL_CONNECTION_PARAM_RSP:
LL_REJECT_IND_EXT:
LL_PING_REQ:
没有CtrData
LL_PING_RSP:
没有数据