如何从BLE搜索查询中排除某些设备?

时间:2018-06-06 09:57:15

标签: swift macos bluetooth core-bluetooth

我正在编写自定义蓝牙连接器,我希望搜索查询与mac os中的标准蓝牙应用程序完全相同。我怎样才能做到这一点?我使用CoreBluetooth和IOBluetooth框架来实现这一目标,但获得包括电视等在内的各种设备。

docs我了解到我希望在

中提供特定服务
.scanForPeripherals(withServices: [CBUUID], options: nil)
但是有什么服务?我还找到了默认的Xcode蓝牙连接器,但它没有包含源代码。

现在我的代码是:

let cbuuids = [CBUUID(string: "0x180A"), CBUUID(string: "0x1801"), CBUUID(string: "0x1800"), CBUUID(string: "0x1812")]

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    switch central.state {
    case .poweredOn:
        print("powered on")
        central.scanForPeripherals(withServices: cbuuids, options: nil)
    case .unknown:
        print("state unknown")
    case .resetting:
        print("resetting")
    case .unsupported:
        print("unsupported")
    case .unauthorized:
        print("unauthorized")
    case .poweredOff:
        print("powered off")
    }
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    print(peripheral.name)
    devices.append(peripheral)
    devices = devices.unique

    tableView.reloadData()
    scrubber.reloadData()

}

我正在将搜索查询加载到触控栏的滑块,但这不是重点。

有没有办法匹配标准应用中的原始设备列表?任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

您的代码看起来不错,但

let cbuuids = [CBUUID(string: "0x180A"), CBUUID(string: "0x1801"), CBUUID(string: "0x1800"), CBUUID(string: "0x1812")]

您是否包含默认UUID,例如 0x180A 设备信息服务 我认为它包含在所有设备广告中。

因此,当您使用此UUID进行搜索时,所有设备都会出现在发现中。 阅读更多关于Gatt服务的here

因此,解决方案是仅在搜索中添加用户定义的自定义服务UUID。

另请注意,UUID必须包含在您尝试在搜索中找到的设备的广告数据包中。 您可以阅读有关广告数据here

的更多信息