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