CoreBluetooth:scanForPeripheralsWithServices 不使用服务数组
Posted
技术标签:
【中文标题】CoreBluetooth:scanForPeripheralsWithServices 不使用服务数组【英文标题】:CoreBluetooth: scanForPeripheralsWithServices not working with service array 【发布时间】:2014-11-27 09:37:46 【问题描述】:我正在为 ios (SWIFT) 开发一个 BLE 应用程序,但我发现了一个奇怪的行为。我的测试有 2 个控制器,一个具有 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 台应用程序无法找到彼此(但 LightBlue 应用程序和类似应用程序会,因此设备正在发射)
另一方面,如果我将代码更改为:
cManager.scanForPeripheralsWithServices(nil, options: nil)
我的应用程序运行良好,两个设备可以相互通信。但同时我不能只过滤发出 TRANSFER_SERVICE_UUID 的设备。我不想连接到所有找到的外围设备搜索 TRANSFER_SERVICE_UUID .. 这不是正确的方法吗?我错过了什么吗??
【问题讨论】:
【参考方案1】:蓝牙广告区只有有限的空间,所以iOS不会自动广告所有服务——一个设备可能有一个主要服务和几个补充服务。当只需要发现主要服务以识别候选设备时,宣传所有服务是一种浪费。
为了能够发现scanForPeripheralsWithServices
中的服务,您需要在广告数据中包含该服务。
这是通过将服务的 UUID 包含在您传递给 CBPeripheralManager.startAdvertising
的字典中来完成的 -
pManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey:[TRANSFER_SERVICE_UUID]])
【讨论】:
有效!!!你让我今天一整天都感觉很好! :-) 非常感谢您的解释!我还有一个问题.. 当我将 TRANSFER_SERVICE_UUID 添加到广告数据中时,服务 UUID 已经“丢失”了所有特征并且对我的工作变得无法使用(Lightblue 和我的应用程序都不再在“DidDiscoverServices”中看到该服务)..是正常的 ??我已经解决了使用 2 个不同的 UUID,一个用于广告数据中的“识别”部分..另一个用于“工作转移服务”..但是正确的方法是什么?再次感谢! 不,这听起来不对。我的应用在 Obj-C 中,但它做广告,我可以用 LightBlue 读取特征 好的,谢谢,那我再调查一下!再次感谢!以上是关于CoreBluetooth:scanForPeripheralsWithServices 不使用服务数组的主要内容,如果未能解决你的问题,请参考以下文章
CoreBluetooth:在 CBPeripheralStateConnecting 中的 didDisconnectPeripheral 回调