BLE广告和信标 (原文)
BLE广告是蓝牙低功耗最重要的方面之一。 了解如何正确使用广告可以帮助你降低功耗,加快连接速度,提高可靠性。 我们将要了解他们的工作原理以及如何使用它们。
蓝牙智能(Bluetooth Smart)有两种通信方式。 第一种通信方式是使用广告,其中BLE外围设备向其周围的每个设备广播数据包。 然后,接收设备可以对该信息进行操作或连接以接收更多信息。 第二种通信方式是使用连接来接收数据包,外围和中心都发送数据包。 我们将重点放在广告上,原因有几个:
你不能在不使用广告的情况下在两个设备之间创建连接。 定义广告包的数据和格式通常是开发BLE设备时首先要做的工作。
大量的BLE产品大部分时间都会睡觉,醒来时也只需要在需要时进行广告和连接。 这意味着广告对功耗有很大的影响。
用户需要有响应性的产品,广告间隔在快速连接中至关重要。
广告是有意设计为单向的。 中央设备无法在没有连接的情况下将任何数据发送到外围设备。 但是单个外设可以向该区域的多个主设备发送广告。
BLE物理层
在我们进入广告包发送之前,我们想谈谈一下BLE物理层。 物理层负责在空中实际发送信号。 这包括实际的射频收发器。
蓝牙低功耗与经典蓝牙具有一些相似之处。 两者都使用2.4GHz频谱。 基本速率(BR)和BLE均采用1Mbps的GFSK调制,但其调制指数不同。 增强数据速率(EDR)使用与GFSK完全不同的调制。 经典蓝牙与LE的40个频道相比有79个频道。 通道间隔也不同。 这两个差异使LE和经典蓝牙不同,不兼容,所以他们无法沟通。 双模式射频,像CC256x,通过切换其调制参数和运行频道来支持LE和经典蓝牙。
用于蓝牙的2.4GHz频谱从2402MHz延伸到2480MHz。 LE使用40个1MHz宽的信道,编号为0到39,每个信道分开2MHz。
频道37,38和39仅用于发送广告包。 其余的用于连接期间的数据交换。 我们对这3个频道的情况感兴趣,这就是我们在这里介绍的内容。
在BLE广告期间,BLE外围设备一个接一个地在3个广告信道上发送数据包。 扫描设备或信标的中央设备将收听这些频道的广告数据包,这有助于其发现附近的设备。
频道37,38和39有目的地分布在2.4GHz频谱上。 频道37和频道39是频带中的第一个和最后一个频道,而频道38在中间。 如果任何一个广告频道被阻止,其他频道可能是空闲的,因为它们分开了相当多的带宽。
这是特别真实的,因为干扰BLE的大多数其他设备是窄带。 频道38特别放在Wi-Fi频道1和6之间,所以它避开了Wi-Fi信号。 广告频道的宽间距有助于BLE更好地管理来自Wi-Fi,经典蓝牙,微波炉,婴儿监视器等的干扰,以确保广告成功。
BLE广告间隔(Advertisement Interval)
当BLE外围设备处于广告模式时,在每个广告频道上周期性地发送广告包。 分组之间的时间间隔具有固定间隔和随机延迟。
你可以将固定间隔设置为从20ms到10.24秒,步长为0.625ms。 随机延迟是自动添加的从1ms到10ms的伪随机值。 这种随机性有助于减少不同设备的广告之间的碰撞的可能性。 我们提到过广告对于发现设备至关重要,所以不惜一切代价避免冲突是非常重要的。 这是蓝牙智能(Bluetooth Smart)使用的另一种方式来提高稳健性。
你可能会想,我只想在一个或两个频道上做广告,而不是全部三个来节省电量。 由于干扰的影响,大多数公司都对这种做法感到沮丧。 如果你选择的频道被阻止,你的设备将无法正常工作。 例如,苹果建议在所有3个频道上都进行广告,其他制造商也同样如此。
广告间隔与连接间隔是分开独立的。 因此,即便你的设备形成连接的速度较慢,连接建立后也不会阻止你快速发送数据。
BLE广告包
蓝牙规范在蓝牙LE中定义了两个数据单元的顶级数据包。 分组本身具有包括前同步码和接入地址以及CRC的若干部分。
用于广告信道的分组数据单元(称为广告信道PDU)包括2字节报头和6到37字节的可变有效载荷。 有效载荷的实际长度由广告信道PDU的报头中的6位长度字段来定义。
请注意,广告有几种PDU类型,但我们将主要关注ADV_IND和ADV_NONCONN_IND 。 ADV_IND是一个通用的广告,通常是最常见的。 这是通用的,因为它没有被定向(not directed),并且它是可连接的(connectable),这意味着中央设备可以连接到正在发送此广告的外围设备,并且不指向特定的中央设备。
当外围设备发送ADV_IND广告时,它正在帮助诸如智能手机的中央设备找到它。 一旦找到,中央设备就可以开始连接过程。
ADV_NONCONN_IND是当外设不想接受连接时所使用的广告类型,这在信标(Beacons)中是典型的。
正确的广告方式取决于你的应用,无论你要形成快速连接还是完全避免连接。
广告信道PDU
广告信道PDU本身具有取决于广告PDU类型的有效载荷。 上图显示了ADV_IND有效载荷。 该有效载荷具有6字节的广告地址和可变数量的广告数据结构。
在考虑广告地址后(通常将其称为蓝牙MAC地址,尽管可能会随意更改),实际的广告数据结构仅有37 - 6 = 31字节。 这还必须包括长度,类型和数据本身。
我们浏览了几个层次,你可以看到BLE封装了大量数据。 这为你提供了很多灵活性来支持最适合你产品的不同行为。
在最低级别,广告有31个字节可以广告任何数量的不同的东西。 你可以在蓝牙Sig网站上查看广告数据类型的完整列表 ,每种数据类型都指定了有效载荷中不同的数据标准。
一些最常用的广告数据类型是:
- 0x06 128位服务的不完整列表 :外设提供的服务的 UUID可以128位格式发布。
- 0x02 16位服务类UUID不完整列表
- 0x08 缩短本地名称
- 0x09 完成本地 名称
由于广告数据结构的数量是可变的,你可以根据需要进行组合。
建立广告最重要的部分是获取正确的信息到中央设备(智能手机或独立的中央设备),这通常取决于对你的产品什么最重要。 如果你的产品提供独特的服务,你可以广告这些服务,以便智能手机可以区分你的产品和附近的其他产品。 例如,Beacons具有诸如独特的UUID,功率级别和其他对于查找和使用Beacons很重要的特性的定制数据。
蓝牙SIG还具有制造商特定的0xFF数据类型,因此你可以灵活地定义自己的自定义有效负载。 苹果公司为iBeacons做了这一工作,它将标准的广告数据类型与制造商特定的一起组合。
定义自己的广告给你很大的力量,但是需要由你自己找到最好的方法来达到你想要的地方。
广告蓝牙服务
虽然每个应用程序都是不同的,但外设广告其提供的最重要或最独特的服务是连接到它的最简单方式,在许多产品中都是有意义的。当iPhone或Android正在寻找设备时,它可以使用定制服务UUID来查找要与其通话的确切设备并过滤掉其他设备。 搜索特定地址是不太可能的,但是找到具有唯一ID的设备更容易。
例如,假设你的产品是小型光传感器。 你可以使用唯一的128位UUID创建自定义服务。 然后,通过将UUID包括在广告包中,iPhone可以忽略除了你的产品之外的所有其他设备。 这样可以快速找到设备,因为你无需连接到每个设备来发现其功能。
这在节电方面也很好。 新一代的智能手机正在越来越多的在低水平上决策和过滤。 他们这样做是因为能够更高效地丢弃没有用的广告包,而不是通知操作系统和用户稍后再丢弃。 但手机需要有关哪些应用程序必须提供过滤哪些的信息,这取决于服务或设备地址的唯一UUID。
快速介绍UUID
一旦你开始使用BLE设备,你将很快意识到UUID至关重要。 服务,特征和其他项目都使用UUID来唯一标识它们。
UUID只不过是唯一的128位(16字节)数字:
75BEB663-74FC-4871-9737-AD184157450E
通常以4-2-2-2-6格式排列UUID。 每对字符表示一个十六进制数字。 所以75以上是实际的0x75。
为避免不断传输可能浪费的16个字节(蓝牙数据量非常有限,16个字节很大),蓝牙SIG采用了标准的UUID基础。 该基础形成128位UUID的前96位(12字节)。 其余的位由蓝牙SIG定义:
XXXXXXXX-0000-1000-8000-00805F9B34FB
最高的32位由你决定。 对于16位UUID,底部16位保持为0。例如,心率服务的简单16位UUID是:
0x180D
实际上这代表一个128位的UUID:
0000 180D -0000-1000-8000-00805F9B34FB
如果你使用Bluetooth SIG指定的现有服务或配置文件,则可以避免使用完整的128位UUID。 但是,定制服务需要一个完全定义的128位UUID。
创建UUID
UUID唯一重要的是它们是独一无二的。
你可以以各种方式随机生成它们。 一个可以生成它们的网站是在线UUID生成器 。 在Mac OS X中,你可以使用命令行中的uuidgen实用程序来执行相同的操作。
由于位数,你不太可能像其他任何人一样生成一样的UUID。 最重要的是你可以避免在自定义的UUID中使用蓝牙SIG的UUID基础。
优化BLE广告的功耗和延迟
最重要的事情之一是功耗和延迟之间的大的折中。 每个广告都消耗电力。 BLE射频必须通电并传输。 较少的广告,系统用一组电池能运行的时间越长。 那么将广告间隔设置为10秒是个好主意吗?
那么我们假设用户想连接到外设。 你能等10秒吗? 长时间间隔对于用户来说可能非常令人沮丧,尤其是在环境干扰和数据包丢失的情况下。 所以,使间隔太大对于用户体验是不利的。 在中间的某个地方,大约500ms到1秒是大多数产品的最佳选择。 在我们开发的一些应用程序中,我们已经增加了延时,但只有经过仔细考虑之后才做的决定。 某些系统在循环中没有用户,因此更容易做到。
当你构建广告数据包时,你还需要考虑更多字节意味着更高的功耗。 广告包中的每个字节都迫使射频收发器停留在更长的时间内传输,从而使用更多的能量。 在某些情况下,将广告中的字节数减少到最低限度可以帮助挤压硬币电池的所有内容。
BLE广告和智能手机
蓝牙智能(Bluetooth Smart)设计允许外设功耗极低。 这部分是通过在智能手机上放置大量的负担,假设智能手机具有较大的电池并且容易充电。 但是,在实际产品中,你希望避免在智能手机上造成显着的电池消耗。 如果启用蓝牙会更快地耗尽电池,一些用户最终将无奈地停用蓝牙。 对于大多数要为用户提供快速体验的产品而言,这是一个问题。
智能手机使用的大部分功耗来自扫描广告。 因此,Android和iOS极大地限制了扫描,特别是后台扫描。
当你的应用程序处于前台时,你基本上可以完全控制BLE,并且你具有高优先级。 这是有道理的,因为苹果和谷歌知道你想要快速向用户显示数据,所以没有必要拖延它。
一旦你的应用程序处于后台,寻找附近的设备(如果你的应用程序支持它),则操作系统通常会降低优先级。 这是通过几种方式完成的:
扫描间隔增加,因此发现广告的外围设备需要更长的时间。 如果在前台扫描中没有BLE应用程序,这一点尤其如此。
操作系统将生成较少的广告发现事件,例如同一设备的多个发现。
Android和iOS各自单独处理这个问题,因此了解在后台运行的效果对你的设备和连接很重要。
扫描响应
我们已经提到广告包有31个可供你使用的数据字节。 这不是很多,特别是当你考虑到128位UUID需要16字节时。 如果要包含更多信息,你唯一的选择是响应扫描响应。
当智能手机扫描广告时,它也可以从广告设备请求更多的信息而不形成连接。 这是通过扫描请求完成的,扫描请求是发送到外设的特殊数据包。 BLE外设接收扫描请求并以扫描响应进行响应。
扫描响应分组具有与广告相同的分组格式,除了较高层上的类型,表示它是扫描响应而不是广告。 因此,你的扫描响应可以提供你在广告数据包中没有提及的设备名称或其他服务。
扫描响应有一个已知问题。 如果在外围设备中启用扫描响应,则在发送广告以能够接收扫描请求包之后,设备必须将射频保持在RX模式。 即使没有实际发送的设备,仍然必须这样做(因为外设不知道谁真正在那里)。 这意味着更多的能源消耗。 对于非常低功耗的应用,如果不是绝对需要,请考虑禁用扫描响应。
BLE信标和iBeacons
如果不讨论Beacons,特别是Apple的iBeacon标准,则关于BLE广告的讨论将是不完整的。
信标(Beacons)是BLE外设,专门使用广告,但不允许连接。 不允许连接的原因是,如果信标要建立连接,广告将不得不停止,所以没有其他设备可以找到信标。 发送的数据包格式有所不同。 而苹果的iBeacon使用了非常特定的格式的有效载荷。
你可以看到iBeacon数据包的格式。 这些数据包使用基本的BLE格式和一些特定的字段。 我们一个接一个地来看看它们。
广告包包含蓝牙MAC地址和有效载荷。 有效载荷由两个AD结构组成,第一个使用Flags数据类型给出通用信息,第二个是Apple特定的iBeacon信息。
标志广告数据类型
该数据包的数据类型为0x01,表示各种标志。 长度为2,因为有两个字节,数据类型和实际标志值。 标志值有几位表示iBeacon的功能:
- Bit0 - 表示LE有限的可发现模式(LE Limited Discoverable Mode)
- Bit1 - 表示LE一般可发现模式(LE General Discoverable Mode)
- Bit2 - 指示是否支持BR/EDR。 如果你的iBeacon是双模式设备,则使用此功能
- Bit3 - 指示LE和BR/EDR控制器是否同时运行
- Bit4 - 指示LE和BR/EDR主机是否同时运行
大多数iBeacons是单模设备,BR/EDR不被使用。 对于iBeacons,使用通用可发现模式。
iBeacon数据类型
最重要的广告数据类型是第二个。 第一个字节表示字节数,总共26字节为0x1A,有效载荷为25字节,类型为1字节。 AD类型是制造商特定的0xFF,所以苹果已经定义了自己的广告数据。
前两个字节表示公司标识符0x4C00。 你也可以看到其他公司的标识符 。
第二个两字节是信标广告标志。 这些总是0x02和0x15。
关键字段是iBeacon Proximity UUID,它独特地标识了iBeacon,后面是主要和次要(major and minor)字段。
每个iBeacon都必须拥有唯一的UUID,以便iPhone应用程序可以准确了解相对于一个或多个iBeacons的位置。
最后,还有一个校准的TX功率(calibrated TX power)的2的补码,可用于提高信标的位置精度(已经知道功率电平)。
没有什么阻止你用不同的制造商格式创建自己的信标。 问题是苹果专门检测具有特定格式的iBeacons,所以不会有任何互操作性。
结论
我们已经介绍了一些最受欢迎的BLE和蓝牙设备,其规格以及做出决定时要牢记的一些关键方面。
和往常一样,在创建BLE产品时,会有许多细节和问题发挥作用。 我们致力于帮助你完成正确的操作,请随时与我们联系讨论。
参考
[1]蓝牙特别兴趣小组 蓝牙v4.2规格。
[2] Apple Inc. iBeacon for Developers 。