iOS 上的 BLE 广告和 CBAdvertisementDataLocalNameKey 大小

Posted

技术标签:

【中文标题】iOS 上的 BLE 广告和 CBAdvertisementDataLocalNameKey 大小【英文标题】:BLE advertising on iOS and CBAdvertisementDataLocalNameKey size 【发布时间】:2020-08-12 17:58:56 【问题描述】:

ios 上使用蓝牙低功耗广告时,广告为 CBAdvertisementDataLocalNameKey 的最大数据大小是多少?在进行一些测试时,我使用以下代码进行 BLE 广告:

var manager: CBPeripheralManager!
//...
let customData = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
manager.startAdvertising([CBAdvertisementDataServiceUUIDsKey:[serviceCBUUID], CBAdvertisementDataLocalNameKey: customData])

我注意到,在检测到外围设备 (func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)) 时调用的委托方法中的第二个设备上,我的自定义数据被剪切为以下字符串:“01234567”,因此它只有 8 个字节。 startAdvertising 函数的文档中提到了一些关于“支持的广告数据键的任意组合的初始广告数据中最多 28 个字节的空间”。有人可以解释为什么在我的情况下它只有 8 个字节吗?在 iOS 上,这个 CBAdvertisementDataLocalNameKey 实际上总是 8 个字节,还是这个数字可以改变?如何计算将在广告包中成功发送的字节数(在我的情况下为 8 个字节)?在 iOS 上使用 BLE 时,有什么方法可以宣传超过 8 个字节?同时广告服务的数量是否有限制?例如,是否可以同时宣传 10 个不同的 uuid,每个 8 个字节,总共允许同时宣传 80 个字节?

【问题讨论】:

【参考方案1】:

与大多数 BLE 一样,这取决于。但通常广告数据包的大小为 31 字节,除非您有扩展广告(有时在较新的手机和较新版本的 iOS 上可用,下面将详细介绍)。完整的广告区域是 37 字节减去 MAC 的 6 个强制字节。这包括所有内容:您发送的每件东西的长度、标签和价值 (LTV)。

首先,会有标志,即三个字节(长度、标签、值)。所以现在我们处于记录的 28 字节。

所以你想发送一些服务 UUD。我假设 serviceCBUUID 是一个 128 位的临时 UIUD,而不是一个 16 位分配的 UUID。所以这是一个 2 字节的标头(长度,128 位服务 UUID 的完整列表),加上 16 字节的数据。

现在我们有 10 个字节。

你的名字不适合 10 个字节,所以我假设它正在发送“缩短的本地名称”标签,以及适合的 8 个字节(包括一个长度字节)。

如果您想发送更长的名称,则需要缩短有效负载中的其他内容。

在您的情况下,您可能只想删除 CBAdvertisementDataServiceUUIDsKey。如果有空间,Apple 通常会为您管理。如果没有空间,Apple 有一个聪明的专有技巧,可以将数据散列到溢出区域。只要您只会被其他 Apple 设备扫描,这非常有效,您无需为您的完整服务 UUID 做广告就可以逃脱。但是,如果您需要被 Apple 设备以外的其他设备扫描,则它不起作用。

如果您确实需要宣传您的服务 UUID,并且还希望为您的本地名称留出更多空间,那么您需要 buy an assigned UUID。这些成本为 2,500 美元,并且是 16 位而不是 128 位,这将为您的本地名称返回 14 个字节。

关于您关于“10 个不同的 uuid,每个 8 个字节”的问题,我不确定您从哪里得到这些数字。 BLE UUID 为 16 字节(128 位)或 2(16 位)。但是,是的,如果您尝试发布 10 个 16 字节 UUID 会溢出。 iOS 可能会发布尽可能多的广告,然后将其余部分散列到溢出区域(如上所述)。服务 UUID 的完整列表在连接时仍然可用,即使它们没有被公布。

如果您有 10 个 16 位 UUID,那么这将占用 22 个字节,这很适合广告数据包(没有本地名称)。要获得两个以上的 16 位 UUID,您至少需要成为蓝牙 SIG 的Associate Member。每年的费用为 7,500 美元或 35,000 美元,具体取决于您公司的规模。采用者(免费层)只能以 2,500 美元/每个的价格注册其中两个。

现在,如果这仅适用于运行相当新版本的 iOS(我相信是 12+)的相当新的 iPhone(我相信是 8+),那么还有扩展广告,它允许高达 124 字节的有效负载。有关详细信息,请参阅来自 WWDC 2019 的"What's New in Core Bluetooth"。扫描设备还需要支持扩展扫描才能工作。

【讨论】:

以上是关于iOS 上的 BLE 广告和 CBAdvertisementDataLocalNameKey 大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中配置ble广告以供ios检测

在 Swift 中的 iOS BLE 扫描中提取广告数据 [kCBAdvDataManufacturer] 的内容

BLE iOS Nativescript:广播数据失败

iOS 在后台模式下从广告中省略制造商数据

BLE 外设无广告

BLE广告和信标