CoreBluetooth:scanForPeripheralsWithServices无法使用服务阵列

时间:2014-11-27 09:37:47

标签: ios objective-c swift bluetooth-lowenergy core-bluetooth

我正在开发IOS(SWIFT)的BLE应用程序,我发现了一个奇怪的行为..我的测试有2个控制器,ONE带有CentralManager角色,另一个带有PeripheralManager角色..

这是我的代码(摘要):

Parameters.swift:

...
// a custome UUID created in console
let TRANSFER_SERVICE_UUID = CBUUID(string: "FB694B90-F49E-....-....-171BBA78F846")
...

Peripheral.swift

...
var pManager = CBPeripheralManager()
var transferService = CBMutableService()

override func viewDidLoad() {
    super.viewDidLoad()
    pManager = CBPeripheralManager(delegate: self, queue: nil)
}

func peripheralManagerDidUpdateState(peripheral: CBPeripheralManager!) {
    if(peripheral.state == CBPeripheralManagerState.PoweredOn) {
        transferService = CBMutableService(type: TRANSFER_SERVICE_UUID, primary: true)
        // add some characteristic
        pManager.addService(transferService)
        pManager.startAdvertising(nil)
    }
}
...

Central.swift

...
var cManager = CBCentralManager()

override func viewDidLoad() {
    super.viewDidLoad()
    cManager = CBCentralManager(delegate: self, queue: nil)
}

func centralManagerDidUpdateState(central: CBCentralManager!) {
    if central.state == CBCentralManagerState.PoweredOn {
        cManager.scanForPeripheralsWithServices([TRANSFER_SERVICE_UUID], options: nil)
    }
}
...

现在,如果我使用2个设备,一个使用Central,另一个使用Peripheral Role,则2 app无法找到彼此(但LightBlue应用程序和类似的因此设备正在发出)

另一方面,如果我将代码更改为:

cManager.scanForPeripheralsWithServices(nil, options: nil)

我的应用程序运行良好,2个设备可以互相通信..但同时我不能只过滤发射TRANSFER_SERVICE_UUID的设备..我不想连接到所有外围设备,以便搜索TRANSFER_SERVICE_UUID ..这不是正确的方法吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:6)

蓝牙广告区域的空间有限,因此iOS不会自动通告所有服务 - 设备可能具有主要服务和多种补充服务。当所有需要的是发现主要服务以识别候选设备时,广告所有服务是浪费的。

为了能够在scanForPeripheralsWithServices中发现服务,您需要将服务包含在广告数据中。

这是通过将服务的UUID包含在您传递给CBPeripheralManager.startAdvertising的字典中来完成的 -

pManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey:[TRANSFER_SERVICE_UUID]])