繁体   English   中英

未调用 BLE 外设委托

[英]BLE Peripheral delegate not called

我最近从 Swift 3 升级到 Swift 4,从 iOS 10.3.3 升级到 iOS 11.1。

我正在开发一个使用 BLE 进行双向通信的应用程序。 工作流程如下:

  1. 外围设备 - 广告标识
  2. 中央 - 接收身份(处理它...)
  3. CENTRAL - 响应外围设备
  4. 外围设备 - 从中​​央接收响应
  5. 完成

我的代码在更新之前运行良好,但现在不是。 在第 4 步结束时,我执行以下行:

peripheral.writeValue(encryptedData!, for: characteristic, type: .withResponse)

这应该调用以下委托方法,但它没有:

public func peripheral(_ peripheral: CBPeripheral, didWriteValueFor descriptor: CBDescriptor, error: Error?) {
        print("Did Write")
        print("Error=\(error?.localizedDescription)")
    }

它还应该(并且正在调用)外围设备上的以下委托方法,但它没有:

public func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveWrite requests: [CBATTRequest]) {
        print("did receive write request")
}

服务和特性设置如下:

let prefs = Preferences()
            let strServiceUUID = prefs.GetString(key: Preferences.PREF_IDENTITY_SERVICE_UUID, defaultVal: "")!
            let strCharacteristicUUID = prefs.GetString(key: Preferences.PREF_IDENTITY_CHARACTERISTIC_UUID, defaultVal: "")!
            print("ServiceUUID=\(strServiceUUID)")
            print("CharacteristicUUID=\(strCharacteristicUUID)")
            mServiceUUID = CBUUID(string: strServiceUUID)
            mCharacterUUID = CBUUID(string: strCharacteristicUUID)
            mCBBluetoothServices = CBMutableService(type: mServiceUUID, primary: true)
            
            //lets configure the data we want to advertise for
            var characteristics : [CBCharacteristic] = []
            
            //let strData : String = "933911"
            //let data = strData.data(using: .utf8)
            let cbProperties: CBCharacteristicProperties = [.read, .write, .notify]
            let cbPermissions: CBAttributePermissions = [.readable, .writeable]
            mIdentityObjectCharacteristic = CBMutableCharacteristic(type: mCharacterUUID,
                                                                    properties: cbProperties,
                                                                    value: nil,
                                                                    permissions: cbPermissions)
            
            
            characteristics.append(mIdentityObjectCharacteristic)
            mCBBluetoothServices.characteristics = characteristics
            mCBPeripheralManager.add(mCBBluetoothServices)

我不确定为什么升级操作系统和 Swift 版本会破坏您的代码,但是,在我看来,您可能使用了错误的委托方法?

尝试使用这个

func peripheral(CBPeripheral, didWriteValueFor: CBCharacteristic, error: Error?)

而不是这个

func peripheral(CBPeripheral, didWriteValueFor: CBDescriptor, error: Error?)

斯威夫特 4

对于任何类型的更新特性(例如读/写特性),将调用didUpdateValueFor委托。

因此,首先检查以下委托方法。

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    
    print("didUpdateValueForChar", characteristic)
    
    if let error1 = error{
        
        alertMSG(titleString: "Error", subTitleString: "Found error while read characteristic data, Plase try again", buttonTitle: "OK")
        
        print(error1)
    }
    else{
        
        print("Update Characteristic: ", characteristic)
    }
}

func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
    
    print("Write Characteristic :", characteristic)
}

斯威夫特 5
iOS 13

要检查的一些事项:

  1. 确保将外围设备的delegate设置为符合CBPeripheralDelegate协议的控制器(这也应该是需要实现peripheral(_:didWriteValueFor:error:)方法的控制器)。
  2. 确保您没有指定.withoutResponse写入类型。
  3. 正如另一个答案所提到的,有两个非常相似的委托方法具有签名peripheral(_:didWriteValueFor:error:) 确保您正在实施正确的。

很容易混淆 2 组写入和委托方法。

由于您正在使用:

 peripheral.writeValue(encryptedData!, for: characteristic, type: .withResponse)

写和委托对的代码应该是这样的:

class BluetoothController: CBCentralManagerDelegate, CBPeripheralDelegate {

    ...
   
    func writeSomething(to characteristic: CBCharacteristic, of peripheral: CBPeripheral) {
        let something = "1234"
        
        NSLog("Writing \(something) to \(characteristic.uuid.uuidString)")
        
        peripheral.delegate = self  // <===== You may have forgotten this?
        peripheral.writeValue(something.data(using: .utf8)!,
                              for: characteristic,
                              type: .withResponse)
    }

    ...

    func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
        if error != nil {
            NSLog("Write error: \(String(describing: error))")
        } else {
            NSLog("Wrote value to \(characteristic.uuid.uuidString)")
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM