Corebluetooth 使用 Swift 获取设备名称

Corebluetooth to fetch device names using Swift

我在 iOS 应用程序中使用 CoreBluetooth 框架来扫描并连接到其他蓝牙设备。我能够使用以下代码成功扫描设备:

var centralManager: CBCentralManager?
var peripherals = [CBPeripheral]()
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)

在 CBCentralManagerDelegate 中,我实现了以下代码:

extension ViewController: CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if (central.state == .poweredOn){
            self.centralManager?.scanForPeripherals(withServices: nil, options: nil)
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

        if !peripherals.contains(peripheral) {
            let localName = advertisementData[CBAdvertisementDataLocalNameKey]
            print("\(String(describing: localName))" )
            peripherals.append(peripheral)
            tableView.reloadData()            
        }
    }
}

从上面的代码来看,localName 始终为 nil。我缺少任何代码吗?

要添加更多信息,
当我在 Mac 中扫描蓝牙设备时,我能够看到设备的名称。但是,当我在 iPhone 上扫描蓝牙设备时,会列出其中 none 个。

我交叉检查并确保我在另外 4 台设备上启用了蓝牙(iPad、2 台 Android 电话和 1 台 Android 电视)

我在您的代码中更改了名称的唯一来源 - 而不是:

let localName = advertisementData[CBAdvertisementDataLocalNameKey]

我使用:

let localName = peripheral.name

现在我看到了周围的 BLE 设备名称。

Swift 带有核心蓝牙库:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){

    let peripheralLocalName_advertisement = ((advertisementData as NSDictionary).value(forKey: "kCBAdvDataLocalName")) as? String

    if (((advertisementData as NSDictionary).value(forKey: "kCBAdvDataLocalName")) != nil)

         print(peripheralLocalName_advertisement)//peripheral name from advertismentData

         print(peripheral.name)//peripheral name from peripheralData

         peripherals.append(peripheral) 

         arrayPeripheral.append(advertisementData)
    }
}

我在您的代码中更改了名称的唯一来源 - 而不是:

let localName = advertisementData[CBAdvertisementDataLocalNameKey]

我使用:

let localName = peripheral.name

现在我看到了周围的 BLE 设备名称。

不幸的是,didDiscoverPeripheral 回调可以 return nil CBPeripheral 名称以及 advertisementData 的本地名称用于您的应用程序的第一个回调开始扫描后获取。

如果您知道您正在使用的外围设备 在蓝牙广告数据包中包含一个本地名称,您可以选择忽略包含 [= =12=] 名字.

// In didDiscoverPeripheral
guard let peripheralName = peripheral.name else { return }
print("Did discover peripheral: \(peripheralName), RSSI: \(RSSI)")