CBPeripheralManager:add(_ service: CBMutableService) 是否为外围设备做广告?

CBPeripheralManager: Does add(_ service: CBMutableService) advertise peripheral?

场景

我正在开发一个必须利用 CoreBluetooth 框架才能通过 BLE 发送数据的框架。我已经完成了使用 iBeacons 传输环境数据的要求,但我现在需要将数据从一台设备发送到另一台设备。我将使用从一个应用程序到 scanForPeripheralsCBCentralManager 和另一个将使用 CBUUID 广播外围设备的应用程序,然后中央应用程序将从服务的特性中请求数据。

据我所知,我所有这些都正常工作:a. 我可以扫描我所在区域的外围设备并在建筑物周围获得很多结果,但不是我从我的设备广播的外围设备。 b. 我可以从 CBPeripheralManager 添加包含我的 CBUUID 的服务,并在 didAddService 委托方法中获得成功。

但是我的CBPeripheralManager还是找不到我的外设

代码

// To scan...
centralManager?.scanForPeripherals(withServices: nil, options: nil)

// To broadcast...
let dataString = "SomeValueFromData"
let data = dataString.data(using: .utf8)
let base64 = data?.base64EncodedData()

let uuid = CBUUID(nsuuid: Constants.Scan.uuid)
let service = CBMutableService(type: uuid, primary: true)
let properties = CBCharacteristicProperties.read
let characteristic = CBMutableCharacteristic(type: uuid, properties: properties, value: base64, permissions: .readable)
service.characteristics = [characteristic]
peripheralManager.add(service)

Note: For both CBCentralManager and CBPeripheralManager I am instantiating my managers and then waiting for the didUpdateState delegate methods to get called and only begin scanning or broadcasting if the state is poweredOn.

假设

我认为我的 CBCentralManager 设置正确以扫描所有外围设备(未指定任何服务 UUID),但我仍然无法发现我的外围设备。我认为 'broadcast' 代码中存在缺陷。我对 CBPeripheralManager 上的 add(_ service: CBMutableService) 函数做了一些研究,我不确定我是否理解正确。

问题

a. add(_ service: CBMutableService) 是否开始 CBPeripheral 的 'broadcast'?我的印象是这是我必须调用的唯一方法,这将 'add' 服务到某种队列,该队列将在 BLE 上发送出去以被发现。

From the Apple Documentation on the add(_:) method, "Publishes a service and any of its associated characteristics and characteristic descriptors to the local GATT database."

我对本地 GATT 数据库进行了大量研究,Apple 没有提供太多信息。

b.本地的GATT数据库是否像我上面描述的那样以队列的方式运行,并会自动开始我的外设'broadcast'?或者我还需要做更多事情吗?

否,add(_ service:) 仅将服务添加到 CBPeripheralManager。要实际宣传服务,您需要调用 startAdvertising(_ advertisementData:)

advertisementData 是字典。您指定要为密钥 CBAdvertisementDataServiceUUIDsKey.

公布的一组 UUID

您必须这样做的原因是外围设备提供的服务可能比它宣传的要多。由于广告包中的 space 有限,您通常只宣传您的 "primary" 服务;用于发现您的外围设备的服务。连接后,中央可以发现您的外围设备提供的其他服务。