创客孙老师
创客孙老师
发布于 2024-05-13 / 97 阅读
0
0

低功耗蓝牙(BLE)广播入门

概述

BLE广播(Advertising有的也叫广播,我比较习惯叫它广播)是低功耗蓝牙技术中重要一个方面。正确使用广播可有效的降低功耗、加快连接速度并提高可靠性。BLE广播也是蓝牙信标的关键技术,信标在定位和跟踪方面的应用也非常广泛。下面会详细介绍下低功耗蓝牙和信标的工作原理和使用方法。

蓝牙低功耗有两种通信方式,一种是广播,即 BLE 外围设备向周围的所有设备广播数据包,接收设备可以根据收到的信息采取行动或接收更多数据,这也是信标的基本功能,它们只发送数据包。第二种通信方式是建立连接后接收数据包,即外围设备和中心设备都发送数据包。

关注广播有几个方面的原因:

  • 如果不使用广播,就无法在两个设备之间建立连接。在进行 BLE 开发时,首先要定义广播数据包的数据和格式。
  • 低功耗蓝牙设备大部分时间都处于睡眠状态,只有在需要时才会醒来发布广播并进行连接。这意味着广播对功耗有很大影响。
  • 用户需要反应灵敏的产品,而广播间隔对于快速连接至关重要。
  • 广播是 iBeacon、EddyStone 和其他信标的核心,因此它们一直都在使用
  • 广播在设计上是单向的。如果没有连接,中心设备就无法向外围设备发送任何数据。但单个外围设备可以向区域内的多个主设备发送广播。

BLE物理层

为了更好的理解BLE广播的机制,我们需要简单了解下 BLE 物理层。物理层负责实际发送无线电信射频信号。

低功耗蓝牙跟传统蓝牙一样也使用 2.4GHz 频谱。基本速率(BR)和 BLE 都使用 1Mbps 的 GFSK 调制,但它们的调制指数不同。增强数据速率 (EDR) 使用与 GFSK 完全不同的调制方式。经典蓝牙有 79 个信道,而 LE 只有 40 个信道。信道间距也不同。这两种差异使得 LE 和经典蓝牙不同且不兼容,因此它们无法通信。双模无线电(如德州仪器的 CC256x 或 Corvo)可通过切换调制参数和运行频道来支持 LE 和 Classic。

低功耗蓝牙经典BR经典EDR
调制方式GFSK 0.45 to 0.55, 0.5 (Stable Modulation)GFSK 0.28 to 0.35DQPSK / 8DSPK
速率1Mbps, 2Mbps (Bluetooth 5.0)1Mbps2Mbps, 3Mbps
通道407979
带宽2MHz1MHz1MHz

图片
蓝牙的 2.4GHz 频谱从 2402MHz 到 2480MHz。LE 使用 40 个 1MHz 宽的信道,从 0 到 39,每个信道之间相隔 2MHz。

信道 37、38 和 39 仅用于发送广播数据包。其余用于连接期间的数据交换。我们感兴趣的是这 3 个信道中发生的事情,这也是我们要介绍的内容。值得注意的是,在最新的蓝牙规范中,广播扩展也允许使用其他信道发送广播,但我们将首先关注主要的 3 个信道。

在 BLE 广播期间,BLE 外围设备会在 3 个广播信道上一个接一个地传输相同的数据包。扫描设备或信标的中心设备会监听这些信道上的广播数据包,这有助于它发现附近的设备。

信道 37、38 和 39(如上图橙色所示)是特意分布在 2.4GHz 频谱上的。37 和 39 是该频段的第一个和最后一个频道,而 38 在中间。如果任何一个广播信道被屏蔽,其他信道很可能是空闲的,因为它们之间相隔着几兆赫的带宽。

由于干扰 BLE 的大多数其他设备都是窄带设备,这一点尤为正确。特别是信道 38,它位于 Wi-Fi 信道 1 和 6 之间,可以避开 Wi-Fi 信号。广播信道的宽间距有助于 BLE 更好地管理来自 Wi-Fi、经典蓝牙、微波、婴儿监视器等设备的干扰,确保广播成功发布。

