Android Bluetooth Chat Example modifizieren

dionysos328

Mitglied
Hallo Forum,

ich habe mich bisher mit hardwarenaher Programmierung beschäftigt und will nun meine erste App umsetzen.

Zu diesem Zweck will ich ein Projekt auf Basis von BluetoothChat realisieren.
https://developer.android.com/samples/BluetoothChat/index.html

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

Über Sensoren auf der Platine werden Messwerte aufgenommen, und sollen auf dem 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.

Der Datenstrom, der vom Mikrocontroller kommt, ist variabel und kann flexibel an die Anforerungen der App angepasst werden.
Die App müsste aus diesem Datenstrom nur die einzelnen Messwerte filtern und an der richtigen Stelle ausgeben.

Ich stelle mir das so vor:

Mikrocontroller sendet per Bluetooth: "T:27,1;RH:35;P:1013..."

Die App soll nun aus diesem Datenstrom erkennen: T ist die Temperatur, Ausgabe des Werts an der entsprechenden Stelle, RH ist die Luftfeuchtigkeit und so weiter.

Mit welcher Methode kann ich den ankommenden SPP-Datenstrom auf diese Art analysieren?

Vielen Dank,
dionysos
 

dionysos328

Mitglied
Vor dem Parsen des Textes steht noch ein weiteres Problem:

Wenn ich zwei Smartphones mit der BluetoothChat-App verbinde, können
unbegrenzt viele Zeichen in einer Nachricht übermittelt werden.

Bei einer Verbindung mit meinem Mikrocontroller-BT-Modul werden die
Nachrichten unterbrochen.

Die Ausgabe sieht dann aus wie folgt:

"BTM222: T:2
BTM222: 7,2;R
BTM222: H:35;P:
BTM222: 1013 usw."

Ich kann nicht nachvollziehen, wie dieser unregelmäßige Umbruch
entsteht.

Mir ist noch nicht ganz klar, an welcher Stelle genau der Text
zusammengesetzt wird, der letztendlich ausgegeben wird, also das:
"BTM222: ...."

Den Namen des Kommunikationspartners, der eingeblendet wird, wird
automatisch erkannt und voran gestellt.

Wenn ich das richtig sehe, werden die eingehenden Daten hier
verarbeitet:

Java:
private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
 
        public ConnectedThread(BluetoothSocket socket, String socketType) {
            Log.d(TAG, "create ConnectedThread: " + socketType);
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;
 
            // Get the BluetoothSocket input and output streams
            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                Log.e(TAG, "temp sockets not created", e);
            }
 
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

gesetzt wird.

Dieses Problem wird an anderer Stelle angesprochen, nur der
Unterschied ist mir noch nicht ganz klar.
 
Zuletzt bearbeitet:

buggy84

Bekanntes Mitglied
Grundsätzlich ist das Problem, dass viele Menschen versuchen Bytes in für das menschliche Gehirn lesbare Daten umzuwandeln. dabei kommt es zu Fehlern und Irrtümern, vor allem was Umbrüche und Sonderzeichen anbelangt.

Generell, um sowas aufzubauen, ist es nötig ein eigenes Protokoll zu entwerfen. Das hört sich schlimmer an als es ist. Ein Protokoll entscheidet, ob gesendete und empfangene Daten auch wirklich von der Gegenseite erkánnt werden.

Ganz gleich was für was steht, sende immer die gleichen Byteblöcke.. Beispiel:

1. Byte: Startbyte
2. Byte: Adresse
3. Byte: Daten
4. Byte: Stoppbyte

Eventuell kannst Du noch eine Checksumme einbauen, wenn Du willst. Wenn wir das Beispiel konkretisieren:

02 (Startbyte)
FF (Adresse -> das könnte dein P oder T oder was auch immer sein)
65 (Das sind deine Daten)
03 (Stoppbyte)

Dieses Datenpaket lässt sich im Controller als auch in Java bestens bearbeiten.
Du kannst dieses Protokoll einfachst modifizieren, Du musst nur sicher gehen dass Du immer ein gleichgroßes Datenpaket sendest, sonst läuft die Sache ad absurdum.
 

dionysos328

Mitglied
vielen Dank für deine Antwort.

Dass ich ein simples Protokoll aufsetzen muss, ist mir klar.

Das Verändern der Ausgabe des Mikrocontrollers nach meinen Vorstellungen ist kein Problem.

Ich hänge gerade allerdings an der Verarbeitung der ankommenden Daten in der App.

Meiner Vorstellung nach kommt eine endloser Datenstrom an, wobei ich nichtmal weiß, an welcher Stelle die App gerade begonnen hat zu "lauschen".

Ich frage mich nun, auf welche Art ich aus diesem Datenstrom einzelne Elemente heraussuchen kann und wie dies konkret in der App umgesetzt werden kann.
 

buggy84

Bekanntes Mitglied
An welcher Stelle die App beginnt zu lauchen, is ja völlig egal, du suchst dir einfach den Anfang (Startbyte). Du kennst alle wichtigen Parameter deines Protokolls (Startbyte, Stoppbyte, Länge einer kompletten Information in Byte), da ist das nicht mehr schwer durch die Bytes zu hüpfen und den anfang zu finden. Ab dann wird es einfach.
Ein Parser nimmt den Datenstrom, filtert die Adresse und die Daten heraus. Der Parser weiß, wo die entsprechenden Daten reingeschrieben werden, weil Du den Parser programmiert hast.

