BufferedReader/InputStreamReader/Split

  • 6 Antworten
  • Letztes Antwortdatum
dionysos

dionysos

Fortgeschrittenes Mitglied
24
Hallo zusammen,

ich möchte eine Android-App auf Basis von "BluetoothChat" realisieren.
https://developer.android.com/samples/BluetoothCha...

Konkret geht es um eine Mikrocontroller-Platine, die über ein
BTM222-Bluetooth-Modul mit einem Tablet kommunizieren soll.

Über Sensoren auf der Platine werden Messwerte aufgenommen und sollen
auf einem Tablet dargestellt werden.

Die Anzeige soll allerdings nicht als einfacher Fließtext erfolgen,
sondern die Messwerte sollen immer an einer bestimmten Stelle in der App
angezeigt werden.

Die Daten, die vom Mikrocontroller kommen, werden als ASCII-Zeichen in
folgender Form übertragen:

Sensorwert1;Sensorwert2;Sensorwert3;.../CR/LF

";" und "/CR/LF" sollen später als Terminatoren verwendet werden, um die
einzelnen Werte zu splitten.

Ich möchte nun in der Klasse BluetoothChatService mit einem
BufferedReader auf dem InputStreamReader mit readLine nach dem /CR/LF
jede übertragene Zeile abspeichern und per Message an die Klasse
BluetoothFragment weitergeben.

Da ich bisher kaum Erfahrungen mit Java bzw. App-Programmierung sammeln
konnte, wäre ich dankbar von euch hilfreiche Tips zubekommen, um das
zuvor beschriebene umszusetzen.

Die Daten werden im BluetoothChatService in folgenden Abschnitt
empfangen:

