如何使用CoreBluetooth仅扫描信标

时间:2018-03-06 15:39:31

标签: swift ibeacon core-bluetooth

我用这个功能在我身边扫描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。

1 个答案:

答案 0 :(得分:0)

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

要理解几点:

  1. Beacon格式不一定包含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可能是补充服务,因此它们对解决此问题毫无帮助。

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