Corebluetooth使用Swift获取设备名称

问题描述:

我在我的iOS应用程序中使用CoreBluetooth框架来扫描并连接到其他蓝牙设备。我能够成功地扫描使用下面的代码设备:Corebluetooth使用Swift获取设备名称

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台设备与

+0

检查'advertisementData [CBAdvertisementDataLocalNameKey]''做peripherals.append(外围)'之前就存在。问题是广告数据包可以一个一个完成(由于限制的大小),并且完整的广告稍后出现。 – Larme

+0

谢谢@Larme,我会添加该支票。我从iTunes中探索了一些其他应用程序,他们都显示标识符而不是名称。是不是可以获取iOS设备的名称? – Satyam

我在你的代码只是名字的来源改变了我(的iPad,2个Android手机和1的Android TV) - 而不是:

let localName = advertisementData[CBAdvertisementDataLocalNameKey]

我用:

let localName = peripheral.name

,现在我看到的名字我身边的BLE设备。

+0

我也尝试过。对于我而言,peripheral.name也是零 – Satyam

夫特3与芯蓝牙库:

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) 
    } 
}