Beispiel:
es kommen 4 Bytes, das erste Byte ist 02, ist das 4. Byte 03? Wenn ja, dann haben wir offenbar einen Datenblock. Nun das 2. Byte lesen (Adresse) und das 3. Byte lesen (Daten).

Vielleicht eine Switch-case an dieser Stelle, in Abhängigeit von der Adresse. Meinetwegen Adresse 2: Daten in TextField schreiben.

Jetzt den nächsten Datenblock analysieren. Das ist wirklich nicht schwer. Ich würde Dir raten den unendlichen Datenstrom vorerst in kleine Häppchen zu teilen und einzelne Blöcke zu senden(alle 50ms oder so). Du merkst recht schnell ob es noch gut funktioniert, wenn Du schneller wirst. Da gibt es nämlich Hardwaremäßig schon Grenzen, an die man stoßen könnte...
 

dionysos328

Mitglied
okay vielen Dank.

ich arbeite jetzt mit einem InputStreamReader / BufferedReader und kann per readline einzelne Zeilen einlesen.
Diese untertrenne ich wiederrum mit .split.
Klappt soweit gut.

Nun möchte ich, dass meine App sich beim Start automatisch mit meinem BT-Modul verbindet. Name und MAC-Adresse des Moduls sind bekannt.

Nur ist mir nicht ganz klar, an welcher Stelle im BluetoothChat ich diese Verbindung am besten vornehme.

In der onCreate oder onResume?

Die onCreate gibt es aber zB sowohl in der Klasse MainActivity als auch in der BluetoothFragment.

Wie verhält es sich dann, wenn die App in den Hintergrund geschickt wird?

Der ursprüngliche Bluetoothchat bleibt auch im Hintergrund verbunden.
 

buggy84

Bekanntes Mitglied
Ich glaube an der Stelle wird es komplizierter das Chat example an Deine Wünsche anzupassen, als wenn Du deine App von Grund auf neu baust. Du hast noch nicht so viel Erfahrung mit dem Bluetooth Zeugs, das lernst Du alles indem Du Dir mal einen Plan machst, wie was ablaufen soll.

Ich persönlich habe eine automatisierte Verbindung mit zwei Klassen erstellt. Eine ist für das Eventhandling und Discovery zuständig (sucht nach Geräten, Filtert nach Namen und MAC usw.) und die andere ist für die Kommunikation zuständig (öffnet Ports, liest im Stream, behandelt Verbindungsabbrüche und initiiert reconnects etc.). Da gibt es leider keine wirklich gute "So musst Du es machen" Anleitung, hier musst Du selbst ran. Die Grundzüge hast Du schon, jetzt gilt es, dein Wissen einzusetzen und anzuwenden. Wenn Du Fragen hast wird Dir hier ja immer geholfen, aber es ist wirklich schwierig, Dir hier einen Weg zu empfehlen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Androidstudio Bluetooth connect Android & Cross-Platform Mobile Apps 6
xXSkyWalkerXx1 Android Bluetooth LE - Frage zur Funktionalität Android & Cross-Platform Mobile Apps 26
S Android Studio Bluetooth App Problem Android & Cross-Platform Mobile Apps 6
T Musik über Bluetooth streamen Android & Cross-Platform Mobile Apps 2
H WIFI, Bluetooth und NFC Verbindung überwachen Android & Cross-Platform Mobile Apps 1
A Zweite Kamera an HTC und per Bluetooth kommunizieren? Android & Cross-Platform Mobile Apps 2
W Bluetooth und obex Package nutzen Android & Cross-Platform Mobile Apps 4
P Bluetooth vom remoteDevice auf den Stream Android & Cross-Platform Mobile Apps 9
K Java ME Bluetooth verbindung parameter Android & Cross-Platform Mobile Apps 3
K Java ME Bluetooth geräte suchen Android & Cross-Platform Mobile Apps 2
K Java ME J2ME Bluetooth - bluesoleil,bluecove, JSR82... ? Android & Cross-Platform Mobile Apps 6
S Wie teste ich meine Bluetooth Anwendung Android & Cross-Platform Mobile Apps 4
G Bluetooth LocalDevice.isPowerOn() meldet false Android & Cross-Platform Mobile Apps 2
R Bluetooth und Sun Wireless Toolkit 2.5.2 Android & Cross-Platform Mobile Apps 3
G Bluetooth Verbindung zwischen Handy und PC Android & Cross-Platform Mobile Apps 5
W Datenbankzugriff, WLAN, Bluetooth Android & Cross-Platform Mobile Apps 2
T Java Bluetooth Kalender Android & Cross-Platform Mobile Apps 2
C How to send AT-Commands via Bluetooth using JSR-82 Android & Cross-Platform Mobile Apps 3
G Bluetooth Verbindung Android & Cross-Platform Mobile Apps 2
J Bluetooth Stick und Lego Mindstorms Android & Cross-Platform Mobile Apps 2
O Bluetooth Verbindung zwischen 2 Handys Android & Cross-Platform Mobile Apps 5
D Bluetooth Pairing dem Programm ueberlassen? Android & Cross-Platform Mobile Apps 3
L HTTP via Bluetooth Android & Cross-Platform Mobile Apps 2
D Start/Stop Bit per Bluetooth von PC zu PC, oder PCtoHandy Android & Cross-Platform Mobile Apps 2
M bluetooth? Android & Cross-Platform Mobile Apps 3
Noahscript Android Was haltet ihr von Chat- bzw. Messenger Apps? Android & Cross-Platform Mobile Apps 2
B Android Fragen zu einfache Web-Chat? Android & Cross-Platform Mobile Apps 1
precoc Peer to Peer Video / Voice Chat Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben