Android BLE Характеристики чтения c, Когда я читаю данные (большие), я получаю только последнюю часть. Не полные данные. Что я могу сделать, чтобы получить полные данные - PullRequest
0 голосов
/ 08 мая 2020

Я отправляю данные на устройство BLE в виде блоков по 20 байтов.
Я получаю большой ответ. Но onCharacteristicRead перезвоните, я получаю только последнюю часть данных.

byte[] messageBytes = characteristic.getValue();

if (messageBytes != null && messageBytes.length > 0) {
  for(byte byteChar : messageBytes) {
     stringBuilder.append((char)byteChar);
  }
}
  • Может ли кто-нибудь помочь понять, где я ошибаюсь?
  • Должен ли я считывать данные также как фрагменты?
  • Если да, то как?

1 Ответ

1 голос
/ 08 мая 2020
Значение

Characteristi c обновляется каждый раз, когда вы пишете в него, поэтому при чтении оно отражает только последнее значение (последнее, которое вы записали).

Для непрерывного чтения данных вы должен сначала включить уведомление о характеристиках.

    mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID_DESCRIPTOR);
    descriptor.setValue(enabled?BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
                             :BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
    mBluetoothGatt.writeDescriptor(descriptor);

Затем вы можете начать запись данных

            byte[] data = <Your data here>;
            BluetoothGattService Service = mBluetoothGatt.getService(UUID_TARGET_SERVICE);

            BluetoothGattCharacteristic charac = Service
            .getCharacteristic(UUID_TARGET_CHARACTERISTIC);

            charac.setValue(data);
            mBluetoothGatt.writeCharacteristic(charac);

Теперь каждый раз, когда вы пишете, клиентская сторона будет получать обратный вызов onCharactersticChanged, который содержит недавно обновленное значение (data). На самом деле вам не нужно вызывать операцию чтения.

Помните, что mBluetoothGatt может обрабатывать только одну операцию за раз, если вы выполняете другую, пока предыдущая не завершена, она не будет помещена в очередь, но вернет false.

...