Code:
  [COLOR=#1F497D]public void run() {[/COLOR]
  [COLOR=#1F497D]            Log.i(TAG, "BEGIN mConnectedThread");[/COLOR]
  [COLOR=#1F497D]            byte[] buffer = new byte[1024];[/COLOR]
  [COLOR=#1F497D]            int bytes;[/COLOR]
  
  [COLOR=#1F497D]            // Keep listening to the InputStream while connected[/COLOR]
  [COLOR=#1F497D]            while (true) {[/COLOR]
  [COLOR=#1F497D]                try {[/COLOR]
  [COLOR=#1F497D]                    // Read from the InputStream[/COLOR]
  [COLOR=#1F497D]                    bytes = mmInStream.read(buffer);[/COLOR]
  
  [COLOR=#1F497D]                    // Send the obtained bytes to the UI Activity[/COLOR]
  [COLOR=#1F497D]                    mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)[/COLOR]
  [COLOR=#1F497D]                            .sendToTarget();[/COLOR]
  [COLOR=#1F497D]                } catch (IOException e) {[/COLOR]
  [COLOR=#1F497D]                    Log.e(TAG, "disconnected", e);[/COLOR]
  [COLOR=#1F497D]                    connectionLost();[/COLOR]
  [COLOR=#1F497D]                    // Start the service over to restart listening mode[/COLOR]
  [COLOR=#1F497D]BluetoothChatService.this.start();[/COLOR]
  [COLOR=#1F497D]                    break;[/COLOR]
  [COLOR=#1F497D]                }[/COLOR]
  [COLOR=#1F497D]            }[/COLOR]
  [COLOR=#1F497D]        }[/COLOR]
Vielen Dank im Voraus.
 
So sieht das doch schon ganz gut aus - man könnte fast sagen 95% der Arbeit sind gemacht :)
Du legst nun einfach ein paar TextViews an und updatest aus der Runnable den Inhalt.
String.split() eignet sich um die Werte zu trennen (aber das hast du ja auch schon im Titel-Thema geschrieben)
 
in Ordnung, also in etwa so:

Code:
try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);

                    
                    InputStreamReader ISR = new InputStreamReader(mmInStream);
                    BufferedReader BR = new BufferedReader(ISR);
                    String Sensordaten = BR.readLine();


                    ***



                    // Send the obtained bytes to the UI Activity
                    //mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)
                    mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                }
Nur wie Teile an an dieser (***) Stelle den Datenstrom? Mein Ansatz wäre Sensordaten.split("\r\n"); Nur wie speichere ich das ab, was ich erhalte? buffer erwartet ja ein byte und keinen String.
 
So wie du aus den bytes einen String machst, um diese zu verarbeiten, so musst du danach aus den Strings wieder bytes machen und kannst diese bytefolgen dann versenden (vmtl in einer Schleife). Die Konvertierung ginge wohl am einfachsten via String.getBytes(Charset)
 
  • Danke
Reaktionen: dionysos
okay, mein Ansatz ist nun folgender:

Code:
[COLOR=#000080][B]public void [/B][/COLOR]run() {
    Log.[I]i[/I]([COLOR=#660e7a][B][I]TAG[/I][/B][/COLOR], [COLOR=#008000][B]"BEGIN mConnectedThread"[/B][/COLOR]);
    [COLOR=#000080][B]byte[/B][/COLOR][] buffer = [COLOR=#000080][B]new byte[/B][/COLOR][[COLOR=#0000ff]1024[/COLOR]];
    [COLOR=#000080][B]int [/B][/COLOR]bytes;

    [COLOR=#808080][I]// Keep listening to the InputStream while connected
[/I][/COLOR][COLOR=#000080][B]while [/B][/COLOR]([COLOR=#000080][B]true[/B][/COLOR]) {
        [COLOR=#000080][B]try [/B][/COLOR]{
            [COLOR=#808080][I]// Read from the InputStream
[/I][/COLOR][COLOR=#808080][I]            //bytes = mmInStream.read(buffer);
[/I][/COLOR][COLOR=#808080][I]            //---------------------------------------------------
[/I][/COLOR][COLOR=#808080][I]            //NEU:
            [/I][/COLOR]InputStreamReader ISR = [COLOR=#000080][B]new   
               [/B][/COLOR]InputStreamReader([COLOR=#660e7a][B]mmInStream[/B][/COLOR]);
            BufferedReader BR = [COLOR=#000080][B]new [/B][/COLOR]BufferedReader(ISR);
            String Sensordaten = BR.readLine();
            String[] Sensorwerte = Sensordaten.split([COLOR=#008000][B]";"[/B][/COLOR]);
            String Sensorwert = Sensorwerte[[COLOR=#0000ff]0[/COLOR]];
            buffer = Sensorwert.getBytes( [COLOR=#008000][B]"UTF-8" [/B][/COLOR]);
            

            [COLOR=#808080][I]//---------------------------------------------------
[/I][/COLOR][COLOR=#808080][I]            // Send the obtained bytes to the UI Activity
               [/I][/COLOR][COLOR=#660e7a][B]mHandler[/B][/COLOR].obtainMessage(Constants.[COLOR=#660e7a][B][I]MESSAGE_READ[/I][/B][/COLOR], bytes, -[COLOR=#0000ff]1[/COLOR], buffer)
                    .sendToTarget();
        } [COLOR=#000080][B]catch [/B][/COLOR](IOException e) {
            Log.[I]e[/I]([COLOR=#660e7a][B][I]TAG[/I][/B][/COLOR], [COLOR=#008000][B]"disconnected"[/B][/COLOR], e);
            connectionLost();
            [COLOR=#808080][I]// Start the service over to restart listening mode
[/I][/COLOR]BluetoothChatService.[COLOR=#000080][B]this[/B][/COLOR].start();
            [COLOR=#000080][B]break[/B][/COLOR];
        }
    }
}
Das usrpüngliche "bytes = mmInStream.read(buffer);" habe ich ausskommentiert. Die Methode "mHandler.obtainMessage" benötigt allerdings diesen Wert.

Diese Methode übergibt die empfangenen Bytes an die grafische Oberfläche, mir ist dabei die Bedeutung von buffer und bytes jedoch nicht ganz klar.
 
buffer = new byte[1024] ist natürlich witzlos, wenn man nachher der Wert von buffer via getBytes() bekommt.

Und "bytes" wird nicht initialisiert, ich bezweifel, dass das Program so compiliert - da in Java es nicht erlaubt ist, eine uninitialisierte Variable als Parameter zu übergeben.

Was die Werte bei obtainMessage (-1, wieso Nachricht als byte[] und kein String, ...) so bedeuten, musst du in der Dokumentation des zuständigen Message Diensts nachlesen.

Nebenbei bemerkt: bitte bitte schreibe alle Variablennamen klein. Groß geschriebene Namen sind für Klassen bzw. Konstanten vorgesehen.
 
---dieser Beitrag war sinnlos---
 
Zurück
Oben Unten