rxAndroidBleは長い書き込み応答を得ます

私は、OTAアップデートを行うためにBLEに長い書き込みをしていますが、より多くのデータを送信するためにBLEデバイスの書き込み応答を待つ必要がありますが、デバイスの書き込み応答を受け取る方法がわかりません。私のコードのためにアンドロイド7とサムスンの銀河タブS2とコトリンを使用して

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() })

特性を書き込むたびに、購読は書き込まれたデータですぐに応答します。さらにデータを送信するには、特性の応答を取り込む必要があります。

0
確かにそれはあなたが話をしたかった何か特別なことでしたか?一番簡単な方法は、スタックオーバーフローチャットを開始することです。
追加された 著者 Emil,
確かにそれはあなたが話をしたかった何か特別なことでしたか?一番簡単な方法は、スタックオーバーフローチャットを開始することです。
追加された 著者 Emil,
確かにそれはあなたが話をしたかった何か特別なことでしたか?一番簡単な方法は、スタックオーバーフローチャットを開始することです。
追加された 著者 Emil,
あなたの質問に対する答えではありませんが、大量のデータを高速で書き込む必要がある場合は、ロングライトを使用しないでください。代わりに、応答のない書き込みを使用すると、スループットが大幅に向上します。
追加された 著者 Emil,
@ LeonardoFuenmayor - 私の解決策はあなたのために働きましたか?
追加された 著者 Dariusz Seweryn,
@ LeonardoFuenmayor - 私の解決策はあなたのために働きましたか?
追加された 著者 Dariusz Seweryn,
@ LeonardoFuenmayor - 私の解決策はあなたのために働きましたか?
追加された 著者 Dariusz Seweryn,
BluetoothGattCharacteristic 設定に応じて( WRITE_TYPE_DEFAULT WRITE_TYPE_NO_RESPONSE .onCharacteristicWrite()はリモート周辺機器が受信したときに呼び出されますパケット(そのBLEスタックが送信の確認応答を送信したが、必ずしも既に処理されていない場合)またはローカルBLEスタックが送信用にキューに入れた場合ですから、おそらく処理後に特性によって送信される通知について考えているのでしょう。
追加された 著者 Dariusz Seweryn,
BluetoothGattCharacteristic 設定に応じて( WRITE_TYPE_DEFAULT WRITE_TYPE_NO_RESPONSE .onCharacteristicWrite()はリモート周辺機器が受信したときに呼び出されますパケット(そのBLEスタックが送信の確認応答を送信したが、必ずしも既に処理されていない場合)またはローカルBLEスタックが送信用にキューに入れた場合ですから、おそらく処理後に特性によって送信される通知について考えているのでしょう。
追加された 著者 Dariusz Seweryn,
BluetoothGattCharacteristic 設定に応じて( WRITE_TYPE_DEFAULT WRITE_TYPE_NO_RESPONSE .onCharacteristicWrite()はリモート周辺機器が受信したときに呼び出されますパケット(そのBLEスタックが送信の確認応答を送信したが、必ずしも既に処理されていない場合)またはローカルBLEスタックが送信用にキューに入れた場合ですから、おそらく処理後に特性によって送信される通知について考えているのでしょう。
追加された 著者 Dariusz Seweryn,
Leonardo - 1。 .setMaxBatchSize()は1つのパッケージで送信できる最大バイト数を設定するためのもので、 totalPackages は送信するパッケージの数と思われます2。 totalPackages とは一体何ですか? 3. device write response では、特定の特性からの通知か、それとも単一のパッケージを受け取ったことをペリフェラルから受信したことだけを考えていますか。 @エミール - あなたに連絡することは可能ですか?
追加された 著者 Dariusz Seweryn,
Leonardo - 1。 .setMaxBatchSize()は1つのパッケージで送信できる最大バイト数を設定するためのもので、 totalPackages は送信するパッケージの数と思われます2。 totalPackages とは一体何ですか? 3. device write response では、特定の特性からの通知か、それとも単一のパッケージを受け取ったことをペリフェラルから受信したことだけを考えていますか。 @エミール - あなたに連絡することは可能ですか?
追加された 著者 Dariusz Seweryn,
この承認はあなたの状況ではただの BluetoothGattCallback.onCharacteristicWrite()です - 正しいですか?確認して答えを書きましょう。
追加された 著者 Dariusz Seweryn,
この承認はあなたの状況ではただの BluetoothGattCallback.onCharacteristicWrite()です - 正しいですか?確認して答えを書きましょう。
追加された 著者 Dariusz Seweryn,
@DariuszSewerynはい setMaxBatchSize()メソッドの間違いに気付いたので、そのメソッドにdata.sizeを渡します。 OTAの更新のためのBLE)、および3はい私は私が他のパッケージを送るということに基づいて、それがパッケージを受け取ったという周辺機器からの承認が必要です
追加された 著者 Leonardo Fuenmayor,
@DariuszSewerynはい setMaxBatchSize()メソッドの間違いに気付いたので、そのメソッドにdata.sizeを渡します。 OTAの更新のためのBLE)、および3はい私は私が他のパッケージを送るということに基づいて、それがパッケージを受け取ったという周辺機器からの承認が必要です
追加された 著者 Leonardo Fuenmayor,
私は知っていますが、OTAアップデートのためのDFU特性です、私はそのIOSとあらゆる書き込みのための特性応答をします
追加された 著者 Leonardo Fuenmayor,
私は知っていますが、OTAアップデートのためのDFU特性です、私はそのIOSとあらゆる書き込みのための特性応答をします
追加された 著者 Leonardo Fuenmayor,
@DariuszSewerynこのメソッドは、特性を書き込むときに戻りますか、またはペリフェラルから書き込み応答が送られてくるときに捕捉しますか。
追加された 著者 Leonardo Fuenmayor,
@DariuszSewerynこんにちは、プロジェクトの他の部分で働いていました、今日のあなたのコードをテストしましたが、このエラーが発生する ‌ 2c581f81a153、理由= CANNOT_FIND_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR
追加された 著者 Leonardo Fuenmayor,
@DariuszSewerynこんにちは、プロジェクトの他の部分で働いていました、今日のあなたのコードをテストしましたが、このエラーが発生する ‌ 2c581f81a153、理由= CANNOT_FIND_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR
追加された 著者 Leonardo Fuenmayor,
@DariuszSewerynこんにちは、プロジェクトの他の部分で働いていました、今日のあなたのコードをテストしましたが、このエラーが発生する ‌ 2c581f81a153、理由= CANNOT_FIND_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR
追加された 著者 Leonardo Fuenmayor,
@DariuszSewerynこのメソッドは、特性を書き込むときに戻りますか、またはペリフェラルから書き込み応答が送られてくるときに捕捉しますか。
追加された 著者 Leonardo Fuenmayor,
@DariuszSewerynこのメソッドは、特性を書き込むときに戻りますか、またはペリフェラルから書き込み応答が送られてくるときに捕捉しますか。
追加された 著者 Leonardo Fuenmayor,

6 答え

あなたは特性からの反応について書いています - あなたが参照する特性は UUID = OTA_DATA を持つものであると私は思います。ロングライトは、内部的に小さな書き込み(いわゆるバッチ)で構成されています。

おそらくあなたが達成したいのは以下のようなものです。

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
追加された
ポイント5.4で説明されているバージョンのOTAを使用しているかどうかわからない OTA_UPLOAD silabs.com/documents/login/application-notes/… ですが、その場合は最初のコードが正しく動作しなかった理由がわかりません。周辺機器側からの ACK はありません。
追加された 著者 Dariusz Seweryn,
そのため、 OTA_DATA 特性が通知をサポートしていないか、Bluetooth仕様に違反する Client Characteristic Config Descriptor を持っていないようです(通知をサポートしている場合)。いずれにせよ、あなたは周辺機器がどのような振る舞いを更新する必要があるかを指定する必要があります。
追加された 著者 Dariusz Seweryn,
OTAプロセスの動作は、1つの特性OTA_CONTROlのみを持つOTAサービスというサービスがあり、その特性に0x00を書き込み、デバイスをDFUモードで再起動し、2つの特性OTA_CONTROL(書き込み)を持つOTAサービスを表示します。 (レスポンス付きで書き込み)、OTA_CONTROLに0x00を書き、後にlongWriterを使ってバイナリファイルの一部をOTA_DATAに書き込みます。これは、ライターのレスポンスを受け取るために(確認のように)待つ必要があるということです。ファイルの次の部分
追加された 著者 Leonardo Fuenmayor,
OTA_DATA特性は通知をサポートしておらず、その特性はSilicon labs OTAサービスに属しており、そのサービスを制御することはできません。これは私の周辺機器のデフォルトのサービスです。
追加された 著者 Leonardo Fuenmayor,
こんにちは、プロジェクトの他の部分で働いていたので、今日はあなたのコードをテストしましたが、このエラーが発生するのを待っています。 2c581f81a153、理由= CANNOT_FIND_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR
追加された 著者 Leonardo Fuenmayor,

あなたは特性からの反応について書いています - あなたが参照する特性は UUID = OTA_DATA を持つものであると私は思います。ロングライトは、内部的に小さな書き込み(いわゆるバッチ)で構成されています。

おそらくあなたが達成したいのは以下のようなものです。

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
追加された
ポイント5.4で説明されているバージョンのOTAを使用しているかどうかわからない OTA_UPLOAD silabs.com/documents/login/application-notes/… ですが、その場合は最初のコードが正しく動作しなかった理由がわかりません。周辺機器側からの ACK はありません。
追加された 著者 Dariusz Seweryn,
そのため、 OTA_DATA 特性が通知をサポートしていないか、Bluetooth仕様に違反する Client Characteristic Config Descriptor を持っていないようです(通知をサポートしている場合)。いずれにせよ、あなたは周辺機器がどのような振る舞いを更新する必要があるかを指定する必要があります。
追加された 著者 Dariusz Seweryn,
OTAプロセスの動作は、1つの特性OTA_CONTROlのみを持つOTAサービスというサービスがあり、その特性に0x00を書き込み、デバイスをDFUモードで再起動し、2つの特性OTA_CONTROL(書き込み)を持つOTAサービスを表示します。 (レスポンス付きで書き込み)、OTA_CONTROLに0x00を書き、後にlongWriterを使ってバイナリファイルの一部をOTA_DATAに書き込みます。これは、ライターのレスポンスを受け取るために(確認のように)待つ必要があるということです。ファイルの次の部分
追加された 著者 Leonardo Fuenmayor,
OTA_DATA特性は通知をサポートしておらず、その特性はSilicon labs OTAサービスに属しており、そのサービスを制御することはできません。これは私の周辺機器のデフォルトのサービスです。
追加された 著者 Leonardo Fuenmayor,
こんにちは、プロジェクトの他の部分で働いていたので、今日はあなたのコードをテストしましたが、このエラーが発生するのを待っています。 2c581f81a153、理由= CANNOT_FIND_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR
追加された 著者 Leonardo Fuenmayor,

あなたは特性からの反応について書いています - あなたが参照する特性は UUID = OTA_DATA を持つものであると私は思います。ロングライトは、内部的に小さな書き込み(いわゆるバッチ)で構成されています。

おそらくあなたが達成したいのは以下のようなものです。

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
追加された
ポイント5.4で説明されているバージョンのOTAを使用しているかどうかわからない OTA_UPLOAD silabs.com/documents/login/application-notes/… ですが、その場合は最初のコードが正しく動作しなかった理由がわかりません。周辺機器側からの ACK はありません。
追加された 著者 Dariusz Seweryn,
そのため、 OTA_DATA 特性が通知をサポートしていないか、Bluetooth仕様に違反する Client Characteristic Config Descriptor を持っていないようです(通知をサポートしている場合)。いずれにせよ、あなたは周辺機器がどのような振る舞いを更新する必要があるかを指定する必要があります。
追加された 著者 Dariusz Seweryn,
こんにちは、プロジェクトの他の部分で働いていたので、今日はあなたのコードをテストしましたが、このエラーが発生するのを待っています。 2c581f81a153、理由= CANNOT_FIND_CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR
追加された 著者 Leonardo Fuenmayor,
OTAプロセスの動作は、1つの特性OTA_CONTROlのみを持つOTAサービスというサービスがあり、その特性に0x00を書き込み、デバイスをDFUモードで再起動し、2つの特性OTA_CONTROL(書き込み)を持つOTAサービスを表示します。 (レスポンス付きで書き込み)、OTA_CONTROLに0x00を書き、後にlongWriterを使ってバイナリファイルの一部をOTA_DATAに書き込みます。これは、ライターのレスポンスを受け取るために(確認のように)待つ必要があるということです。ファイルの次の部分
追加された 著者 Leonardo Fuenmayor,
OTA_DATA特性は通知をサポートしておらず、その特性はSilicon labs OTAサービスに属しており、そのサービスを制御することはできません。これは私の周辺機器のデフォルトのサービスです。
追加された 著者 Leonardo Fuenmayor,

さて、多くのテストを経て、ついに私はandroid BLE APIを使ってOTAアップデート用のスタンドアロンクラスを開発しました。そしてそれをすべてのRxBleメソッドと一緒に使用しました。しかし、私は問題を解決します、どうもありがとう。

0
追加された

さて、多くのテストを経て、ついに私はandroid BLE APIを使ってOTAアップデート用のスタンドアロンクラスを開発しました。そしてそれをすべてのRxBleメソッドと一緒に使用しました。しかし、私は問題を解決します、どうもありがとう。

0
追加された

さて、多くのテストを経て、ついに私はandroid BLE APIを使ってOTAアップデート用のスタンドアロンクラスを開発しました。そしてそれをすべてのRxBleメソッドと一緒に使用しました。しかし、私は問題を解決します、どうもありがとう。

0
追加された