发现的 UUID 与使用 nRFConnect 检查的 UUID 不匹配

Discovered UUIDs do not match the UUIDs inspected with nRFConnect

我正在使用 scanForPeripherals 方法从我附近的设备检索 UUID。

我能够列出 UUID,但是,它们与使用 nRF Connect 应用程序发现的 UUID 不相似。我尝试了各种测试场景,其中我为外围设备配置了一个特定的 UUID(在另一个应用程序中,安装在不同的 phone 上)并尝试使用我的代码发现它,但这也被证明是不成功的(是的, nRF Connect 设法看到正确的 UUID)。

请看这个简化版的代码:

class ViewController: UIViewController {
    var centralManager      : CBCentralManager!
    var peripherals         : [CBPeripheral] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //Initialise CoreBluetooth Central Manager
        centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main)
    }
}

extension ViewController: CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if (central.state == .poweredOn){
            self.centralManager?.scanForPeripherals(withServices: nil, options: nil)
        }
        else {
            // do something like alert the user that ble is not on
        }
    }
    
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        peripherals.append(peripheral)
        print(peripheral.identifier.uuidString)
    }
}

我想知道为什么 UUID 看起来不同,我该怎么做才能发现与 nRF Connect 相同的 UUID。

BLE 设备本身通常没有 UUID。 CBPeripheral.identifier 是由 OS 创建的内部标识符,仅供内部使用。您要查找的 UUID 是一个服务 UUID,它可能通过广告数据包获得,也可能只能通过发现获得。 (广告数据包中不应该有无法通过发现获得的 UUID,但就在上周,我 运行 进入了一个固件有问题的设备,所以这 可能 .)

如果正在公布服务 UUID,那么您可以将扫描限制为仅包含该 UUID 的设备,方法是将其传递给 scanForPeripherals。这是首选的扫描方式。您可以使用 CBAdvertisementDataServiceUUIDsKey 键从 advertisementData 字典中获取广告服务列表。

如果该服务未公布,则您需要致电 discoverServices。当 didDiscoverServices 被回调时,您会在 peripheral.services 属性.

中找到服务列表