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 回调

CoreBluetooth 限制?

CoreBluetooth 发现外设广告数据格式

CoreBluetooth:无法发现已发现外围设备的特征

CoreBluetooth 用于信标

CoreBluetooth 框架是不是支持请求 Blob 读取?