swift - 为什么 CBCentralmanager 发现的所有设备的 name=null?

标签 swift macos bluetooth core-bluetooth cbcentralmanager

我正在尝试检测 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/

相关文章:

ios - 我可以从后台线程调用或运行 Core Data Main Context (viewContext) 吗?

ios - 在 iOS swift 中音乐结束时播放下一首歌曲

ios - SpriteKit忘记了一个对象的值

swift - 代码在 Xcode 8 中不起作用

linux - 在PiTooth.py程序中从第二个终端配对后,另一个终端中的程序仍然是 "waiting for connection"

iOS 广告间隔(iPhone 作为外设)

java - 为什么在使用 objectInputStream.readObject() 反序列化后我的对象的字段设置为默认值?

ios - 通用 RawRepresentable 协议(protocol)属性

swift - 如何禁用 MAC 应用程序的 UI 交互

windows - 从 PHPmyadmin 从 Windows 到 Mac 的数据库