我正在开发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 ..这不是正确的方法吗?我错过了什么吗?
答案 0 :(得分:6)
蓝牙广告区域的空间有限,因此iOS不会自动通告所有服务 - 设备可能具有主要服务和多种补充服务。当所有需要的是发现主要服务以识别候选设备时,广告所有服务是浪费的。
为了能够在scanForPeripheralsWithServices
中发现服务,您需要将服务包含在广告数据中。
这是通过将服务的UUID包含在您传递给CBPeripheralManager.startAdvertising
的字典中来完成的 -
pManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey:[TRANSFER_SERVICE_UUID]])