为了完全理解BLE中的广告,我们需要退后一步,了解BLE体系结构中的一层:通用访问配置文件(GAP)

android12 蓝牙可见性 蓝牙对外可见_字段

GAP提供了一个框架,该框架定义BLE设备之间的交互方式。这包括:

  • BLE设备的作用
  • 广告(广播,发现,广告参数,广告数据)
  • 建立连接(发起连接,接受连接,连接参数)
  • 安全

BLE设备在其中扮演四个主要的GAP角色:

  • 中央:发现BLE外围设备和广播者的设备,具有连接到外围设备的能力。
  • 外围设备:一种能够通过存在于中央的连接来通告其存在的设备。
  • 广播者:一种在不进行任何连接的情况下发送广告包的设备。
  • 观察者:发现外围设备和广播者的设备,但是不能接受来自中央的连接。

外围设备或广播公司始终在接受连接之前先做广告。实际上,广告包是允许中央或扫描仪发现外围设备或广播者的唯一方法。

处于连接模式与广告发现模式的两个BLE设备之间的区别在于,连接模式允许两个连接的设备之间进行双向数据传输。另一方面,广告设备(外围设备或广播设备)在该状态下不能从观察者/中央设备接收任何数据。

广告渠道

在广告状态下,设备会发送包含有用数据的数据包,以供其他人接收和处理。

数据包以定义为“广告间隔”的固定间隔发送。BLE中有40个RF通道,每个RF通道之间相距2 MHz(中心到中心),如下图所示。

BLE中的广告渠道

这些通道中的三个称为主要广告通道(标记为37、38和39),其余的37个通道称为次要广告 通道(它们也是在连接期间用于数据传输的通道)。

辅助广告频道用作“辅助”频道,这意味着设备必须先在主要广告频道上进行广告,然后才能在辅助频道上发送广告包。

如果设备想要利用辅助广告信道,则其在指向辅助广告分组的主要信道上发送广告分组。我们将在后面的部分中详细讨论它的工作原理。

广告包格式

让我们看一下广告包的格式:

android12 蓝牙可见性 蓝牙对外可见_数据_02

来源:蓝牙核心规范文档

PDU字段是我们感兴趣的字段。该字段根据传输的数据包类型(数据与广告)而变化。即使图中的顶部图是针对未编码PHY的,但PDU对于编码PHY的情况仍然是相同的( 

让我们定义PDU中的每个字段:

PDU头

PDU类型:此字段的长度为4位,并具有以下可能的值:

android12 蓝牙可见性 蓝牙对外可见_android12 蓝牙可见性_03

来源:蓝牙核心规范文档

PDU根据目的分为多个类别。

在列出每个PDU之前,让我们介绍一些常用术语:

  • 定向与无定向:定向广告类型接受来自已知对等设备的连接请求,而无定向则接受来自任何对等设备的连接请求。
  • 可连接与不可连接:确定广告设备是否允许建立连接。
  • 可扫描与不可扫描:确定广告设备是否能够处理来自观察者或中心的扫描请求消息。扫描请求和响应用于允许设备播发超出一个广告包容量的数据。
  • 扩展广告:扩展广告是一种比传统广告所允许的广告更多(卸载)数据的方法。卸载是通过首先在主频道上发布广告来实现的,该广告指向辅助频道上的辅助数据包。
    注意: 由于 蓝牙5设备将无法发现扩展的广告,因此,建议广告商还使用带有旧广告PDU的广告集,以使较旧的扫描设备能够发现终端设备。广告集用于同时发送不同类型的广告事件。每个广告集将具有不同的广告参数,例如广告PDU类型,广告间隔和PHY。
  • 定期广告:蓝牙5扩展广告的另一个功能是定期广告。这些用于在两个未连接的设备之间的设置时间段将数据包广播到设备,这意味着一个以上的设备可以收听和收听这些周期性广告。它们由以固定间隔发送的广告组成,其中广告数据不时变化。

旧版广告PDU

这些功能可用于所有蓝牙版本-还可以与旧版本向后兼容,并在主要广告 渠道上使用。

  • ADV_IND:可连接的可扫描无向广告。
  • ADV_DIRECT_IND:可连接的定向广告
  • ADV_NONCONN_IND:不可连接的不可扫描的无向广告
  • ADV_SCAN_IND:可扫描的无向广告

扩展广告PDU

这些类型是在蓝牙版本5.0中引入的。除了主要广告渠道之外,它们还为设备提供了在次要广告渠道上进行广告投放的选项。次要渠道的好处是它们可以增加广告数据的容量。

  • ADV_EXT_IND:扩展广告(用于除Connectable Scannable Undirected以外的所有广告类型)–在主要广告渠道上发送。
  • AUX_ADV_IND:扩展广告(用于除Connectable Scannable Undirected以外的所有广告类型)–在辅助广告渠道上发送。
  • AUX_SCAN_IND:用于定期广告
  • AUX_CHAIN_IND:与其他广告类型一起使用,以容纳其他广告数据(广告数据包链)

扫描PDU

这些用于利用“扫描请求”→“扫描响应”功能,该功能使设备能够广播比单个广告包所允许的更多的广告数据。

  • SCAN_REQ:用于在主要广告渠道上发送的扫描请求数据包中
  • SCAN_RSP:用于主要广告渠道上发送的扫描响应数据包
  • AUX_SCAN_REQ:用于在辅助广告渠道上发送的扫描请求数据包中
  • AUX_SCAN_RSP:用于在辅助 广告渠道上发送的扫描响应数据包中

启动PDU

这些用于在外围设备和中央设备之间建立连接。

  • CONNECT_IND:这是在主要广告渠道之一上发送的连接请求数据包
  • AUX_CONNECT_REQ:这是在辅助广告渠道之一上发送的连接请求数据包
  • AUX_CONNECT_RSP:这是外围设备在辅助广告渠道之一上发送的连接响应数据包

RFU:保留以备将来使用

ChSel:如果广告商支持LE Channel Selection Algorithm#2功能(请参阅Bluetooth Core Specification第6卷,B部分,第4.5.8.3节),则该位将设置为1

TxAdd:如果广告客户的地址是随机的,则此位设置为1;如果地址为公共地址,则此位设置为0

RxAdd:如果目标设备的地址是随机的,则此位设置为1;如果目标地址是公共的,则此位设置为0

长度:保存数据包有效载荷的长度。

PDU有效负载

广告包有效载荷的内容及其最大大小取决于所使用的PDU类型。广告数据包括广告商想要中继到观察者/中央设备的信息。

在这里,我们对包含广告数据的PDU类型最感兴趣。这些PDU是:

  • 传统广告的PDU包括:ADV_INDADV_NONCONN_INDADV_SCAN_IND
  • 扩展广告的PDU包括:ADV_EXT_INDAUX_ADV_INDAUX_SYNC_INDAUX_CHAIN_IND