BLE广播间隔

当 BLE 外围设备处于广播模式时,会在每个广播信道上定期发送广播数据包。数据包之间的时间间隔既有固定间隔,也有随机延迟。时间间隔在 3 个数据包之间指定(几乎总是使用 3 个信道)。

你可以设置 20 毫秒至 10.24 秒的固定间隔,步长为 0.625 毫秒。随机延迟是自动添加的 0ms 至 10ms 的伪随机值。这种随机性有助于减少不同设备的广播之间发生碰撞的可能性(如果它们以相同的速率下降,就会更容易发生干扰)。我们提到,找到广播至关重要,因此不惜一切代价避免碰撞极为重要。这只是 BLE 用来提高鲁棒性的另一种方法。

你可能会想,为了省电,你应该只在一个或两个信道上做广播,而不是在所有三个信道上,因为传输的每个数据包都有特定的成本,可能会显著增加平均电流。由于干扰的影响,大多数公司都不赞成这种做法。如果你选择的频道被屏蔽,你的设备就无法工作。例如,苹果公司和其他制造商一样,建议在所有 3 个频道上做广播。

还有一点要记住,我们所说的广播间隔与连接间隔是分开的。因此,你的设备在建立连接时速度较慢,但这并不妨碍你在建立连接后快速发送数据。

尽管广播间隔的范围很广,但大多数产品都将以下内容作为指导原则:

  • 小于 100ms - 用于非常激进的连接,通常为短时连接
  • 100ms 至 500ms - 对大多数设备而言是正常的快速广播
  • 1000ms 至 2000ms - 用于连接网关的设备,延迟并不重要

上述范围是应该考虑的一般准则,同时还要考虑到苹果和安卓的建议。例如,有案例使用 20 毫秒到 50 毫秒建立了非常快的连接,因为中央设备的连接时间不到一秒。请记住,连接需要一些广播,尤其是可能还需要扫描响应。有些数据包可能会丢失。因此,在这种情况下,你可能会谨慎行事,尤其是因为连接时间有限。

如果传感器连接到网关以提供数据,但需要很低的功率,那么 1 秒甚至长达 2 秒的广播速度可能会很有用,这可以确保传感器不会浪费大量时间。此外,如果广播数据包提供的数据变化不大,就没有必要频繁传输。请务必认识到,连接可能需要数倍于广播间隔的时间。

大多数设备实际上创建了一个更复杂的广播系统,使用快速和慢速广播机制。由于用户与设备进行了交互,因此设备启动或被告知以较快的速度开始播放广播。这样做的时间有限,以便在用户期待快速连接时提供快速响应。

经过一段预先确定的时间后,当没有发生连接时,设备就会切换到慢速广播模式,允许应用程序连接,但限制了功耗,因为用户可能需要一些时间才能连接。

用户已连接时的广播速率取决于是否要使用定向广播和用户需求。但由于设备可能会在相当长的时间内保持未连接状态,因此必须限制广播速率以节省电量。

BLE广播包

蓝牙规范定义了蓝牙 LE 中包含两个数据单元的顶级数据包。数据包本身由几个部分组成,包括前导句和访问地址以及 CRC。

广播信道的数据包单元(称为广播信道 PDU)包括一个 2 字节的报头和一个 6 至 37 字节的可变有效载荷。有效载荷的实际长度由广播信道 PDU 头中的 6 位长度字段定义。

值得注意的是,广播有多种 PDU 类型,但在此我们将主要关注 ADV_IND 和 ADV_NONCONN_IND。

ADV_IND 是一种通用广播,通常也是最常见的广播。它的通用性在于它没有指向性和可连接性,这意味着中心设备可以连接到发出广播的外围设备,而且它不指向特定的中心设备。

