CBPeripheralManager:add(_ service: CBMutableService) 是否为外围设备做广告?
CBPeripheralManager: Does add(_ service: CBMutableService) advertise peripheral?
场景
我正在开发一个必须利用 CoreBluetooth
框架才能通过 BLE 发送数据的框架。我已经完成了使用 iBeacons 传输环境数据的要求,但我现在需要将数据从一台设备发送到另一台设备。我将使用从一个应用程序到 scanForPeripherals
的 CBCentralManager
和另一个将使用 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" 服务;用于发现您的外围设备的服务。连接后,中央可以发现您的外围设备提供的其他服务。
场景
我正在开发一个必须利用 CoreBluetooth
框架才能通过 BLE 发送数据的框架。我已经完成了使用 iBeacons 传输环境数据的要求,但我现在需要将数据从一台设备发送到另一台设备。我将使用从一个应用程序到 scanForPeripherals
的 CBCentralManager
和另一个将使用 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
andCBPeripheralManager
I am instantiating my managers and then waiting for thedidUpdateState
delegate methods to get called and only begin scanning or broadcasting if the state ispoweredOn
.
假设
我认为我的 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
.
您必须这样做的原因是外围设备提供的服务可能比它宣传的要多。由于广告包中的 space 有限,您通常只宣传您的 "primary" 服务;用于发现您的外围设备的服务。连接后,中央可以发现您的外围设备提供的其他服务。