了解不同类型的BLE Beacon

原文中的URIBeacon已被Google Eddystone替代,因此本文并非完全由原文转载,有小幅度更改。

蓝牙低功耗(BLE)信标

有几种类型(Eddystone,AltBeacon,iBeacon),每种类型都有自己的标准和优势。有些是开放和免费的,有些是封闭的,需要花钱。本文将介绍可用信标的三种主要类型,它们的优点,缺点,衍生物以及有关信标如何工作的一些低级实现细节。确保查看所有可用作BLE信标的已启用mbed的BLE平台。

概观

蓝牙低功耗(BLE)能够以两种状态之一交换数据:连接和广告模式。连接模式使用通用属性(GATT)层以一对一的方式传输数据。广告模式使用通用访问配置文件(GAP)层向正在收听的任何人广播数据。广告模式是一对多转移,无法保证数据的一致性。

BLE Beacons利用GAP广告模式以定期的,特殊格式的广告包广播数据。每种类型的信标都使用自定义规范来对广告数据进行分区,从而赋予其意义。我将看看三种现有类型的信标,URI Beacons,iBeacons和AltBeacons。mbed BLE团队页面支持所有信标类型,如果您想尝试它们,请提供包含文档的示例项目。

iBeacon

Apple的iBeacon是第一款出现的BLE Beacon技术,因此大多数信标都从iBeacon数据格式中获取灵感。iBeacons在几个Apple SDK中启用,可以从任何支持BLE的iDevice读取和广播。iBeacon是一种专有的封闭式标准。iBeacons有一个庞大的生态系统,并为开发人员提供了大量资源,但您必须成为Apple开发人员社区的一员。

数据规格

iBeacons播放了四条信息: 1. 标识信标的UUID。 2. 标识大组中信标子集的主要编号。 3. 标识特定信标的次要编号。 4. TX功率电平为2的补码,表示距设备一米的信号强度。必须由用户或制造商为每个设备校准此编号。

扫描应用程序读取UUID,主要编号和次要编号,并针对数据库引用它们以获取有关信标的信息; 信标本身不包含描述性信息 - 它要求此外部数据库有用。TX功率字段与测量的信号强度一起使用以确定信标距智能电话的距离。请注意,用户必须在信标的基础上校准TxPower才能准确。

iBeacon-Diagramredo

iBeacon前缀包含十六进制数据:0x02 01 06 1A FF 00 4C 02 15。这分解如下:

  • 0x020106将广告包定义为BLE General Discoverable和BR / EDR高速不兼容。实际上它说它只是广播,而不是连接。
  • 0x1AFF表示以下数据长度为26个字节,并且是制造商特定数据。
  • 0x004C是Apple的蓝牙Sig ID,是该规范的一部分,使其依赖于Apple。
  • 0x02是表示邻近信标的辅助ID,由所有iBeacons使用。
  • 0x15将剩余长度定义为21个字节(16 + 2 + 2 + 1)。

其余的字段相当自我解释。邻近UUID是标准的16byte / 128bit BLE UUID,通常是公司独有的。主要和次要数字用于表示UUID内的资产; 常见用途是主要数字是商店(因此可能有65,536个商店),其中次要数字是商店内的单个标签(每个商店还有65,536个可能的标签)。

例子

  1. 一家咖啡店在一个咖啡架和一个寄存器上放置了iBeacons。当顾客走进咖啡店足够近时,智能手机应用程序会看到iBeacon,搜索咖啡店的iBeacon数据库,将iBeacon识别为属于coffeeShop X,然后看到咖啡有效的优惠券,并通知优惠券的用户。
  2. iDevices可以广播iBeacon。这可用于在活动中自动登记并跟踪整个场地的移动。
  3. 请参阅mbed iBeacon设备页面上的嵌入式设备代码。

这是如何设置iBeacon设备以使用mbed BLE_API广播具有主要和次要号码的UUID的示例。请注意,tx功率水平应根据设备的1米测量用户校准。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "mbed.h"
#include "iBeaconService.h"
...
BLEDevice ble;
const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // 16Byte UUID
0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61
};
uint16_t majorNumber = 1122; // 2 byte major number
uint16_t minorNumber = 3344; // 2 byte minor number
uint16_t txPower = 0xC8; // 1 byte tx power level
...
int main(void){
...
iBeaconService ibeacon(ble, uuid, majorNumber, minorNumber, txPower);
....
while(1){
ble.waitForEvent();
}
}

思考

