Почему setMaxBatchSize () бесполезен для большего MTU в RxAndroidBle? - PullRequest
0 голосов
/ 22 апреля 2019

Я хочу передать данные на устройство через BLE. Количество байтов составляет 64 на передачу.

Теперь проблема в том, что, когда я изменяю MTU через setMaxBatchSize (ex 64), mRxBleConnection.getMtu () возвращает MTU по умолчанию (23).

    private void connect(RxBleDevice rxBleDevice){

         connectionObservable = rxBleDevice.establishConnection(false)
                .subscribe(rxBleConnection -> {

                    mRxBleConnection = rxBleConnection;
                    rxBleConnection.setupNotification(MainActivity.MY_UUID);
                    longWrite();

                });


    }
    private void longWrite(){
           mRxBleConnection.setupNotification(MainActivity.MY_UUID)
                .flatMap(ob -> ob.merge(
                        mRxBleConnection.createNewLongWriteBuilder()
                                .setCharacteristicUuid(MainActivity.MY_UUID)
                                .setBytes(HexString.hexToBytes(writeData))
                                .setMaxBatchSize(64)
                                .build(),ob)
                )

        .subscribe(bytes -> {
            Log.i(TAG,mRxBleConnection.getMtu());

            doResponse(HexString.bytesToHex(bytes));

        },throwable -> {

        });
    }
  1. Попробуйте другой способ RxBleConnection.requestMtu (int)
Disposable writeSubscription = mRxBleConnection.requestMtu(176)
                .subscribe(
                        integer -> {
                            Log.i(TAG, "longWrite: "+integer);
                        },
                        throwable ->{

                        }

                );

Бревно

04-22 16:30:58.895 9435-9494/com.example.write D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
04-22 16:30:59.642 9435-9494/com.example.write D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=7 device=50:8C:B1:6A:F9:34
04-22 16:30:59.671 9435-9532/com.example.write D/BluetoothGatt: configureMTU() - device: 50:8C:B1:6A:F9:34 mtu: 176
04-22 16:31:00.035 9435-9494/com.example.write D/BluetoothGatt: onConnectionUpdated() - Device=50:8C:B1:6A:F9:34 interval=6 latency=0 timeout=500 status=0
04-22 16:31:00.347 9435-9494/com.example.write D/BluetoothGatt: onConfigureMTU() - Device=50:8C:B1:6A:F9:34 mtu=23 status=0

МТУ всегда будет 23.

1 Ответ

0 голосов
/ 22 апреля 2019

Ответ на вопрос из темы - см. Ниже

LongWriteOperationBuilder.setMaxBatchSize() Javadoc:

/**
* Setter for a maximum size of a byte array that may be write at once
* If this is not specified - the default value of the connection's MTU is used
*
* @param maxBatchSize the maximum size of a byte array to write at once
* @return the LongWriteOperationBuilder
*/

Если .setMaxBatchSize() не указано, используется значение, полученное из MTU.Это один из способов.Это не говорит о том, что установка этого свойства меняет MTU.

Кроме того, поскольку вы пытались установить другое значение MTU, в журналах можно увидеть, что новое значение не было принято - периферийное устройство, с которым вы хотите связаться, не позволяет его.

...