本章节主要从linklayer层的设备地址,空中报文格式,以及数据流的接收和发送
在SPEC core_4.2表红圈的地方介绍了本章节的内容。
少废话先看东西
从这张图我们可以看到出,ble的地址分为 public device address 和 random device address二大类。random device address 分为 static device address 和 private device address。 private device address 有分为 no-resolvable 和 resolvable。ble 分为这么多地址,干什么呢?其实都是为了应用不同场合的,后面会分析。
注意一点:ble设备至少需要包含上述的一种数据报文,如果一个设备使用了resolvable address,那么必须还要有一个identify address(public or static address)。
3.1、public device address
全球合法且独一无二的标识,这个就是电脑的MAC一样。缺点:要钱要钱,要钱去申请。
如上图,public device address 由48 bit组成。高24为表示公司的id(这个需要申请),低24bit由公司自己分配。
3.2、static device address
这个地址属于random地址,它的出现是因为public地址存在一些问题。第一个问题是public地址要钱,要申请。第二个问题是public的地址是固定的,很容易遭到窃取信息(比如这个设备在adv,我们只要知道这个设备的地址就能找到对应的adv的信息)。如果这个设备的在初始化随机生成地址呢?
static 的特征是:
1)上电初始化的时候随机生成
2)断电的时候地址丢失,不是强制的,如果地址丢失原先保存的peer的信息也会丢失
3)最高2bit为1
3.3、resolvable device address
这个地址比较有用,主要用在privacy上面。privacy会在后面的章节介绍。它是通过随机书prand和IRK生成的,IRK是Identity Resolving Key 的缩写,意思就是对方设备需要保存一个相同的IRK,才能解析我的地址,进而才能进行扫描和连接等操作。
1)最高2bit是1和0,剩下的22bit随机生成
2)最低24bit,使用rk和prand进行哈希算法生成哈希值
3)对方设备通过接受到你的prand,使用本地的irk,运用ah(local_irk,peer_prand)算出 hash与peer hash进行比较,如果相等表示解析成功
4)运用在privacy的策略上,后续文章会详细介绍
3.4、non resolvable device address
这个格式如上,不可解析(暂时还不知道它的应用场景,后续发现了会补上)
上图展示是一个空中报文的格式,preamble , access address 的作用已经在前面的physical layer详细说明了。本章节主要主要分析PDU的部分。
PDU 分为 advertising channel PDUS 和data channel PUDS。
header:是16bit的头,这个头决定了这个报文的类型以及报文的长度,以及报文的设备的地址类型
PUD type:如下图,决定了报文的类型
length:的长度是6到37个字节,其中前6个字节是必须标识发送广播的源设备地址,后面的31个字节是用户数据,在HOST层的GAP便对这个31个字节数据进行格式的封装。
txadd:发送报文的地址类型,0表示public地址,1表示random地址
rxadd:表示接收方设备地址类型,0表示public地址,1表示random地址
4.1.1、ADV_IND
一般通用的广播,支持scan和connect,可以额外携带31个字节的用户数据
4.1.2、ADV_DIRECT_IND
直接连接的广播,分为high duty 和 low duty 2中,这个报文是直接连接的报文,一般被连接方先扫描
4.1.2、ADV_NONCONN_IND
不可连接和scan的广播,蓝牙的mesh的组网就是发送这种广播
4.1.3、ADV_SCAN_IND
这种广播可以被SCAN,但是不能连接
4.1.4、SCAN_REQ
当advertising发送可以被scan的adv的时候,initiating 可以发送 scan request 报文 ,advertising 需要回复 scan rsp给
initiating。
header 携带了很多控制信息,例如 data的类型,payload 是有效载荷,mic是消息完整性检查分场景的(如果payload 为空或者该linklayer 没有加密可以不添加mic部分,反之添加mic部分)
4.2.1 header 分析
大家自己看图吧,每个为都解释很清楚,如果不明白请查看我上一篇的文章。
data channel pdus 分为 ll data pdu和 ll control pdu。
4.2.2 ll control pdu
这个主要建立连接过后,发送一些控制命令进行交互,比如更新连接参数,交换feature(发送很多命令之前,都会先发送以便确认对方支不支持这个命令),下图列举了部分命令。不一一进行解释了
4.2.3 data control pdu
在header中LLID位如果是01表示是一个分段的数据,10表示是一个完整的数据报文。理论上一次connection event我们只能发20个有效的用户数据,大于20个有效数据就会分段进行发送,接受方通过判断这个位可以把分段的数据进行重组。