什么是 iBeacon 蓝牙配置文件

Posted

技术标签:

【中文标题】什么是 iBeacon 蓝牙配置文件【英文标题】:What is the iBeacon Bluetooth Profile 【发布时间】:2013-09-25 06:20:47 【问题描述】:

我想使用一些低功耗蓝牙开发套件创建自己的 iBeacon。 Apple 尚未发布 iBeacon 规范,但是,一些硬件开发人员已经从 AirLocate 示例代码对 iBeacon 进行了逆向工程,并开始销售 iBeacon 开发套件。

那么?

低功耗蓝牙使用 GATT 进行 LE 配置文件服务发现。所以我认为我们需要知道 Attribute Handle、Attribute Type、Attribute Value,也许还有 iBeacon 属性的 Attribute Permissions。那么对于 UUID 为 E2C56DB5-DFFB-48D2-B060-D0F5A71096E0 的 iBeacon,主要值为 1,次要值为 1,蓝牙 GATT 配置文件服务是什么?

以下是我从 Apple 论坛和文档中的讨论中做出的一些假设。

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

    主要和次要密钥在此配置文件服务中的某处编码

以下是一些拥有 iBeacon 开发套件的公司,他们似乎已经有了这个想法:

http://redbearlab.com/ibeacon/ http://kontakt.io/

希望我们能及时在 Bluetooth.org 上发布如下个人资料:https://www.bluetooth.org/en-us/specification/adopted-specifications

【问题讨论】:

实际上我已经知道了 4 个属性值是什么 @Dan1One 我已经使用 Light Blue 复制了该服务,然后使用 Apple 的 AirLocate 示例代码我无法覆盖重复的服务我认为还有更多内容,Light Blue 也没有列出属性句柄 您是否正在寻找一种使用 CBPeripheralManager(在后台运行)或其他(非 ios)软件或硬件来创建 iBeacon 的方法?这将导致所需的细节。 @Wain 正如第一段所述,我正在尝试将自己的硬件放入自己的硬件中。但正如我在链接问题中指出的那样,它可能对使用 CBPeripheralManager 在后台宣传 iBeacon 来回答链接问题很有用 太棒了!你能在这里为未来的程序员分享那个文档吗,当我在 2013 年问这个问题时,它肯定还不存在 【参考方案1】:

这似乎是基于广告数据,尤其是制造商数据:

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>
Apple 公司标识符(小端序),0x004c 数据类型,0x02 => iBeacon 数据长度,0x15 = 21 uuid: 585CDE931B0142CC9A1325009BEDC65E 专业:0000 轻微:0000 1 米处测量功率:0xc5 = -59

我有这个 node.js script 在 Linux 上使用 AirLocate 应用示例示例。

【讨论】:

遗憾的是该脚本不再可用。你介意再分享一次吗? @Thomaschaaf 抱歉,我在这里删除了 Github 中旧版本的 link。我还更新了bleacon,不再需要生成 hcitool/hciconfig。 "1 米测量功率:0xc5 = -59" 0xc5 到 -59 是如何计算的? @andreasbecker.de 你拿two's complement @sandeepmistry 到 node.js 脚本的链接现在已断开。【参考方案2】:

对于具有 ProximityUUID E2C56DB5-DFFB-48D2-B060-D0F5A71096E0、major 0、minor 0-59 RSSI 的校准 Tx Power 的 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

任何可配置为发送特定广告的低功耗蓝牙设备都可以生成上述数据包。我已经使用 Bluez 配置了一台 Linux 计算机来发送此广告,并且运行 Apple 的 AirLocate 测试代码的 iOS7 设备将其作为具有上述指定字段的 iBeacon 拾取。见:Use BlueZ Stack As A Peripheral (Advertiser)

此blog 包含有关逆向工程过程的完整详细信息。

【讨论】:

这太棒了!正是我正在寻找的。但是谁能解释我如何计算校验和? 我还有一个问题要请您帮助我们完成更多规范。以毫秒为单位的正确广播间隔似乎是多少?我注意到使用 texas Instruments 代码作为 iBeacon 的基础,这使得苹果的 Airlocate 应用程序在显示附近 iBeacon 列表时表现得有点不一致。 UUID/proximityUUID 是特定于 iBeacon 的 BLE 配置文件,还是取决于设备制造商?区分 iBeacon 设备的首选方法是什么:BT MAC 地址、UUID 还是主要/次要值? David,您是否能够在使用核心蓝牙 GATT API 时为 iOS 设备配置特定的广告数据包?我找不到选项。您可以为服务和特征定义自定义 UUID,但不能为广告定义。 @ReinaldoJunior AD = 广告数据。请参阅 slackhappy 的回答中的参考资料。【参考方案3】:

只是为了调和 Sandeepmistry 的答案和 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

AD 中缺少服务 [5] 定义。我认为 iBeacon 协议本身与 GATT 和标准服务发现没有关系。如果你下载 RedBearLab 的 iBeacon 程序,你会发现他们碰巧使用 GATT 来配置广告参数,但这似乎是特定于他们的实现,而不是规范的一部分。 AirLocate 程序似乎没有使用 GATT 进行配置,例如,根据我尝试过的 LightBlue 或其他类似程序。

参考资料:

    核心蓝牙规范 v4,第 3 卷,C 部分,11 第 3 卷,C 部分,18.1 第 3 卷,C 部分,18.11 https://www.bluetooth.org/en-us/specification/assigned-numbers/company-identifiers 第 3 卷,C 部分,18.2

【讨论】:

谢谢@slackhappy,我已经更新了我的答案。 2字节头是0x02数据类型,0x15 = 21数据长度。 谢谢@slackhappy 这很好,但我可以问一个愚蠢的问题吗?如果我想发送一些消息,例如“进来喝杯免费咖啡”或类似的消息,我是否只需将您示例中的 FF 替换为我的字符串的 HEX 值? (并且还将 AD 结构的长度更新为套件?)【参考方案4】:

如果您问这个问题的原因是因为您想use Core Bluetooth to advertise as an iBeacon 而不是使用标准 API,您可以通过宣传 NSDictionary 轻松做到这一点,例如:


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

更多信息请参见this answer。

【讨论】:

【参考方案5】:

很简单,它只是宣传一个字符串,其中包含一些符合 Apple iBeacon 标准的字符。 你可以参考链接 http://glimwormbeacons.com/learn/what-makes-an-ibeacon-an-ibeacon/

【讨论】:

【参考方案6】:

iBeacon Profile 包含 31 个字节,包括以下内容

    前缀 - 9 字节 - 包括广告数据和制造商数据 UUID - 16 字节 主要 - 2 字节 次要 - 2 个字节 TxPower - 1 字节

【讨论】:

以上是关于什么是 iBeacon 蓝牙配置文件的主要内容,如果未能解决你的问题,请参考以下文章

ibeacon和蓝牙有什么区别_它们的区别在哪里

ibeacon是啥?能实现哪些功能?

iBeacon到底是啥定位技术?

android蓝牙4.0(BLE)开发之ibeacon初步

iBeacon到底是啥定位技术?

蓝牙和 iOS - 支持哪些协议/配置文件?