SwiftUI - 当我在蓝牙中扫描设备时选择特定服务

Posted

技术标签:

【中文标题】SwiftUI - 当我在蓝牙中扫描设备时选择特定服务【英文标题】:SwiftUI - Choose a specific service when I scan a device in Bluetooth 【发布时间】:2020-05-02 20:43:59 【问题描述】:

扫描设备时选择特定服务

我做了一个程序,我想在其中扫描具有特定服务的设备(我的设备是温度计“SHT31”,服务是电池服务“UUID:180F”)但是当我在我的 iPhone 上运行这个程序时,它不会扫描设备。而当“withServices:nil”时,它会扫描设备。你有解决办法吗?

我的代码:

import CoreBluetooth

 class BLEConnection: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate 
    var centralManager: CBCentralManager!
    var myPeripheral: CBPeripheral!
    let batteryServiceCBUUID = CBUUID(string: "0x180F")

    func startCentralManager() 
        self.centralManager = CBCentralManager(delegate: self, queue: nil)
    

    func centralManagerDidUpdateState(_ central: CBCentralManager) 
        switch (central.state) 
           case .unsupported:
            print("BLE is Unsupported")
            break
           case .unauthorized:
            print("BLE is Unauthorized")
            break
           case .unknown:
            print("BLE is Unknown")
            break
           case .resetting:
            print("BLE is Resetting")
            break
           case .poweredOff:
            print("BLE is Powered Off")
            break
           case .poweredOn:
            print("BLE powered on")
            central.scanForPeripherals(withServices: [batteryServiceCBUUID], options: nil)
            break
        @unknown default:
            break
        
    

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) 
        if let pname = peripheral.name 
//            print(pname)

            if pname == "Smart Humigadget" 
                self.centralManager.stopScan()
                self.myPeripheral = peripheral
                self.myPeripheral.delegate = self
                self.centralManager.connect(peripheral, options: nil)
                print("\(pname) is connected")
            
        
    
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) 
        self.myPeripheral.delegate = self
        self.myPeripheral.discoverServices(nil)
    

【问题讨论】:

【参考方案1】:

使用以下格式(不需要十六进制前缀)

    let batteryServiceCBUUID = CBUUID(string: "180F")

【讨论】:

我尝试了您建议的线路,但仍然无法扫描设备。 @MxM,这是正确的 id 声明,您确定您的设备宣传的正是这项服务吗? ,我有关于设备详细信息的文件:“sensirion.com/fileadmin/user_upload/customers/sensirion/…”。当“withServices: nil”时它会扫描设备,但是当我使用 CBUUID(string: "180F") 或 CBUUID(string: "180A") 时它不会扫描设备。我觉得这很奇怪。 @MxM,也许这个设备没有电池服务的名称,你没有进入if let pname = peripheral.name 条件。您是否尝试在回调的第一行设置断点或在开头添加打印日志? 我认为我的设备无法做到这一点,非常感谢您的帮助。

以上是关于SwiftUI - 当我在蓝牙中扫描设备时选择特定服务的主要内容,如果未能解决你的问题,请参考以下文章

如何自动选择列表中的项目?

蓝牙 LE 不扫描设备

使用 hcitool 扫描蓝牙低功耗?

使用核心蓝牙 ios 扫描外围设备时如何更改特征顺序

如何使用核心蓝牙 sdk 扫描蓝牙设备?

如何从python获取蓝牙扫描信息? RPi3