iOS 上的 BLE 广告和 CBAdvertisementDataLocalNameKey 大小

Les*_*ary 2 ios core-bluetooth bluetooth-lowenergy

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

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

我注意到,在检测到外设 ( 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,每个 uuid 各有 8 个字节,总共允许同时通告 80 个字节?

Rob*_*ier 5

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

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

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

现在我们的大小是 10 字节。

您的姓名无法容纳 10 个字节,因此我假设它正在发送“缩短的本地名称”标签以及适合的 8 个字节(包括一个长度字节)。

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

就您而言,您可能只想删除 CBAdvertisementDataServiceUUIDsKey。如果有空间,Apple 通常会为您管理。如果没有空间,那么苹果公司有一个聪明的专有技巧,可以将数据哈希到溢出区域。只要您只想被其他 Apple 设备扫描,这种方式就非常有效,您无需花费广告您的完整服务 UUID 的费用即可摆脱困境。不过,如果您需要使用 Apple 设备以外的设备进行扫描,那么它就不起作用了。

如果您确实需要宣传您的服务 UUID,并且您还希望为您的本地名称提供更多空间,那么您将需要购买指定的 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 的准会员。每年的费用为 7,500 美元或 35,000 美元,具体取决于您公司的规模。采用者(免费层)只能以每个 2,500 美元的价格注册其中两个。

现在,如果这只适用于运行相当新版本的 iOS(我认为是 12+)的相当新的 iPhone(我认为是 8+),那么就会有扩展的广告,最多允许 124 字节的有效负载。有关详细信息,请参阅WWDC 2019 的“核心蓝牙新增功能” 。扫描设备还需要支持扩展扫描才能发挥作用。