Swift 3核心蓝牙无法发现服务

5
我正在尝试从我连接到的BLE设备中发现服务,但是当我的didDiscoverServices函数被调用时,周边服务数组为空。应用程序连接到设备,运行peripheral.discoverServices(nil),然后didDiscoverServices函数被调用,但没有返回服务。我已经阅读了许多关于蓝牙的答案和其他在线示例,据我所知,我的代码应该没有什么不同,除了它不能工作。我觉得我一定错过了什么地方,但我不确定是什么。我在下面添加了我的控制台日志,以及参考的蓝牙代码。
Bluetooth initialised
BLE is powered on
Optional("Nordic_Blinky") found at -72
Scanning stopped
Connect request sent
Connected to <CBPeripheral: 0x1c0301a70, identifier = 0887CF7F-98C8-3FCF-2D10-873FFFFB2B65, name = Nordic_Blinky, state = connected>
Discovering services
Services -- Optional([]) and Error -- nil

我的BluetoothHandler类代码如下:
class BluetoothHandler : NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {

// MARK: Properties
var manager: CBCentralManager!
var targetPeripheral: CBPeripheral!


// MARK: Shared Instance
static let sharedInstance = BluetoothHandler()
private override init() {
    super.init()
    self.startManager()
    print("Bluetooth initialised")
}

// MARK: Functions

func startManager() {
    manager = CBCentralManager(delegate: self, queue: nil)
}

func centralManagerDidUpdateState(_ central: CBCentralManager) {

    var consoleMessage = ""
    switch (central.state) {

    case.poweredOn:
        consoleMessage = "BLE is powered on"
        manager.scanForPeripherals(withServices: nil, options: nil)

    case.poweredOff:
        consoleMessage = "BLE is powered off"

    case.resetting:
        consoleMessage = "BLE Resetting"

    case.unknown:
        consoleMessage = "BLE state unknown"

    case.unsupported:
        consoleMessage = "Device not supported by BLE"

    case.unauthorized:
        consoleMessage = "BLE not authorised"
    }
    print("\(consoleMessage)")

}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

    if (peripheral.name == "Nordic_Blinky") {

        print("\(String(describing: peripheral.name)) found at \(RSSI)")
        self.stopScan()

        if targetPeripheral != peripheral {

            targetPeripheral = peripheral
            targetPeripheral!.delegate = self

            manager.connect(targetPeripheral, options: nil)
            print("Connect request sent")
        }

    }

    else if (peripheral.name != nil) {
        print("\(String(describing: peripheral.name))")
    }
}

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    print("Connected to \(peripheral)")
    peripheral.delegate = self
    peripheral.discoverServices(nil)
    print("Discovering services")
}

func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Any) {
    print("Connection failed", error)
}

func centralManager(_ central: CBCentralManager, didDisconnect peripheral: CBPeripheral) {

    if self.targetPeripheral != nil {
        self.targetPeripheral!.delegate = nil
        self.targetPeripheral = nil
    }
    print("Connection disconnected")
    self.startManager()
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
    print("Services -- \(peripheral.services) and Error -- \(error)")

    if let services = peripheral.services {
        for service in services {
            peripheral.discoverCharacteristics(nil, for: service)
        }
    }
}

像BlueLight.app这样的应用程序是否发现服务? - Larme
@Larme 是的,一个安卓应用程序已经连接并获取了设备上的所有服务。 - AdamDWalker
iOS 上也有 BlueLight.app 吗? - Larme
@Larme,它没有显示iOS版本的服务,但我不确定它是否可能缓存了任何内容,因此在明天或可能是周一之前,我将无法使用“干净”的iOS设备进行测试。 - AdamDWalker
如果iOS上的LightBlue应用程序没有显示任何服务,则问题出在外设上。这里没有涉及缓存。 - Paulw11
显示剩余2条评论
1个回答

0
尝试这个:swift 3
如果您的外围设备(BLE设备)有服务,则在日志中打印。
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {

    if let services = peripheral.services as [CBService]!{

        for service in services{

            peripheral.discoverCharacteristics(nil, for: service)
        }
    }
    print("==>",peripheral.services!)
}

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {

    for newChar: CBCharacteristic in service.characteristics!{

        print(newChar)
    }
}

1
我已经尝试将服务打印到日志中,但是由于没有服务,它只会打印一个空数组(请参见代码和控制台日志)。 - AdamDWalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接