我用这个功能在我身边扫描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。
答案 0 :(得分:0)
根据您的硬件信标所宣传的信标格式,可能无法使用CoreBluetooth 进行检测。 CoreBluetooth可以检测Eddystone格式和AltBeacon格式,但无法检测到iBeacon格式。
要理解几点:
Beacon格式不一定包含GATT服务UUID,这是您在使用代码行centralManager.scanForPeripherals(withServices: serviceUUIDs ...
时要过滤的内容。虽然Eddystone广告确实包含服务UUID,但iBeacon和AltBeacon不会,因为它们是一种不同类型的BLE广告,称为制造商广告。只有GATT广告才有服务UUID。
Eddystone格式使用FEAA服务UUID,您可以使用您描述的技术来过滤此信标类型。
您只能在没有serviceUUID过滤器的情况下检测AltBeacon广告,因为它没有。
你可以从不使用CoreBluetooth检测iBeacon,因为Apple有特殊的代码过滤器阻止他的API接收这些广告。您别无选择,只能在iOS上使用CoreLocation进行iBeacon检测。
许多信标硬件制造商还包括一些具有自己的服务UUIDS的补充GATT服务。这些服务执行配置或添加操作等功能。但这些与信标功能无关,并且无法知道这些服务UUID何时(如果有的话)被广告,以及它们是什么意思。这些UUID绝对会与一个灯塔制造商不同。 LightBlue检测到的服务UUID可能是补充服务,因此它们对解决此问题毫无帮助。
结论:没有简单的方法可以使用CoreBluetooth仅过滤您想要的信标。您最好的办法是在CoreBluetooth上编写自己的过滤软件,然后忽略您不关心的数据包。