Почему после нескольких минут написания и чтения характеристик я получаю пустой ответ от `BLE`? - PullRequest
0 голосов
/ 12 марта 2020

Мое приложение зависит от служб 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();
    }
}
...