外围设备发送 ADV_IND 广播时,是在帮助智能手机等中心设备找到它。一旦找到,中心设备就可以开始连接过程。

ADV_NONCONN_IND 是外围设备不想接受连接时使用的广播类型,这在信标中很常见。

使用哪种广播类型取决于你的应用,是想快速建立连接还是完全避免连接。

广播通道PDU

广播信道 PDU 本身的有效载荷取决于广播 PDU 类型。上图显示的是 ADV_IND 有效载荷。该有效载荷有一个 6 字节的广播地址和一个数量可变的广播数据结构。

考虑到广播地址(通常称为蓝牙 MAC 地址,但也可随意更改),我们还剩下 37 - 6 = 31 个字节的实际广播数据结构。这必须符合长度、类型和数据本身的要求。

我们浏览了几个层,你可以看到 BLE 越往深处封装了大量数据。这为你支持最适合你产品的不同行为提供了很大的灵活性。

在最底层,广播有 31 个字节,可以发布各种不同的广播。你可以在 Bluetooth Sig 网站上查看广播数据类型的完整列表,每种数据类型都规定了有效载荷中不同的数据标准。

最常用的广播数据类型有:

  • 0x06 128 位服务的不完整列表:外设提供的服务UUID 可以 128 位格式发布。
  • 0x02 16 位服务类别 UUID 的不完整列表
  • 0x08 简短本地名称和 0x09 完整本地名称
    由于广播数据结构的数量是可变的,因此可以根据需要进行组合。

进行广播最重要的部分是向中心设备(智能手机或独立中心设备)发送正确的信息,这通常取决于什么对你的产品最重要。如果你的产品能提供独特的服务,你可以对这些服务进行宣传,这样智能手机就能将你的产品与附近的其他产品区分开来。例如,信标有独特的 UUID、功率水平和其他特征等自定义数据,这些数据对于寻找和使用信标非常重要。

蓝牙技术联盟(Bluetooth SIG)也有针对特定制造商的 0xFF 数据类型,你可以灵活定义自己的自定义有效载荷。 苹果公司的 iBeacons 就是这样做的,它结合了标准的广播数据类型和制造商特定的数据类型。

定义自己的广播给了你很大的权力,但这取决于你能否找到达到目的的最佳方法。

蓝牙5.0-广播扩展

虽然牙 5.0 的具有更远的传输距离、更高的数据吞吐量等特性,但其广播扩展特性将更助于提供更好的体验。BLE 广播允许将数据包串联起来,并使用以前不携带广播数据的其他 37 个信道,而不是只在 3 个广播信道上发送广播数据。这对于在干扰较多的情况下获取广播数据很有帮助。

蓝牙 5.0 还能让广播数据包容纳多达 255 字节的数据,这比蓝牙 4.0 到蓝牙 4.2 中的 37 个数据包大得多。这使得无需连接即可获取数据成为可能,从而节省了功耗,并允许许多设备获取数据。这些功能要求两台设备都兼容蓝牙 5.0

广播蓝牙服务


虽然每个应用都不尽相同,但外设提供的最重要或独特的服务广播是最简单的连接方式,这对很多产品都是非常有意义的。当 iPhone 或 Android 寻找设备时,它可以使用自定义服务 UUID 找到它想交谈的设备,并过滤掉其他设备,因为搜索特定的地址几乎是不可能的,但寻找具有唯一 ID 的设备则比较容易。

例如,假设你的产品是一个小型光传感器。你可以创建一个具有唯一 128 位 UUID 的自定义服务。这样,通过在广播包中加入 UUID,iPhone 就可以忽略附近除你的产品之外的所有其他设备。这样,查找设备的速度就会更快,因为不必连接到每台设备去发现该功能。

这在省电方面也有好处。新一代智能手机越来越多地在底层进行决策和过滤。之所以这样做,是因为如果不使用广播数据包,尽早丢弃它比通知操作系统和用户之后再丢弃它更省电。但是,手机需要掌握应用程序必须提供的过滤信息,而这取决于服务或设备地址的唯一 UUID。

