我正在尝试检测 macOS 上连接的 BT 设备的电池电量。虽然我可以让 CBCentralManager 检测附近的一些设备,但它检测到的所有设备都是 name=Null,即使有许多设备应该被检测到并且应该有名称(例如,AirPods、magic trackpad、magic keyboard 等)。
我的 BT Manager 类是:
import Cocoa
import CoreBluetooth
class BluetoothManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
var centralManager = CBCentralManager()
var peripheralManager = CBPeripheralManager()
var discoveredPeripherals:[CBPeripheral]?
var selectedPeripheral:CBPeripheral?
let queue = DispatchQueue.main
let batteryLevelService = [CBUUID(string: "0x2A19")]
override init() {
self.centralManager = CBCentralManager(delegate: nil, queue: queue)
super.init()
centralManager.delegate = self
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
switch central.state {
case .poweredOff:
print("BLE is powered off")
case .poweredOn:
print("BLE is powered on")
centralManager.scanForPeripherals(withServices: nil)
case .resetting:
print("BLE is resetting")
case .unauthorized:
print("BLE is not authorized")
case .unknown:
print("BLE state is unknown")
case .unsupported:
print("BLE is unsupported")
default:
print("Unable to determine BLE state")
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print(peripheral)
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
// Code Here
}
}
我将该类分配给主 ViewController 类中的一个对象。
我通常希望控制台显示附近可发现的设备以及已连接的设备。然而,我得到的只是:
<CBPeripheral: 0x600003508b00, identifier = C9A74282-A40C-46C1-9C2F-9646D2BCE8B5, name = (null), state = disconnected>
<CBPeripheral: 0x600003500840, identifier = 1EF2CD7F-8FAA-4510-A7DB-B4E060B2378B, name = (null), state = disconnected>
<CBPeripheral: 0x600003500a50, identifier = 1EF2CD7F-8FAA-4510-A7DB-B4E060B2378B, name = (null), state = disconnected>
<CBPeripheral: 0x600003508b00, identifier = BA372C81-993F-436D-994E-B31BDAB47BC7, name = (null), state = disconnected>
最佳答案
并非所有设备都宣传其名称。广告包中的空间非常小(~30 字节),如果有其他更重要的内容要广告,名称可能不适合。单个自定义服务最多可使用 16 个字节。如果不连接,您可能无法确定名称。即使那样,设备也可能没有 BLE 名称。
I would normally have expected the console to show nearby discoverable devices as well as already-connected devices.
我不确定您为什么期望这样。 scanForPeripherals
返回有关广告设备的信息。设备在连接时停止广播是很常见的(设备仅支持单个连接很常见)。如果您想查看已连接的设备,请调用 retrieveConnectedPeripherals
。
关于swift - 为什么 CBCentralmanager 发现的所有设备的 name=null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57834868/