【问题标题】:Corebluetooth to fetch device names using SwiftCorebluetooth 使用 Swift 获取设备名称
【发布时间】:2018-02-05 01:58:27
【问题描述】:

我在我的 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 总是为零。我错过了任何代码吗?

要添加更多信息,
当我在我的 Mac 中扫描蓝牙设备时,我可以看到设备的名称。但是当我在 iPhone 上扫描蓝牙设备时,它们都没有列出。

我反复检查并确保我在另外 4 台设备(iPad、2 部 Android 手机和 1 部 Android 电视)上启用了蓝牙

【问题讨论】:

  • 在执行peripherals.append(peripheral) 之前检查advertisementData[CBAdvertisementDataLocalNameKey] 是否存在。问题是广告包可以一块一块地做(由于大小限制),完整的广告在后面。
  • 谢谢@Larme,我会加上那张支票。我从 iTunes 中探索了一些其他应用程序,所有这些应用程序都显示标识符而不是名称。是不是无法在 iOS 中获取设备名称?

标签: ios swift core-bluetooth


【解决方案1】:

带有核心蓝牙库的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)
    }
}

【讨论】:

    【解决方案2】:

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

    let localName = advertisementData[CBAdvertisementDataLocalNameKey]

    我用:

    let localName = peripheral.name

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

    【讨论】:

    • 我也试过了。对我来说 peripheral.name 也是 nil
    • 只是说...这是一条不同的信息。 “peripheral.name”来自物理设备本身(例如 Raspberry Pi 的名称或其他名称),而 Local Name 是 BLE 广告的参数。
    【解决方案3】:

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

    let localName = advertisementData[CBAdvertisementDataLocalNameKey]
    

    我用:

    let localName = peripheral.name
    

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

    【讨论】:

      【解决方案4】:

      不幸的是,didDiscoverPeripheral 回调可以为 CBPeripheral 名称返回 nil,并且还可以为您的应用在开始扫描后获得的第一个回调返回 advertisementData 的本地名称。

      如果您知道您正在使用的外围设备在蓝牙广告数据包中包含一个本地名称,您可以选择忽略第一个包含nil 名称的回调。

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

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多