自定义蓝牙低功耗广告数据和扫描响应数据

Posted

技术标签:

【中文标题】自定义蓝牙低功耗广告数据和扫描响应数据【英文标题】:Custom bluetooth low energy advertising data and scan response data 【发布时间】:2014-05-06 17:40:01 【问题描述】:

我正在尝试创建自定义 BLE 广告和扫描响应。广告是 iBeacon。我还希望它广播服务的可用性。我不能将服务 uuid 放入广告数据中,因为它会太长(据我了解,Bluegiga 的 BGScript 只允许广告数据中包含 32 个八位字节)。我将服务 uuid 放在扫描响应中,希望这将允许移动设备查看服务,以便搜索并连接到设备。出于某种原因,我无法让它工作。 ios 不再将 BLE 设备作为 iBeacon 拾取,并且不识别该服务可用。我将为服务 uuid 使用什么 AD 类型,以及我将如何格式化该数据(包括服务 uuid)?

这是我目前所拥有的:

广告数据

02 01 06 // flags
1a ff 4c 00 02 15 // manufacturer data, apple company id, iBeacon preamble
aa aa aa aa - aa aa - aa aa - aa aa - aa aa aa aa aa aa // iBeacon UUID
00 01 00 01 // iBeacon major, minor
c6 // measured tx power

扫描响应数据

11 // length
16 // ad type (I am not sure what this should be)
a5 b7 67 a0 - 74 9b - 11 e3 - 98 1f - 08 00 20 0c 9a 66 // service UUID

为了获得更好的上下文,这里是 BGScript 中用于 BLE112 的部分:

event system_boot( major, minor, patch, build, ll_version, protocol_version, hw )

    call gap_set_adv_parameters( 20, 100, 7 )

    call gap_set_mode( gap_general_discoverable, gap_undirected_connectable )

    # Flags
    data( 0:1) = $02
    data( 1:1) = $01
    data( 2:1) = $06

    # Manufacturer data
    data( 3:1) = $1a
    data( 4:1) = $ff

    # Preamble
    data( 5:1) = $4c
    data( 6:1) = $00
    data( 7:1) = $02
    data( 8:1) = $15

    # UUID
    data( 9:1) = $aa
    data(10:1) = $aa
    data(11:1) = $aa
    data(12:1) = $aa
    data(13:1) = $aa
    data(14:1) = $aa
    data(15:1) = $aa
    data(16:1) = $aa
    data(17:1) = $aa
    data(18:1) = $aa
    data(19:1) = $aa
    data(20:1) = $aa
    data(21:1) = $aa
    data(22:1) = $aa
    data(23:1) = $aa
    data(24:1) = $aa

    # Major
    data(25:1) = $00
    data(26:1) = $01

    # Minor
    data(27:1) = $00
    data(28:1) = $01

    # Measured power (specified in 2's complement, so 0xC6 is -58)
    data(29:1) = $c6

    # Scan Response Data
    sr_data( 0:1) = $11
    sr_data( 1:1) = $21

    # Service Uuid
    sr_data( 2:1) = $a5
    sr_data( 3:1) = $b7
    sr_data( 4:1) = $67
    sr_data( 5:1) = $a0
    sr_data( 6:1) = $74
    sr_data( 7:1) = $9b
    sr_data( 8:1) = $11
    sr_data( 9:1) = $e3
    sr_data(10:1) = $98
    sr_data(11:1) = $1f
    sr_data(12:1) = $08
    sr_data(13:1) = $00
    sr_data(14:1) = $20
    sr_data(15:1) = $0c
    sr_data(16:1) = $9a
    sr_data(17:1) = $66

    # Set advertisement data
    call gap_set_adv_data(0, 30, data(0:30))
    call gap_set_adv_data(1, 18, sr_data(0:18))

    #set bondable mode
    call sm_set_bondable_mode(1)

end

【问题讨论】:

【参考方案1】:

我能够让服务 uuid 在扫描响应数据包中广播。它同时适用于 CLLocationManager (iBeacon) 和 CBCentralManager (BLE)。我认为其他地方还有一些其他的变化使它起作用,但我不确定它们在哪里。 我使用了“128 位服务类 UUID 的不完整列表”AD 类型 (0x06),我发现我的 uuid 的字节序向后。

这是我使用的扫描响应数据:

    # Scan Response Data
    sr_data( 0:1) = $11
    sr_data( 1:1) = $06

    # Service Uuid
    sr_data( 2:1) = $66
    sr_data( 3:1) = $9a
    sr_data( 4:1) = $0c
    sr_data( 5:1) = $20
    sr_data( 6:1) = $00
    sr_data( 7:1) = $08
    sr_data( 8:1) = $1f
    sr_data( 9:1) = $98
    sr_data(10:1) = $e3
    sr_data(11:1) = $11
    sr_data(12:1) = $9b
    sr_data(13:1) = $74
    sr_data(14:1) = $a0
    sr_data(15:1) = $67
    sr_data(16:1) = $b7
    sr_data(17:1) = $a5

【讨论】:

扫描响应数据是否与centralManager:didDiscoverPeripheral 中的其余广告数据一起出现?只是想知道 CoreBluetooth 是编译广告包和扫描响应并调用委托方法一次还是单独调用。【参考方案2】:

为什么你需要服务 UUID?使用 CoreBluetooth 扫描 iBeacon 后,您应该能够连接到它。

有关示例,请参阅 here。此示例旨在证明使用 CoreBluetooth 无法读取 iBeacon 标识符。但它也表明 CoreBluetooth API 让您可以在扫描后连接到 iBeacon,即使您无法读取它的标识符。

也可以在建立此连接后使用 CoreBluetooth 向信标查询服务。

【讨论】:

我的意图是在进入 CLBeaconRegion 时,CBCentralManager 将开始扫描信标。我可以扫描并连接到任何 BLE 设备(通过在 CBCentralManager 的 scanForPeripheralsWithServices:options: 方法(记录 here)上调用 nil),但我只想寻找自己的信标。 明白。您首选的方法更简单,但这可能是不可能的,因为 iBeacon 广告中的数据无法从 CoreBluetooth 读取,并且修改广告几乎肯定会破坏使用 CoreLocation 进行检测的能力。另一种方法是尝试连接到您在扫描中看到的每个蓝牙设备,查询它的服务,然后根据它提供的服务确定它是否是您的信标。如果它不能提供您预期的服务,请断开连接并尝试下一个。

以上是关于自定义蓝牙低功耗广告数据和扫描响应数据的主要内容,如果未能解决你的问题,请参考以下文章

Qt低功耗蓝牙系列三(低功耗蓝牙客户端的程序设计纯Android代码)

Android 低功耗蓝牙开发 (扫描过滤自定义服务与特性)Kotlin版

Android 低功耗蓝牙开发 (扫描过滤自定义服务与特性)Kotlin版

BLE低功耗蓝牙的广播内容

使用 hcitool 扫描蓝牙低功耗?

Android 低功耗蓝牙开发(扫描连接数据交互)Kotlin版