Infos zum Bluetooth Buffer und dem Einlesen von Daten

  • Antworten:7
Peter Parker
  • Forum-Beiträge: 36

16.05.2014, 09:50:20 via Website

Hallo,
was hat das Android Gerät für einen Bluetooth Buffer? Also wenn ich die Daten über

bytes = mmInStream.read(buffer);
                byte[] readBuf = (byte[]) buffer;
                String strIncom = new String(readBuf, 0, bytes);

einlese, dann waren die Daten ja vorher in einem Android eigenen Buffer. Wie groß ist dieser?
Wenn ich permanent Daten schicke und nicht abrufe müsste der ja irgendwann überlaufen.

Die zweite Frage: Wenn ich die Daten anschließend auf einen Inhalt überprüfe mit

if (cmplStrIncom.contains("test")) {...}

und dem Gerät das Wort test schicke, dann reagiert es nicht immer. Woran liegt das?
Wenn ich zB nur t schicke funktioniert es immer.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 09:52:50 via Website

ich glaube eher, dass die Daten nachdem sie gesendet, empfangen wurden oder wenn etwaseues dazu kommt, dass dieser Buffer gelöscht wird.
Es ist ja sonst blöd, irgendwann würde der Buffer voll sein, also muss er irgendwann gelöscht werden.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Peter Parker
  • Forum-Beiträge: 36

16.05.2014, 10:09:10 via Website

Also nach jeder Nachricht oder wie?
Gibt es auch eine Quelle oder irgendwas wo man das vllt nachlesen könnte? Ich finde über gewisse Suchmaschinen nichts...

und dann die zweite Frage warum das nicht immer funktioniert. Es scheint als würde das manchmal 2 Daten draus machen.

— geändert am 16.05.2014, 10:10:38

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 10:21:19 via Website

Beschreibe das Problem mal genauer, kann das gerade nicht nachvollziehen.
Was ganau funktioniert nicht?
Wie 2 Datensätze draus erstellen?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Peter Parker
  • Forum-Beiträge: 36

16.05.2014, 12:54:56 via Website

Also ich habe eine Bluetooth Verbindung hergestellt und schicke von einem Terminal Programm bspw. die Nachricht "test".
Über if (cmplStrIncom.contains("test";)) {...} prüfe ich, ob/wann diese Nachricht gesendet wurde. Sobald das der Fall ist soll bspw. eine Toast Nachricht erscheinen.
Das Problem: Wenn ich "test" sende wird nicht immer die Nachricht angezeigt. Manchmal passiert einfach gar nichts, also wird nicht erkannt.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.05.2014, 19:07:59 via Website

Eigentlich brauschst du einen Listener, der auf eine empfangene BT Nachricht hört, dann hast du das Problem nicht

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Peter Parker
  • Forum-Beiträge: 36

20.05.2014, 07:51:38 via Website

Hab gesucht, aber nichts passendes gefunden.
Ein Beispiel wäre nett wie man einen BT Listener verwendet.

Das Problem ist, dass der empfangene String teilweise irgendwo abgeschnitten wird.
Dann empfange ich zB "te" und "st".

Antworten
Fabian Simon
  • Forum-Beiträge: 359

20.05.2014, 10:28:06 via Website

Jaaa, einen Listener ist hier leider nicht ganz möglich, da es sich um übertragungen übers netztwerk handelt.
Diese werden per Stream verschickt.
Das heißt:
Was du auf der einen Seite reinschmeißt, kommt auf der anderen seite wieder raus.
Erst danach können Listener zur weiteren Verarbeitung verwendet werden.
Und da es nur ein dummer Strom ist, braust du ein Protokoll.
Damit du weißt wann eine Naricht vollständig ist.

Ein Protokoll kann ganz unterschieldlich aussehen.
z.B.: eine & vor jeder nachricht und ein # nach jeder nachricht.
Oder bei komplexen Dingen etwas wie GSON.
Auch lässt sich mit Flush auf der Senderseite gut bübdeln....
Hier mal ein Unkommentierter Code von meinem Programm.
Der hat bisher keine Probleme gemacht.

public class ConnectionStream  extends Thread {

private InputStream input;
private OutputStream output;

private IMessage message;
private boolean close;
public ConnectionStream(InputStream input, OutputStream output, IMessage message){
    this.input = input;
    this.output = output;
    this.message = message;
    StaticObjects.hasAStreamToBox = true;
}

@Override
public void run() {
    super.run();
    byte[] buffer = new byte[1024];
    int bytes;
    while (!close){
        try{
            bytes = input.read(buffer);
            String readMessage = new String(buffer, 0, bytes);
            message.newMessage(this, readMessage);
        }catch (Exception e){
            message.exceptionThrow(this, e);
            break;
        }
    }
    message.connectionClosed(this);
}


public InputStream getInputStream(){
    return input;
}

public void close(){
    this.close = true;
}

public void write(String json){

    try {
        output.write(json.getBytes());
        output.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


}

Peter Parker

Antworten