蓝牙协议阐明(5)_BL E广播通信相关的技能阐明

2021-09-29 13:59:59

各人都知道,对比传统蓝牙蓝牙低功耗(BLE)最大的打破就是加大了对广播通信(Advertising)的支持和操作。关于广播通信,通过“玩转BLE(1)_Eddystone beacon”和“玩转BLE(2)_利用bluepy扫描BLE的广播数据”两篇文章的先容,我们已经有了一个整体的认识。本文将依此为基本,从技能的角度,阐明和领略BLE协议中有关广播通信的界说和实现。

注1:之前的蓝牙协议阐明文章(如“蓝牙协议阐明(3)_蓝牙低功耗(BLE)协议栈先容”),方向于从横向、从大而全的角度,先容蓝牙协议,以便让各人有一个整体的认识。而从本文开始,我们会收敛到一个个的成果点上,以成果为出发点,从纵向的角度,游走于蓝牙协议的各个条理中,以加深对蓝牙协议的领略,进而到达交融意会的目标。

2. 概述 2.1 利用场景

在BLE协议中,广播通信主要有两类利用场景:

1)单一偏向的、无毗连的数据通信,数据发送者在广播信道上广播数据,数据吸收者扫描、吸收数据。

2)毗连的成立。

后续的阐明,将环绕这两个利用场景展开。

2.2 协议条理

在BLE协议中,和广播通信相关的协议条理较量简朴,主要包罗:

GAP-------->HCI-------->LL

LL(Link Layer)位于最底层,认真广播通信有关成果的界说和实现,包罗物理通道的选择、相关的链路状态的界说、PDU的界说、设备过滤(Device Filtering)机制的实现等。

HCI认真将LL提供的所有成果,以Command/Event的形式抽象出来,供Host利用。

GAP认真从应用措施的角度,抽象并封装LL提供的成果,以便让应用以较量傻瓜的方法举办广播通信。虽然,这不是必需的,也就是说,我们可以在没有GAP参加的环境下,举办广播通信。

3. Link Layer 3.1 状态界说

在某一个时刻,参加广播通信的BLE设备,从LL的角度看,可以处于如下三种状态的一种:

Advertising,数据发送方,周期性的发送广播数据;

Scanning,数据吸收方,扫描、吸收广播数据;

Initiating,毗连提倡方,扫描带有“可毗连”符号的广播数据,一旦发明,则提倡毗连请求(都是由Link Layer自动完成,不需要Host软件参加)。

3.2 PDU界说

按照应用场景的差异,处于差异状态的BLE设备,可以发送差异范例的PDU(Packet Data Unit),详细如下。

3.2.1 PDU名目

广播通信中,传输的PDU有如下的名目:

Header(16bits)   Payload(长度由Header中的“Length”字段抉择)  

Header的名目如下:

PDU Type(4 bits)   RFU(2 bits)   TxAdd(1 bit)   RxAdd(1 bit)   Length(6 bits)   RFU(2 bits)  

PDU Type,指示PDU的范例,详细可参考后头的先容。

RFU,reserved for future use。

TxAdd、RxAdd,由详细的PDU Type抉择其意义。

Length,PDU的长度,6 bits,有效范畴是6~37 octets。

3.2.2 PDU范例

  PDU范例   PDU名目   说明  
Advertising   ADV_IND   AdvA(6 octets)
AdvData(0~31 octets)
  connectable undirected advertising event,用于通例的广播,可携带不高出31bytes的广播数据,可被毗连可被扫描
AdvA,6bytes的广播者地点,并由PDU Header的TxAdd bit抉择地点的范例(0 public,1 random);
AdvData,广播数据。
 
    ADV_DIRECT_IND   AdvA(6 octets)
InitA(6 octets)
  connectable directed advertising event,专门用于点对点毗连,且已经知道两边的蓝牙地点,不行携带广播数据,可被指定的设备毗连不行被扫描
AdvA,6bytes的广播者地点,并由PDU Header的TxAdd bit抉择地点的范例(0 public,1 random);
InitA,6bytes的吸收者(也是毗连提倡者)地点,并由PDU Header的RxAdd bit抉择地点的范例(0 public,1 random)。
 
    ADV_NONCONN_IND   AdvA(6 octets)
AdvData(0~31 octets)
  和ADV_IND雷同,但不行以被毗连不行以被扫描  
    ADV_SCAN_IND   AdvA(6 octets)
AdvData(0~31 octets)
  和ADV_IND雷同,但不行以被毗连可以被扫描  
Scanning   SCAN_REQ   ScanA(6 octets)
AdvA(6 octets)
  当吸收到ADV_IND可能ADV_SCAN_IND范例的广播数据的时候,可以通过该PDU,请求广播者广播更多的信息:
ScanA,6bytes的本机地点,并由PDU Header的TxAdd bit抉择地点的范例(0 public,1 random);
AdvA,6bytes的广播者地点,并由PDU Header的RxAdd bit抉择地点的范例(0 public,1 random)。
 
    SCAN_RSP   AdvA(6 octets)
ScanRspData(0~31 octets)
  广播者收到SCAN_REQ请求后,通过该PDU响应,把更多的数据传送给接管者。
AdvA,6bytes的广播者地点,并由PDU Header的TxAdd bit抉择地点的范例(0 public,1 random);
ScanRspData,scan的应答数据。
 
Initiating   CONNECT_REQ   InitA (6 octets)
AdvA (6 octets)
LLData (22 octets)
  当吸收到ADV_IND可能ADV_DIRECT_IND范例的广播数据的时候,可以通过该PDU,请求和对方成立毗连:
InitA,6bytes的本机地点,并由PDU Header的TxAdd bit抉择地点的范例(0 public,1 random);
AdvA,6bytes的广播者地点,并由PDU Header的RxAdd bit抉择地点的范例(0 public,1 random);
LLData,BLE毗连有关的参数信息,详细请参考后续文章的先容。
 

3.2.3 总结

有关广播通信的PDU范例,总结如下: