如何使用CoreBluetooth仅扫描信标

问题描述 投票:2回答:1

我用这个功能在我身边扫描BLE,但收到太多信号。我只想使用来自信标的信号。

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    centralManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(value: true)])
}

I had used LightBlue发现我的灯塔有5项服务:180A,FFA0,FFB0,FFF0和180F。

然后我尝试了这个代码,但没有找到这个服务的外围设备。

let serviceUUIDs = [CBUUID(string: "FFA0")]

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    centralManager.scanForPeripherals(withServices: serviceUUIDs, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(value: true)])
}

并且didDiscover方法从未调用过

func centralManager(_ central: CBCentralManager,
                    didDiscover peripheral: CBPeripheral,
                    advertisementData: [String : Any],
                    rssi: NSNumber)
{
    if peripheral.name == "MY_BEACON_NAME" {
        print("peripheral: \(peripheral)")
        print("rssi = \(rssi)")
    }
}

我做错了什么?

P. S.我不能在这个项目中使用CoreLocation,只能使用CoreBluetooth。

swift ibeacon core-bluetooth
1个回答
0
投票

根据硬件信标所宣传的信标格式,可能无法使用CoreBluetooth进行检测。 CoreBluetooth可以检测Eddystone格式和AltBeacon格式,但它无法检测到iBeacon格式。

有几点需要了解:

  1. 信标格式不一定包括GATT服务UUID,这是您在使用代码行centralManager.scanForPeripherals(withServices: serviceUUIDs ...时要过滤的内容。虽然Eddystone广告确实包含服务UUID,但iBeacon和AltBeacon不会,因为它们是一种不同类型的BLE广告,称为制造商广告。只有GATT广告才有服务UUID。
  2. Eddystone格式使用FEAA服务UUID,您可以使用您描述的技术来过滤此信标类型。
  3. 您只能在没有serviceUUID过滤器的情况下检测AltBeacon广告,因为它没有。
  4. 你永远无法使用CoreBluetooth检测iBeacon,因为Apple有特殊的代码过滤器阻止他的API接收这些广告。您别无选择,只能在iOS上使用CoreLocation进行iBeacon检测。
  5. 许多信标硬件制造商还包括一些具有自己的服务UUIDS的补充GATT服务。这些服务执行配置或添加操作等功能。但这些与信标功能无关,并且无法知道这些服务UUID何时(如果有的话)被广告,以及它们是什么意思。这些UUID绝对会与一个灯塔制造商不同。 LightBlue检测到的服务UUID可能是补充服务,因此它们对解决这个问题根本没有帮助。

结论:没有简单的方法可以使用CoreBluetooth仅过滤您想要的信标。您最好的办法是在CoreBluetooth上编写自己的过滤软件,然后忽略您不关心的数据包。

© www.soinside.com 2019 - 2024. All rights reserved.