iBeacons非常酷,得到广泛支持,因为它们是Apple产品,所以每个人都在与它们合作,生态系统尽可能健壮。唯一的限制是需要数据库来为iBeacon数据赋予意义。没有数据库,UUID就毫无意义。你可以在这里找到mbed iBeacon的例子。

衍生品

一个流行的衍生产品是用不同的公司代码替换0x004C代码,例如分配给Nordic Semiconductor的0x0059。该NRF烽火台应用和nrf51822蓝牙智能灯塔套件就是这样的例子。 一些公司提供的示例未明确使用iBeacon规范。

AltBeacon

AltBeacons是Radius Networks提供的开放式免费信标设计。它似乎正在获得一些动力。AltBeacon规范似乎是对Apple正在使用的闭源iBeacon规范的直接反应; 它涵盖了与iBeacon相同的功能,但不是公司特定的。也就是说,它尚未获得广泛支持。

值得注意的是,虽然iBeacons有20个27字节可用于用户数据(UUID + Major + Minor),但AltBeacons有28个28字节可用(MFG ID,BeaconCode,BeaconID,MFG RSVD)。这意味着每条消息可以传送更多数据。

数据规格

所述AltBeacon规格是28bytes(26B是用户可修改的)。AltBeacon的前两个字节不是用户可修改的,而是由BLE堆栈设置的。ADV长度为0x1B,ADV类型为0xFF; 这些将分别指定广告数据包的长度和类型作为制造数据。之后,一切都由用户决定,可以推送到广告制造商数据字段。请注意,在大多数情况下,MFG ID将与Bluetooth Sig分配的号码文档相关联。

altbeacon-spec-exploded-view

例子

用于iBeacons的相同示例适用于AltBeacons,具有以下修改:

  1. 具有不同制造商ID的能力。
  2. 具有不同信标码的能力。
  3. 最后保留数据的一个字节,用于保存特定的制造商信息。

使用AltBeacon,可以使用特定于应用程序的UUID而不是特定于公司的UUID,从而可以更改公司ID。虽然目前没有任何东西正在利用这一点,但我可以想象信标广播UUID用于信标服务,比如温度服务,然后提供制造公司的信息和温度,这样提供任何人的温度值。步行可以查看。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "mbed.h"
#include "AltBeaconService.h"
...
BLEDevice ble;
uint8_t beaconID[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, // 16B of UUID + 4B subdivided as needed.
0x10,0x11,0x12,0x13,0x14,0x15,0x00,0x01,0x00,0x02 };
uint16_t manufacturerID = 0x5900; //Nordic SIG ID
int8_t rssi = -122;
...
int main(void){
...
AltBeaconService altbeacon(ble, manufacturerID, beaconID, rssi); // Add AltBeacon service to BLE object
...
while(1){
ble.waitForEvent();
}
}

思考

AltBeacons有很大的可能性。它们充分利用了它们所拥有的空间,或多或少地向后兼容iBeacons,并且是开源的。这说它是一个非常新的规范,几乎没有人使用它,并且它与iBeacons的市场渗透作斗争是一场艰苦的战斗。我认为,越来越多的人会使用AltBeacons,因为他们可以携带更多的数据并拥有更广泛的用例 - 这是开放式蛋糕上的一个樱桃。您可以在此处找到mbed AltBeacon示例代码。

Eddystone

Eddystone前身为URIBeacon(发音为YUR-ee-BEE-kun)

Eddystone是由Google开发的开放式信标格式,其设计考虑了透明度和稳健性。Android和iOS设备都可以检测到Eddystone。Eddystone格式建立在现有部署中与行业合作伙伴合作的经验教训的基础上,以及更广泛的灯塔社区。帧格式中可以包含几种不同类型的有效载荷,包括:

  • Eddystone-UID:一个唯一的静态ID,带有一个10字节的命名空间组件和一个6字节的实例组件。
  • Eddystone-URL:经过解析和解压缩后,可由客户端直接使用的压缩URL。
  • Eddystone-TLM:信标状态数据,可用于信标队维护,并为Google Proximity Beacon API的诊断端点提供支持。-TLM应与识别帧交错,例如Eddystone-UID或Eddystone-EID(加密的eTLM版本保留安全性)。
  • Eddystone-EID:时变信标帧,可通过链接解析器(例如Proximity Beacon API)解析为稳定标识符。

此外,Eddystone还包括配置服务和品牌材料。为确保您的部署完全支持Google信标平台,您应该使用Eddystone-UID或-EID设置信标,并可选择添加-URL和-TLM。