在macOS上使用CoreBluetooth进行扫描时,外围设备名称为nil

时间:2020-05-23 15:10:14

标签: swift macos core-bluetooth

当我在macOS应用程序中运行以下代码时-许多外围设备都没有名称-但是当我在同一台计算机上打开“蓝牙首选项”时,我可以看到它们的名称。

扫描蓝牙设备以获取其名称时,我缺少什么步骤?

import Foundation
import CoreBluetooth

class Scanner: NSObject, CBPeripheralDelegate, CBCentralManagerDelegate {
    var centralManager: CBCentralManager?

    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        switch (central.state) {
           case .poweredOn:
            print("BLE Powered On - scanning")
            centralManager?.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])
            break
        default:
            print("Unknown Case")
        }
    }

    internal func centralManager(_ central: CBCentralManager,
        didDiscover peripheral: CBPeripheral,
        advertisementData: [String : Any],
        rssi RSSI: NSNumber)
    {
        print("discovered: \(peripheral.name ?? "nil")")
    }

    func start() {
        print("starting central manager")
        centralManager = CBCentralManager(delegate: self, queue: nil)
    }
}

1 个答案:

答案 0 :(得分:0)

外围设备可以使用两个名称,一个用于广告,一个用于GAP,请尝试同时使用两个名称(或任何存在的名称),如下所示:

internal func centralManager(_ central: CBCentralManager,
    didDiscover peripheral: CBPeripheral,
    advertisementData: [String : Any],
    rssi RSSI: NSNumber)
{
    print("advertised: \(advertisementData[CBAdvertisementDataLocalNameKey] as? String ?? "nil")")
    print("GAP name: \(peripheral.name ?? "nil")")
}

您还可以使用CBPeripheralDelegate通过回调观察名称更新

    @available(iOS 6.0, *)
    optional func peripheralDidUpdateName(_ peripheral: CBPeripheral)

某些设备可能会延迟报告。