Android BLE 读取特性,当我读取数据(大)时,我只得到最后一部分。不是完整的数据。我该怎么做才能获得完整数据
Android BLE Read characteristic, When I read data(large) I get the last part only. Not the complete data. What can I do to get the full data
我正在以 20 字节块的形式向 BLE 设备发送数据。
我收到了很大的回应。
但是onCharacteristicRead
回调,我只得到最后一条数据。
byte[] messageBytes = characteristic.getValue();
if (messageBytes != null && messageBytes.length > 0) {
for(byte byteChar : messageBytes) {
stringBuilder.append((char)byteChar);
}
}
- 任何人都可以帮助理解我哪里出错了吗?
- 我是否也应该以块的形式读回数据?
- 如果是,怎么做?
Characteristic 的值在您每次写入时都会更新,这就是为什么当您读取时,它只反映最新值(您写入的最后一个值)。
要连续读取数据,需要先开启特征通知。
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 一次只能处理 1 个操作,如果在前一个操作未完成时执行另一个操作,它不会放入队列,但会 return false。
我正在以 20 字节块的形式向 BLE 设备发送数据。
我收到了很大的回应。
但是onCharacteristicRead
回调,我只得到最后一条数据。
byte[] messageBytes = characteristic.getValue();
if (messageBytes != null && messageBytes.length > 0) {
for(byte byteChar : messageBytes) {
stringBuilder.append((char)byteChar);
}
}
- 任何人都可以帮助理解我哪里出错了吗?
- 我是否也应该以块的形式读回数据?
- 如果是,怎么做?
Characteristic 的值在您每次写入时都会更新,这就是为什么当您读取时,它只反映最新值(您写入的最后一个值)。
要连续读取数据,需要先开启特征通知。
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 一次只能处理 1 个操作,如果在前一个操作未完成时执行另一个操作,它不会放入队列,但会 return false。