iBeacon 的蓝牙规范是什么

我想用一些低耗电蓝牙的开发工具包来创建我自己的 iBeacon。苹果公司还没有发布 iBeacon 的规范,但是,一些硬件开发商已经从 AirLocate 样本代码中逆向设计了 iBeacon,并开始销售 iBeacon 开发工具包。

那么 iBeacon 的蓝牙规范是什么?

低耗电蓝牙使用关贸总协定发现 LE 配置文件服务。所以我认为我们需要知道属性句柄,属性类型,属性值,也许还有 iBeacon 属性的属性权限。那么对于 UUID 为 E2C56DB5-DFFB-48D2-B060-D0F5A71096E0的 iBeacon,主值为1,次值为1的蓝牙 GATT 配置文件服务是什么呢?

以下是我从苹果论坛和文档讨论中得出的一些假设。

  1. 您只需查看蓝牙外设的配置文件服务(GATT)即可知道它是一个 iBeacon。

  2. 主密钥和次密钥被编码在这个配置文件服务的某个地方

以下是一些拥有 iBeacon 开发工具包的公司,他们似乎已经明白了这一点:

希望我们能及时在 Bluetooth.org 上发布一个像这样的简介: https://www.bluetooth.org/en-us/specification/adopted-specifications

112260 次浏览

它似乎是基于广告数据,特别是制造商的数据:

4C00 02 15 585CDE931B0142CC9A1325009BEDC65E 0000 0000 C5


<company identifier (2 bytes)> <type (1 byte)> <data length (1 byte)>
<uuid (16 bytes)> <major (2 bytes)> <minor (2 bytes)> <RSSI @ 1m>
  • 苹果公司标识符(Little Endian) ,0x004c
  • 数据类型,0x02 = > iBeacon
  • 数据长度,0x15 = 21
  • Uuid: 585CDE931B0142CC9A1325009BEDC65E
  • 少校: 0000
  • 未成年人: 0000
  • 测量功率为1米: 0xc5 = -59

我有这个 Node.js 脚本与示例 AirLocate 应用程序示例一起在 Linux 上工作。

对于具有 ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0、主 0、次 0和校准的 -59 RSSI 的 Tx 功率的 iBeacon,发送的 BLE 广告包看起来如下:

d6 be 89 8e 40 24 05 a2 17 6e 3d 71 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 52 ab 8d 38 a5

这个数据包可以分解如下:

d6 be 89 8e # Access address for advertising data (this is always the same fixed value)
40 # Advertising Channel PDU Header byte 0.  Contains: (type = 0), (tx add = 1), (rx add = 0)
24 # Advertising Channel PDU Header byte 1.  Contains:  (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.)
05 a2 17 6e 3d 71 # Bluetooth Mac address (note this is a spoofed address)
02 01 1a 1a ff 4c 00 02 15 e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 00 00 00 00 c5 # Bluetooth advertisement
52 ab 8d 38 a5 # checksum

这个数据包的关键部分是蓝牙广告,它可以这样分解:

02 # Number of bytes that follow in first AD structure
01 # Flags AD type
1A # Flags value 0x1A = 000011010
bit 0 (OFF) LE Limited Discoverable Mode
bit 1 (ON) LE General Discoverable Mode
bit 2 (OFF) BR/EDR Not Supported
bit 3 (ON) Simultaneous LE and BR/EDR to Same Device Capable (controller)
bit 4 (ON) Simultaneous LE and BR/EDR to Same Device Capable (Host)
1A # Number of bytes that follow in second (and last) AD structure
FF # Manufacturer specific data AD type
4C 00 # Company identifier code (0x004C == Apple)
02 # Byte 0 of iBeacon advertisement indicator
15 # Byte 1 of iBeacon advertisement indicator
e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon proximity uuid
00 00 # major
00 00 # minor
c5 # The 2's complement of the calibrated Tx Power

任何可以配置为发送特定广告的蓝牙 LE 设备都可以生成上述数据包。我已经配置了一台使用 Bluez 发送这个广告的 Linux 计算机,运行苹果 AirLocate 测试代码的 iOS7设备将其作为具有上面指定字段的 iBeacon 接收。见: 使用 BlueZ 堆栈作为外设(广告商)

本逆向工程载有有关制造过程的详细资料。

只是为了调和 sandeep mistry 的答案和 davidgyoung 的答案之间的差异:

02 01 1a 1a ff 4C 00

是广告数据格式规范的一部分[1]

  02 # length of following AD structure
01 # <<Flags>> AD Structure [2]
1a # read as b00011010.
# In this case, LE General Discoverable,
# and simultaneous BR/EDR but this may vary by device!


1a # length of following AD structure
FF # Manufacturer specific data [3]
4C00 # Apple Inc [4]
0215 # ?? some 2-byte header

广告中缺少的是服务[5]定义。我认为 iBeacon 协议本身与关贸总协定和标准服务发现没有任何关系。如果您下载 RedBearLab 的 iBeacon 程序,您将看到他们正好使用 GATT 来配置广告参数,但这似乎是针对其实现的,而不是规范的一部分。例如,根据 LightBlue 和其他我试过的类似程序,AirLocate 程序似乎不使用 GATT 进行配置。

参考文献:

  1. 核心蓝牙规范第4版,第3卷,C 部分,11
  2. 第三卷,C 部分,18.1
  3. 第三卷,C 部分,18.11
  4. Https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers
  5. 第三卷,C 部分,18.2

如果你问这个问题的原因是因为你想使用 使用核心蓝牙作为 iBeacon 的广告而不是标准的 API,你可以很容易地通过广告一个 NSDictionary,如:

{
kCBAdvDataAppleBeaconKey = <a7c4c5fa a8dd4ba1 b9a8a240 584f02d3 00040fa0 c5>;
}

有关更多信息,请参见 这个答案

它非常简单,它只是宣传一个字符串,其中包含一些符合苹果的 iBeacon 标准的字符。 你可参阅连结 Http://glimwormbeacons.com/learn/what-makes-an-ibeacon-an-ibeacon/

IBeacon 配置文件包含31个字节,其中包括以下内容

  1. 前缀-9字节-其中包括的广告数据和制造商的数据
  2. UUID-16字节
  3. 主要 -2字节
  4. 小 -2字节
  5. TxPower-1字节

enter image description here