2017-08-02 7 views
0

Ich mache eine lange schreiben zu einem BLE für ein OTA-Update, aber ich muss auf die Schreibantwort des BLE-Geräts für das Senden von mehr Daten warten, aber ich weiß nicht, wie zu fangen die Vorrichtung zum schreiben einer Antwort, ich bin mit einem Samsung galaxy tab s2 mit android 7 und Kotlin für meinen CoderxAndroidBle bekommen lange Antwort schreiben

override fun otaDataWrite(data:ByteArray) { 
    manager.connection?.flatMap { rxBleConnection: RxBleConnection? -> rxBleConnection?.createNewLongWriteBuilder() 
      ?.setCharacteristicUuid(OTACharacteristics.OTA_DATA.uuid) 
      ?.setBytes(data) 
      ?.setMaxBatchSize(totalPackages) 
      ?.build() 
    }?.subscribe({ t: ByteArray? -> 
     Log.i("arrive", "data ${converter.bytesToHex(t)}") 
     manageOtaWrite() 
    }, { t: Throwable? -> t?.printStackTrace() }) 

jedes Mal, wenn ich die Eigenschaft, schreiben die Abonnements reagieren mich sofort mit den geschriebenen Daten, ich brauche capture die Antwort des Merkmals, um mehr Daten zu senden

+0

nicht wirklich eine Antwort auf Ihre Frage, aber Sie sollten wirklich nicht lange schreiben, wenn Sie schnell viele Daten schreiben müssen. Verwenden Sie stattdessen Schreiben ohne Antwort, da der Durchsatz so viel höher ist. – Emil

+0

Leonardo - 1. '.setMaxBatchSize()' ist zum Einstellen der maximalen Anzahl von Bytes, die in einem Paket gesendet werden können und 'totalPackages' scheinen die Anzahl der zu sendenden Pakete zu sein. 2. Was genau sind die' totalPackages'? 3. Denken Sie bei der "Geräteschreibantwort" an eine Benachrichtigung aus einem bestimmten Merkmal oder nur an die Bestätigung des Peripheriegeräts, dass es ein einzelnes Paket erhalten hat? @Emil - Ist es möglich, dich in irgendeiner Weise zu kontaktieren? –

+0

Sicher .. War es etwas Besonderes, über das du reden wolltest? Ich denke, am einfachsten ist es, einfach einen Stack-Overflow-Chat zu starten. – Emil

Antwort

0

Sie schreiben über die Antwort aus dem Merkmal - ich nehme an, dass das Merkmal ref er ist derjenige mit UUID=OTA_DATA. Das Long Write besteht aus kleinen internen Schreibvorgängen (sogenannten Batches).

Was Sie wahrscheinlich erreichen wollen, ist so etwas wie:

fun otaDataWrite(data: ByteArray) { 
    manager.connection!!.setupNotification(OTA_DATA) // first we need to get the notification on to get the response 
      .flatMap { responseNotificationObservable -> // when the notification is ready we create the long write 
       connection.createNewLongWriteBuilder() 
         .setCharacteristicUuid(OTA_DATA) 
         .setBytes(data) 
//      .setMaxBatchSize() // -> if omitted will default to the MTU (20 bytes if MTU was not changed). Should be used only if a single write should be less than MTU in size 
         .setWriteOperationAckStrategy { writeCompletedObservable -> // we need to postpone writing of the next batch of data till we get the response notification 
          Observable.zip(// so we zip the response notification 
            responseNotificationObservable, 
            writeCompletedObservable, // with the acknowledgement of the written batch 
            { _, writeCompletedBoolean -> writeCompletedBoolean } // when both are available the next batch will be written 
          ) 
         } 
         .build() 
      } 
      .take(1) // with this line the notification that was set above will be discarded after the long write will finish 
      .subscribe(
        { byteArray -> 
         Log.i("arrive", "data ${converter.bytesToHex(byteArray)}") 
         manageOtaWrite() 
        }, 
        { it.printStackTrace() } 
      ) 
} 
+0

Hallo sorry für die Verzögerung, ich arbeitete in anderen Teilen des Projekts, y testen Sie Ihren Code heute, aber ich bekomme diesen Fehler 'BleCannotSetCharacteristicNotificationException {bluetoothGattCharacteristic = 984227f3-34fc-4045-a5d0-2c581f81a153, Grund = CANNOT_FIND_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR' –

+0

Also anscheinend Ihre Das 'OTA_DATA'-Merkmal unterstützt entweder keine Benachrichtigungen oder es hat nicht den' Client Characteristic Config Descriptor', der gegen die Bluetooth-Spezifikation verstoßen würde (wenn es Benachrichtigungen unterstützt). In beiden Fällen müssen Sie angeben, welches Verhalten Ihr Peripheriegerät aktualisieren muss, da es momentan sehr wahrscheinlich ist. –

+0

ist korrekt das OTA_DATA Merkmal unterstützt keine Benachrichtigungen, und das Merkmal gehört zu einem Silicon Labs OTA-Dienst, und ich habe keine Kontrolle über diesen Dienst, ist ein Standard-Service in meinem Peripheriegerät –

Verwandte Themen