Я могу отправить данные до 20 байтов, подключившись к внешнему устройству BLE. Как отправить данные размером более 20 байт. Я прочитал, что мы должны либо фрагментировать данные, либо разделять их на нужные части. Если я предполагаю, что мои данные составляют 32 байта, не могли бы вы сказать мне изменения, которые мне нужно внести в мой код, чтобы заставить это работать? Ниже приведены необходимые фрагменты из моего кода:
public boolean send(byte[] data) {
if (mBluetoothGatt == null || mBluetoothGattService == null) {
Log.w(TAG, "BluetoothGatt not initialized");
return false;
}
BluetoothGattCharacteristic characteristic =
mBluetoothGattService.getCharacteristic(UUID_SEND);
if (characteristic == null) {
Log.w(TAG, "Send characteristic not found");
return false;
}
characteristic.setValue(data);
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
return mBluetoothGatt.writeCharacteristic(characteristic);
}
Это код, который я использовал для отправки данных. Функция "отправить" используется в следующем событии onclick.
sendValueButton = (Button) findViewById(R.id.sendValue);
sendValueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = dataEdit.getText().toString();
yableeService.send(text.getBytes());
}
});
Когда String text
больше 20 байтов, тогда принимаются только первые 20 байтов. Как исправить это?
Чтобы проверить отправку нескольких характеристик, я пробовал это:
sendValueButton = (Button) findViewById(R.id.sendValue);
sendValueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = "Test1";
yableeService.send(text.getBytes());
text = "Test2";
yableeService.send(text.getBytes());
text = "Test3";
yableeService.send(text.getBytes());
}
});
Но я получил только "Test3", т.е. последний признак. Какую ошибку я совершил? Я новичок в BLE, поэтому, пожалуйста, игнорируйте любую наивность
Edit:
После принятия ответа для тех, кто рассматривает это позже.
Есть два способа два.
1. Разделите свои данные и напишите в цикле, как это сделал выбранный ответ.
2. Разделите свои данные и напишите с помощью обратного вызова, т.е. onCharacterisitcWrite()
. Это избавит вас от ошибок, если они были во время написания.
Но самый важный между write использует Thread.sleep(200)
, если вы только пишете и не дожидаетесь ответа от прошивки. Это обеспечит достижение всех ваших данных. Без sleep
я всегда получал последний пакет. Если вы заметили принятый ответ, он также использовал sleep
между ними.