第10节-BLE协议链路层(LL)

本篇博客的学些要结合书籍《低功耗蓝牙开发权威指南,Robin Heydon著》第7章,实际上这书只是对蓝牙原版协议的简化、摘要。

回顾以前学过的《BLE协议各层的形象化理解》和《BLE协议各层数据格式概述》

 一  链路层的5种状态:

就绪态(Stanby)、扫描态(Scanning)、广播态(Advertsing)、发起态(Initiating)、连接态(Connection)。

扫描态有2种子状态:被动扫描(Passive Scanning)、主动扫描(Active Scanning)

连接态有2种子状态:主(Master Role)、从(Slave Role)

二、数据格式:

LL层可以发出:广播包、数据包。Access Address等于0x8e89bed6时,是广播包;否则是数据包。

广播包

广播包有多种:

ADC_IND(通用广播)

ADV_DIRECT_IND(定向广播)

ADV_NONCONN_IND(不可连接广播)

ADV_SCAN_IND(可扫描广播)

SCAN_REQ(扫描请求)

SCAN_RSP(扫描响应)

CONNECT_REQ(连接请求)

 2. 数据包

主设备连接从设备时,主设备分配一个32位的随机数并发送给从设备,这就是access address

access address被用来表示一个连接,在连接保持期间,access address不变。

对于同一个从设备,断开连接后再重新连接,access address会重新生成

数据包有2种:

发给链路层的控制包(LLID=11b)

空包,或发给上层L2CAP的数据包(LLID=01b,10b)

L2CAP的数据包很大时,可以拆分来多次发送,有起始包(LLID=01b)、延续包(LLID=10b)

这些包的数据格式,使用Wireshark很容易解析,只需要稍有了解即可。

三、自适应跳频:

对于广播包,会在37、38、39这3个广播信道循环发送;

对于数据包,会使用自适应跳频算法,在0~36这37个数据信道中挑选可用的信道。

主设备发出CONNECT_REQ时,会含有一个hop值,就是下面公式里的hopIncrement;还会含有一个Channel Map,它是一个37位的字段,每一位代表一个数据信道。某位为1,表示对应的信道可以使用;某位为0,表示对应的信道不可使用。

举例说明跳频算法(参考《低功耗蓝牙开发权威指南,Robin Heydon著》第7章)。

1. 在CONNECT_REQ中:

hop为7,

ChannelMap = 000111100000000011100000000001100000000 (bit 0对应Channel 0)

所以:

可用的信道Used = [9,10,21,22,23,33,34,35,36]

可用的信道数numUsed=9

2.跳频示例

连接事件:

主从设备之间可以发送数据,主设备可以从某个channel发送数据给从设备,从设备使用同一个channel向主设备回复数据。这一来一回就是一个连接事件。

有时候,从设备为了省电,没有回复数据,这也是一个channel;

主设备发送下一个包时,使用另一个channel,这是另一个连接事件。

连接事件

计数器

fn+1=(fn+hop)mod37

fn+1能用吗

remappingIndex

= fn+1 mod 9

重映射的最终要用的信道

Used[remappingIndex]

0

7

7

35

1

14

5

33

2

21

21

3

28

1

10

4

35

35

5

5

5

33

连接事件计数器为0时(一个事件对应一个channel),fn =0, hop=7----->fn+1= 7,从数组used中可以看出,fn+1是不能用的。因为used 数组中元素的个数为9,所以remappingIndex =7 mod 9 =7------->used[7]=35

连接事件计数器为1时,fn =7, hop=7----->fn+1=14,从数组used中可以看出,fn+1是不能用的。因为used 数组中元素的个数为9,所以remappingIndex =14 mod 9 =5------->used[5]=33

原文地址:https://www.cnblogs.com/-glb/p/11617678.html