快速了解 UUID

一旦开始使用 BLE 设备,你很快就会意识到 UUID 的重要性。服务、特征和其他项目都使用 UUID 进行唯一标识。

UUID 不过是唯一的 128 位(16 字节)数字:

75BEB663-74FC-4871-9737-AD184157450E

UUID 通常按上述 4-2-2-2-6 格式排列。每对字符实际上表示一个十六进制数。因此,上面的 75 实际上是 0x75。

为了避免不断传输 16 个字节造成浪费(蓝牙的数据量非常有限,16 个字节非常重要),蓝牙技术联盟(Bluetooth SIG)采用了标准的 UUID 基数。该基数构成 128 位 UUID 的前 96 位(12 字节)。其余位由蓝牙技术联盟定义:

XXXXXXXX-0000-1000-8000-00805F9B34FB

最前面的“XXXXXXXX” 32 位由你决定。对于 16 位 UUID,最前面的 16 位仍为 0。例如,心率服务的 16 位 UUID 简写格式为

0x180D

实际上,这代表 128 位 UUID:

0000180D-0000-1000-8000-00805F9B34FB

如果你使用的是蓝牙技术联盟(Bluetooth SIG)指定的现有服务或配置文件,则可以避免使用完整的 128 位 UUID。但是,自定义服务需要完全定义的 128 位 UUID。

创建UUID

UUID 最重要的一点是它们是唯一的。

你可以通过各种方式随机生成它们。一个可以生成 UUID 的网站是 Online UUID Generator。在 Mac OS X 中,你也可以使用命令行中的 uuidgen 工具来做同样的事情。

由于位数较多,你不可能生成与其他人相似的 UUID。最重要的是,在自定义 UUID 时要避免使用蓝牙技术联盟的基数。

优化 BLE 广播的功率和延迟

优化最关键的一点是要认识到功耗和延迟之间的巨大权衡。每个广播都会消耗功率。BLE 无线电必须启动和发射。广播越少,系统使用一组电池的时间就越长。那么将广播间隔设置为 10 秒是否是个好主意?

假设用户想要连接到外设。你能等 10 秒吗?过长的间隔会让用户非常沮丧,尤其是在环境有干扰和数据包丢失的情况下。因此,间隔时间过长不利于用户体验。对于大多数产品来说,500 毫秒到 1 秒左右的中间间隔是个不错的选择。在我们开发的一些应用程序中,我们增加了间隔时间,但这是经过深思熟虑的。有些系统没有用户参与,因此更容易做到这一点。

在构建广播包时,还需要考虑到更多字节意味着更高的功耗。广播数据包中的每个字节都会迫使无线电保持更长的传输时间,从而消耗更多的能量。在某些情况下,将广播中的字节数减少到最低限度有助于从纽扣电池中榨取更多电能。

BLE 广播和智能手机

蓝牙 LE 的设计目的是让外围设备实现超低功耗。它的部分原理是将大部分负担放在智能手机上,假设智能手机的电池容量较大,需要经常充电。而在实际产品中,你需要避免造成智能手机电池大量耗电。启用蓝牙会更快地耗尽电池,一些用户最终会沮丧地禁用蓝牙或你的应用程序。对于大多数希望为用户提供快速体验的产品来说,这是个问题。

智能手机使用的大部分电量来自扫描广播。 正因为如此,Android 和 iOS 大幅限制了扫描,尤其是后台扫描。

当你的应用程序处于前台时,你基本上可以完全控制 BLE,并拥有较高的优先级。这是有道理的,因为苹果和谷歌知道你希望快速向用户显示数据,所以没有必要拖延。

