Corebluetooth使用Swift获取设备名称

时间:2017-08-27 18:37:00

标签: ios swift core-bluetooth

我在我的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上扫描蓝牙设备时,它们都没有列出。

我交叉检查并确保我在另外4台设备上启用了蓝牙(iPad,2部Android手机和1部Android TV)

3 个答案:

答案 0 :(得分: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)
    }
}

答案 1 :(得分:0)

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

let localName = advertisementData[CBAdvertisementDataLocalNameKey]

我用:

let localName = peripheral.name

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

答案 2 :(得分:0)

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

let localName = advertisementData[CBAdvertisementDataLocalNameKey]

我使用:

let localName = peripheral.name

现在我可以看到BLE设备的名称。