Preamble: 引导码, 为1个字节, 不显示出来.
Access Address: 访问地址, 长度为4个字节, 所有广播包的访问地址都是0x8E89BED6, 如下图.
当PDU在广播信道传输时, 就是广播PDU, 如果在数据信道传输, 就是数据PDU, CRC就是根据这个PDU计算的.
广播信道的PDU包括一个16bit的头, 跟一个可变长度的负载.
发送跟接受地址的0/1, 代表发送或者接收方的地址是:
0: 公共地址
1: 随机地址
这里, 发送方地址为随机地址, 接收方地址为公共地址, PDU长度为17个byte.
说回PDU类型:
ADV_IND用于可连接的非定向广播时间中, 具有以下格式:
TxAddr为随机地址, 那么这个地址就在AdvA中, 6个字节, 即MAC地址, 而且是随机的.
AdvData里面是广播者的数据.
再看一个ScanQeq跟ScanRsp的两个数据包:
首先,发请求的
TxAdd是1, 证明是随机地址.
Adv的PDU头展示的Type是4, 即: ADC_SCAN_RSP
static uint8 scanRspData[] =
{
// complete name
0x14, // length of this data
GAP_ADTYPE_LOCAL_NAME_COMPLETE, //0x09
0x53, // ‘S‘
0x69, // ‘i‘
0x6d, // ‘m‘
0x70, // ‘p‘
0x6c, // ‘l‘
0x65, // ‘e‘
0x42, // ‘B‘
0x4c, // ‘L‘
0x45, // ‘E‘
0x50, // ‘P‘
0x65, // ‘e‘
0x72, // ‘r‘
0x69, // ‘i‘
0x70, // ‘p‘
0x68, // ‘h‘
0x65, // ‘e‘
0x72, // ‘r‘
0x61, // ‘a‘
0x6c, // ‘l‘
// connection interval range
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
LO_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ), // 100ms
HI_UINT16( DEFAULT_DESIRED_MIN_CONN_INTERVAL ),
LO_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ), // 1s
HI_UINT16( DEFAULT_DESIRED_MAX_CONN_INTERVAL ),
// Tx power level
0x02, // length of this data
GAP_ADTYPE_POWER_LEVEL, //0x0A
0 // 0dBm
};
这样看来, 这个ScanRspData里面包含几部分,包括
第1个字节, 是名称的数据长度: 0x14, 注意, 是20
第2个字节, 0x09, 表示接着是BLE全名, 如果0x08表示是短名.
接下来就是BLE的名字SimplePeripheral, 一共19个字节, 加上前面一个字节, 就是20个字节.
接着又是数据长度, 5个字节
接着是最小最大连接间隔设定的代号, 0x12
接着是4个字节的具体设置.
最后是关于发射的强度/功率的设置的3个字节, 0dBm.
再来看一个从扫描到连接的例子:
首先发一个连接请求:
连接请求的格式是:
InitA是发起者的地址, AdvA就是广播者的地址, 也就是要连接的目标地址.
接着是LLData里面22个字节.
Inteval/Lantency/Timeout就是BLE连接属性
0x0018/0x0000/0x0048, 这是iPhone手机的默认设置.
LLID为1, 表示负载域是一个LL DATA PDU, 数据包, 如果是3, 表示是控制包.
NESN: nextExpectedSeqNum.
MD如下:
看得我都要怀疑人生了, 我看这个干嘛???
好吧, 这个是整个通讯的建立过程, 对无线的架构师可能是有参考意义的...