一旦你的应用程序进入后台,寻找附近的设备(如果你的应用程序支持),操作系统通常会降低优先级。有几种方法可以做到这一点:

  • 扫描间隔增加,因此需要更长的时间才能发现正在做广播的外围设备。例如,如果前台没有 BLE 应用程序在扫描,情况尤其如此。
  • 操作系统将产生更少的广播发现事件,如多次发现同一设备。
    Android 和 iOS 会分别处理这种情况,因此了解后台运行对设备和连接的影响非常重要。

扫描响应

我们已经提到,广播数据包有 31 个数据字节可供使用。这并不多,尤其是考虑到 128 位 UUID 需要 16 个字节。如果你想包含更多信息,唯一的选择就是回应扫描响应。

智能手机在扫描广播时,也可以在不建立连接的情况下请求广播设备提供更多信息。这是通过扫描请求完成的,扫描请求是发送给外设的一个特殊数据包。BLE 外围设备收到扫描请求后会做出扫描响应。

扫描时,iOS、Android 和其他系统都会自动发出扫描请求,无需用户干预。因此,如果你的设备已启用该功能,就会收到这些请求。

扫描响应数据包与广播数据包格式相同,但上层类型不同,表明这是扫描响应而不是广播。因此,扫描响应可以提供设备名称或广播数据包中未提及的其他服务。

BLE 信标和 iBeacons

信标

如果不讨论信标,特别是苹果公司的 iBeacon 标准,那么对 BLE 广播的讨论就是不完整的。

信标是专门使用广播的 BLE 外围设备,不允许连接。不允许连接的原因是,如果信标建立了连接,广播就必须停止,这样其他设备就无法找到信标。发送的数据包格式各不相同,苹果的 iBeacon 对有效载荷使用了一种非常特殊的格式。
数据包
你可以看到 iBeacon 数据包的格式。这些数据包使用基本的 BLE 格式,并带有一些特定字段。让我们逐一查看。

广播数据包包含蓝牙 MAC 地址和有效载荷。有效载荷由两个 AD 结构组成,第一个结构使用 Flags 数据类型提供通用信息,第二个结构则提供苹果特有的 iBeacon 信息。

广播标志数据类型

该数据包的数据类型为 0x01,表示各种标志。长度为 2,因为有两个字节,即数据类型和实际标志值。标志值有几个位,表示 iBeacon 的功能:

  • 位 0 - 表示 LE 有限可探测模式
  • 位 1 - 表示 LE 一般可发现模式
  • 位 2 - 表示是否支持 BR/EDR。如果你的 iBeacon 是双模式设备,则使用该位
  • 第 3 位 - 指示 LE 和 BR/EDR 控制器是否同时运行
  • 第 4 位 - 指示 LE 和 BR/EDR 主机是否同时运行
    大多数 iBeacons 都是单模式设备,不使用 BR/EDR。对于 iBeacons,使用一般可发现模式。

iBeacon数据类型

最重要的广播数据类型是第二个字节。第一个字节表示字节数,0x1A,共 26 个字节,其中 25 个字节为有效载荷,1 个字节为类型。AD 类型是制造商专用的 0xFF,因此苹果公司定义了自己的广播数据。

前两个字节表示公司标识符 0x4C00。你还可以看到其他公司的标识符。

后两个字节是信标广播指示符。它们总是 0x02 和 0x15。

关键字段是唯一标识 iBeacon 的 iBeacon 邻近 UUID,其后是主要字段和次要字段。

每个 iBeacon 都必须有一个唯一的 UUID,这样 iPhone 应用程序才能准确知道自己相对于一个或多个 iBeacon 的位置。

最后,还有一个校准发射功率的 2 的补码,可以用来提高定位精度,了解信标的功率水平。

没有什么能阻止你用不同的制造商格式创建自己的信标。问题是,苹果会专门检测具有特定格式的 iBeacons,因此不会有任何互操作性。

结论

我们介绍了一些最流行的 BLE 和蓝牙设备、它们的规格以及在做决定时需要注意的一些关键方面。

与往常一样,在创建 BLE 产品时会遇到许多细节和问题。我们将竭诚为你服务,请随时与我们联系讨论。


评论