L2CAP Канал передачи данных

Я работаю над разработкой приложения BLE с использованием ориентированного на соединение канала. Я использую Nordic Semiconductor NRF52 в качестве периферийного устройства и iPhone 6 в качестве центрального менеджера.

Я использовал предопределенное значение PSM, предоставленное Bluetooth SIG, которое составляет 0x0025. Я могу подключиться к периферийному устройству и открыть канал L2CAP успешно.

Я получаю ниже ошибки:

** [CoreBluetooth] ВНИМАНИЕ: неизвестная ошибка: 436

2018-06-08 10: 03: 17.532709-0400 BluetoothTest [407: 62057] [CoreBluetooth] ** Не известен ни один из сопоставляющих канал партнеров с psm 37****

Пожалуйста, дайте мне знать, как действовать и что означает код ошибки 436.

Ниже мой код:

   func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        //handling callback when a peripheral is discover
        print("Central Manager PowerOn State Check:\(central.state.rawValue)")
        if (peripheral.name?.contains("Nordic_OTSX") == true)
       {
            print(peripheral.name ??  "no name")
            print("advertisement Data : \(advertisementData) ")
            central.connect(peripheral, options: nil )
            myPeripheral = peripheral
       }
    }


    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)
    {
        print("didConnect\(myPeripheral.debugDescription)")
        myPeripheral.delegate = self
        myPeripheral.discoverServices(nil)
    }
    //if error while making connection
    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?)
    {
        print("error:\(error.debugDescription)")
    }

    //after opening L2CAP Channel
   func peripheral(_ peripheral: CBPeripheral, didOpen channel: CBL2CAPChannel?, error: Error?)
    {
        print("didOpen")
        print(error.customMirror)
        print(channel!.outputStream.debugDescription)
        print(channel!.inputStream.debugDescription)
        print(channel?.outputStream.hasSpaceAvailable)
    }


    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?)
    {
        print("*******************************************************")

        if ((error) != nil) {
            print("Error discovering services: \(error!.localizedDescription)")
            return
        }

        guard let services = peripheral.services else {
            return
        }
        //We need to discover the all characteristic
        for service in services {

            peripheral.discoverCharacteristics(nil, for: service)
            // bleService = service
        }
        print("Discovered Services: \(services)")
    }


    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?)
    {
        print("*******************************************************")
        if let charcterstics = service.characteristics
        {
            print("characteristics :")
            for char in charcterstics
            {
               /* if char.uuid == buttonCharacteristicUUID
                {
                    buttonCharacteristic = char
                    enableButtonNotifications(buttonCharacteristic!)
                    readButtonValue()
                }*/
                print(char.uuid.uuidString)
            }
        }
         peripheral.openL2CAPChannel(0x0025)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

2 ответа

У меня была похожая проблема. Мне удается решить эту проблему, создав переменную для сохранения "channel: CBL2CAPChannel?"в функции

func peripheral(_ peripheral: CBPeripheral, didOpen channel: CBL2CAPChannel?, error: Error?)

Я только спасалchannel.outputStream", который был единственным, что мне было нужно. Но, похоже, если вы не сохраните его, он будет закрыт.

0x25 PSM для ОТС. Вам нужен ATT PSM, который является 0x1F

Другие вопросы по тегам