Problem z pobieraniem osobno danych przez Bluetooth

0

Witam, potrzebuję pomocy z metodą pobrania danych przez Bluetooth. Otóż poniższy kod jest jak najbardziej prawidłowy natomiast zwraca mi po kolei każdą daną osobno z Arduino, a potrzebuję je wszystkie pod jedną zmienną tj:

Taki dostaję teraz wynik:
09-14 0114.962 17243-17243/com.example.maciej.arduino I/ContentValues: 24.125
09-14 0115.373 17243-17243/com.example.maciej.arduino I/ContentValues: 24.250
09-14 0115.486 17243-17243/com.example.maciej.arduino I/ContentValues: 24.437

A chciałbym coś takiego:
................................ 17243-17243/com.example.maciej.arduino I/ContentValues: 24.12524.25024.437

Moja metoda:

void PobierzDane()
    {
        final Handler handler = new Handler();
        stopThread = false;
        buffer = new byte[1024];
        Thread thread  = new Thread(new Runnable()
        {
            public void run()
            {
                while(!Thread.currentThread().isInterrupted() && !stopThread)
                {
                    try
                    {
                        int byteCount = inputStream.available();
                        if(byteCount > 0)
                        {
                            byte[] rawBytes = new byte[byteCount];
                            inputStream.read(rawBytes);

                            final String string = new String(rawBytes,"UTF-8");

                            handler.post(new Runnable() {
                                public void run()
                                {
                                    Log.i(TAG, string);
                                    sensorView.setText(string);
                                }
                            });
                        }
                    }
                    catch (IOException ex)
                    {
                        stopThread = true;
                    }
                }
            }
        });
        thread.start();
    }

Chciałbym w osobnych TextView wyświetlić wynik z czujników i wymyśliłem sobie to w ten sposób, że mając taką zmienną będę mógł za pomocą metody substring takie coś uzyskać.
Mniej więcej tak to bym widział

public void run()
{
String sensor0 = recDataString.substring(1, 5);               	
String sensor1 = recDataString.substring(6, 10);                	

sensorView0.setText(" Czujnik 0  = " + sensor0);
sensorView1.setText(" Czujnik 1  = " + sensor1);
}

Nie mogę sobie z tym poradzić. Z góry dziękuję za pomoc.

1

każdy socket czy to jest TCP czy Bluetooth nie daje ci gwarancji, podziału na konkretne bloki.
Czyli jeśli nadawca wysyła dane w jednym kawałku, możesz je otrzymać w kilku i odwrotnie:
Nadawca może wysłać kilka kawałków osobno, a ty otrzymasz je w jednym kawałku.
Ergo ten kawałek kodu final String string = new String(rawBytes,"UTF-8"); może zakończyć się wyjątkiem, bo krawędź otrzymanego bloku danych może wystąpić w połowie znaku UTF-8 (u ciebie nie ma wyjątku, bo wysyłasz znaki zawsze zakresu ASCII, więc nie ma możliwości podzielnia znaku UTF-8).

Twój kod odbierający musi mieć możliwość ustalenia kiedy kończy się wiadomość.
Może to być np znak końca linii '\n' (którego najwyraźniej nadawca nie dostarcza).
W takim wypadku masz sklejać dane do kupy, aż napotkasz znak końca linii i z tego generować napis, a pozostałość dołączać do następnej wiadomości.

Moja rada podziel ten kod na mniejsze kawałki, rozdziej komunikację od modelu danych oraz UI-a (z tego kodu powinny wyjść co najmniej 3 klasy o różnej odpowiedzialności).

0

Akurat teraz nie mam możliwości pokazać kodu, natomiast wiadomość kończy się po znaku #.

0
MarekR22 napisał(a):

każdy socket czy to jest TCP czy Bluetooth nie daje ci gwarancji, podziału na konkretne bloki.
Czyli jeśli nadawca wysyła dane w jednym kawałku, możesz je otrzymać w kilku i odwrotnie:
Nadawca może wysłać kilka kawałków osobno, a ty otrzymasz je w jednym kawałku.
Ergo ten kawałek kodu final String string = new String(rawBytes,"UTF-8"); może zakończyć się wyjątkiem, bo krawędź otrzymanego bloku danych może wystąpić w połowie znaku UTF-8 (u ciebie nie ma wyjątku, bo wysyłasz znaki zawsze zakresu ASCII, więc nie ma możliwości podzielnia znaku UTF-8).

Twój kod odbierający musi mieć możliwość ustalenia kiedy kończy się wiadomość.
Może to być np znak końca linii '\n' (którego najwyraźniej nadawca nie dostarcza).
W takim wypadku masz sklejać dane do kupy, aż napotkasz znak końca linii i z tego generować napis, a pozostałość dołączać do następnej wiadomości.

Moja rada podziel ten kod na mniejsze kawałki, rozdziej komunikację od modelu danych oraz UI-a (z tego kodu powinny wyjść co najmniej 3 klasy o różnej odpowiedzialności).

Dzięki za wskazówki, ponieważ pomogło. Sprawdziłem koniec wiadomości za pomocą .indexOf("#"); i to wszystko do StringBuilder i mam co chciałem. Dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1