Каналы CoreBluetooth / L2CAP, не работают - PullRequest
0 голосов
/ 11 января 2019

Я недавно немного экспериментировал с CoreBluetooth, и теперь я хочу использовать каналы L2CAP.

Для этого я установил два приложения для iOS, одно из которых является периферийным, а другое - центральным.

На этом этапе, когда я запускаю их, вот что я вижу в консоли отладки Xcode.

На периферийной стороне я получаю это:

peripheralManager(_:didAdd:error:)
peripheralManager(_:didPublishL2CAPChannel:error:)
PSM: 192
peripheralManagerDidStartAdvertising(_:error:)

На центральной стороне я получаю это:

centralManagerDidUpdateState
centralManager(_:didDiscover:advertisementData:rssi:)
centralManager(_:didConnect:)
peripheral(_:didOpen:error:)
2019-01-11 ....] [CoreBluetooth] WARNING: Unknown error: 431

Вопрос: Что я делаю не так, чтобы получить это плохо выглядящее сообщение?

И позже: что мне нужно добавить к этому коду для фактической передачи данных между центральным терминалом и терминалом. Например, отправьте сообщение: « Привет, мир! С новым годом. »

Я использую Xcode Version 10.1 с Swift 4.2.

И ниже соответствующий исходный код.

Для периферийных устройств:

import UIKit
import CoreBluetooth

class ViewController: UIViewController,CBPeripheralManagerDelegate {
    let service_UUID = CBUUID(string:"9869B57E-2005-492B-8ED9-B5716886975F"),
    svcCharac_UUID = CBUUID(string:"BC7E600D-1AE4-4B09-BAC2-ECC0E85247E0")
    var cbPerifMngr:CBPeripheralManager!, mutaSRVC:CBMutableService!,
    svcCharac:CBMutableCharacteristic!

    override func viewDidLoad() {
        super.viewDidLoad()
        cbPerifMngr = CBPeripheralManager(delegate: self, queue: nil)
    }


    // CBPeripheralManagerDelegate protocol implementation.

    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        if peripheral.state == .poweredOn {
            mutaSRVC = CBMutableService(type: service_UUID, primary: true)
            svcCharac = CBMutableCharacteristic(type: svcCharac_UUID,
                                                      properties: [.read, .notify],
                                                      value: Data(base64Encoded: "Hello!"), permissions: .readable)
            mutaSRVC.characteristics = [svcCharac]
            cbPerifMngr?.add(mutaSRVC)

            cbPerifMngr?.publishL2CAPChannel(withEncryption: false)
        }
    }


    func peripheralManager(_ peripheral: CBPeripheralManager,
                           didPublishL2CAPChannel PSM: CBL2CAPPSM,
                           error: Error?) {
        print(#function)
        if error != nil {
            print("Error in \(#function) :\n\(error!)")
            return
        }

        print("PSM: \(PSM)")
    }


    func peripheralManager(_ peripheral: CBPeripheralManager, didAdd service: CBService, error: Error?) {
        print(#function)
        if error != nil {
            print("Error in \(#function) :\n\(error!)")
            return
        }

        cbPerifMngr.startAdvertising([CBAdvertisementDataServiceUUIDsKey:[service.uuid]])
    }


    func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?) {
        print(#function)
        if error != nil {
            print("Error in \(#function) :\n\(error!)")
            return
        }
    }
}

Для центрального:

import UIKit
import CoreBluetooth

class ViewController: UIViewController,CBCentralManagerDelegate,CBPeripheralDelegate {
    let service_UUID = CBUUID(string:"9869B57E-2005-492B-8ED9-B5716886975F")
    var cbCenterMngr:CBCentralManager!, cbPerifHandle:CBPeripheral!,
    cbL2CAPChan:CBL2CAPChannel!

    override func viewDidLoad() {
        super.viewDidLoad()
        cbCenterMngr = CBCentralManager(delegate: self, queue: nil)
    }


    // CBCentralManagerDelegate protocol implementation.

    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        print(#function)
        if central.state == .poweredOn {
            central.scanForPeripherals(withServices: [service_UUID],
                                       options: nil)
        }
    }


    func centralManager(_ central: CBCentralManager,
                        didDiscover peripheral: CBPeripheral,
                        advertisementData: [String : Any],
                        rssi RSSI: NSNumber) {
        print(#function)
        peripheral.delegate = self
        cbPerifHandle = peripheral
        central.connect(peripheral, options: nil)
    }


    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        print(#function)
        peripheral.openL2CAPChannel(192)
    }


    func peripheral(_ peripheral: CBPeripheral,
                    didOpen channel: CBL2CAPChannel?,
                    error: Error?) {
        print(#function)
        if error != nil {
            print("Error in \(#function) :\n\(error!)")
            return
        }

        cbL2CAPChan = channel
    }
}
...