SCENARIO
我正在开发一个框架,必须利用 CoreBluetooth
框架才能通过BLE发送数据 . 我已经完成了使用iBeacons传达环境数据的要求,但我现在需要将数据从一个设备发送到另一个设备 . 我将使用 CBCentralManager
从一个应用程序 scanForPeripherals
和另一个将使用 CBUUID
广播外围设备的应用程序,然后中央应用程序将从服务的特征中请求数据 .
根据我所知,我已经完成了所有这些工作: a. 我可以扫描我所在区域的外围设备并在建筑物周围获得大量结果,但不是我从设备广播的外围设备 . b. 我可以从 CBPeripheralManager
添加包含我的 CBUUID
的服务,并在 didAddService
委托方法中取得成功 .
但我的 CBPeripheralManager
仍然无法发现我的外围设备 .
CODE
// 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)
注意:对于CBCentralManager和CBPeripheralManager,我实例化我的管理器,然后等待调用didUpdateState委托方法,并且只有在状态为poweredOn时才开始扫描或广播 .
HYPOTHESIS
我认为我已正确设置 CBCentralManager
以扫描所有外围设备(未指定任何服务UUID),我仍然无法发现我的外围设备 . 我认为'broadcast'代码存在缺陷 . 我已经对 CBPeripheralManager
上的 add(_ service: CBMutableService)
函数做了一些研究,我不确定我是否正确理解了这一点 .
QUESTION
a. add(_ service: CBMutableService)
是否开始 CBPeripheral
的'broadcast'?我的印象是,这是我必须调用的唯一方法,这将'add'服务到某种队列,将在BLE上发送以便被发现 .
从add(_ :)方法的Apple文档中,“将服务及其任何相关特征和特征描述符发布到本地GATT数据库 . ”
我对当地GATT数据库进行了大量研究,但Apple没有提供太多信息 .
b. 本地GATT数据库是否像我上面描述的那样运行,并且会自动开始我的外围设备的'broadcast'?或者我还有更多工作要做吗?
1 回答
不,
add(_ service:)
仅将服务添加到CBPeripheralManager
. 要实际宣传您需要致电startAdvertising(_ advertisementData:)的服务 .advertisementData
是一本字典 . 您指定要为密钥CBAdvertisementDataServiceUUIDsKey通告的UUID数组 .您必须这样做的原因是外围设备可能提供比它所宣传的服务更多的服务 . 由于广告包中的空间有限,您通常只会宣传您的“主要”服务;用于发现您的外围设备的服务 . 连接后,中央可以发现外围设备提供的其他服务 .