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)")
我在 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)")