Мое приложение зависит от служб Fore Ground, и у меня есть собственные команды для связи между BLE, так как оно работает также положительно, связь между BLE также в фоновом потоке. Android ОС 6 и выше, поскольку я сейчас тестирую в ОС 10. И проблема в том, что когда я непрерывно пишу команды и читаю данные из onCaharacteristi c, через несколько минут одна команда получит без ответа, здесь ... когда Я вызываю любую команду, кроме того, что получен беспорядок данных. Это означает, что как ранее вызванная команда, так и новая, оба ответа принимаются одновременно, я думаю, что ранее вызванный ответ команды застрял где-то, после чего мне нужно отключиться и снова нужно подключиться для следующий действительный ответ ... я борюсь за это, так как 2 месяца до сих пор нет решения, есть ли кто-нибудь знает, что это за проблема, пожалуйста, поделитесь. мое приложение работает круглосуточно, поэтому мне нужно надежное взаимодействие BLE с приложением.
Я использую библиотеку Telit IO для связи BLE.
это пример кода
if (this._peripheral.isConnected()) {
dataCollection = "";
this._peripheral.writeUARTData(commandGetNext.getBytes("CP-1252"));
STTrace.method("Get Next command called...");
Log.v(TAG, "GetNextData() , getnext called --------------------------------------------");
if (handlerGetNext != null)
handlerGetNext.removeCallbacksAndMessages(null);
// this thread is for collecting and validating json data
Runnable getNextDataRunnable = new Runnable() {
public void run() {
if (isJSONValid(dataCollection.trim())) {
wait = 0;
STTrace.method("Logs", "**** Call Get Next Save Method ******");
handlerGetNext.removeCallbacksAndMessages(null);
SaveRepoRawDataData(dataCollection.trim());
} else {
if (!dataCollection.equals("") && dataCollection.toLowerCase().startsWith("{\"batchid\"")) {
if (wait <= 2) {
wait++;
handlerGetNext.postDelayed(this, 5000); //5 sec
} else {
wait = 0;
if (!dataCollection.trim().equals(""))
cannotReadBatchFileError();
Log.v(TAG, "GetNextData() -------------------------------------------- " + dataCollection);
getNextCheckBluetoothEnable();
}
} else if (dataCollection.trim().toLowerCase().equals("")) {
handleEmptyResponse();
} else if (dataCollection.toLowerCase().trim().equals("{}")) {
scheduleGetNextAlarm(105000); // 1:45
} else {
Log.v(TAG, " GetNextData() DataCollection without batchId = " + dataCollection);
countAndDisconnect();
}
}
}
};
handlerGetNext.postDelayed(getNextDataRunnable, 16000);// 16 sec
waitUntil = true;
Log.v(TAG, " GetNextData() is Scheduled for 16 seconds");
} else {
Log.v(TAG, "!this._peripheral.isConnected() - executed ----------------------------------------------");
//connecting to Device
reConnectBLE();
}
здесь я собираю ответ
@Override
public void tioPeripheralDidReceiveUARTData(TIOPeripheral peripheral, byte[] data) {
try {
String output = byteArrayToString(data);
dataCollection = dataCollection + output.trim();
} catch (Exception ex) {
STTrace.error("Error in receiving data " + ex.getMessage());
globalClass.SaveErrorLog("BatchRawData-tioPeripheralDidReceiveUARTData", ex.getMessage());
ex.printStackTrace();
}
}