Как сделать дамп последовательной связи в виде файла через Android Bluetooth последовательный RFCOMM - PullRequest
0 голосов
/ 26 марта 2019

Мое приложение для Android получает последовательную связь по Bluetooth из настольного приложения.Я не контролирую, что делает это настольное приложение.

Использование примера кода Google BluetoothChat (https://github.com/googlesamples/android-BluetoothChat). Мне удается заставить его работать, и в некоторой степени я могу просто забрать байты, поступающие на мой андроидприложение и написать файл.

Однако функция кода выглядит примерно так:

1 - прослушивание Android

2 - отправка данных с ПК, прием данных Android с подключением, чтение и запись вfile

3 - во время чтения Android обнаруживает исключение (клиент закрывает соединение?) и закрывает соединение

4 - возвращается к одному и прослушивает следующие несколько байтов

Моя проблемаявляется то, что мне нужно знать, когда этот процесс заканчивается, чтобы обработать файл и отобразить некоторый результат в пользовательском интерфейсе.

Код этого файла

https://github.com/googlesamples/android-BluetoothChat/blob/master/Application/src/main/java/com/example/android/bluetoothchat/BluetoothChatService.java

Специально

    public void run() {
        Log.i(TAG, "BEGIN mConnectedThread");
        byte[] buffer = new byte[1024];
        int bytes;

        // Keep listening to the InputStream while connected
        while (mState == STATE_CONNECTED) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);

                // ==> This is where I wrote to file
                // ==> Standard Android Java code to write 
                // ==> to output file stream

                // Send the obtained bytes to the UI Activity
                // ==> Commented out because this can not be done here
                // ==> NEED TO BE DONE WHEN ALL DATA IS READ
                // mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)
                //      .sendToTarget();
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
        }
    }

Ожидается, что в Android RFCOMM или Bluetooth Communication должен быть способ указать, что клиент уже завершил отправку всех сообщений.

Ранее я пытался использовать IoException как место, чтобы сигнализировать пользовательскому интерфейсу, что чтение данных с ПК завершено.Это катастрофа, потому что по какой-то причине исключения происходят только в начале общения.И я понятия не имею, почему мои коды все еще продолжают записывать в файл.

Я повторю, что у меня нет никакого контроля над приложением для ПК / ПК.Поэтому, пожалуйста, не предлагайте ничего, что затрагивало бы изменение работы настольного приложения или отправку данных.

Необходимо справиться с этим на стороне Android.

1 Ответ

0 голосов
/ 26 марта 2019

Вы никогда не можете быть уверены, что дальний конец завершил отправку данных, которые он хотел отправить, если у вас нет правил и / или какого-то протокола, и вы не начинаете анализировать полученные данные на вашей стороне.

Добавьте / создайте простой протокол с заголовком и полем длины, который позволит вам получать и, кроме того, знать, чего ожидать в вашей петле получения.

Как правило; никогда не предполагайте, что вы получите целый пакет за одно чтение. Вместо этого буферизуйте полученные данные и разрешите многократное чтение, прежде чем вы сможете обработать их и извлечь полные «пакеты», которые соответствуют вашей спецификации.

...