Bluetooth Verbindung - Liste an Befehlen schicken mit Bestätigung

G

Godsplan

Neues Mitglied
0
Moin Moin!

Ich bin noch Android Anfänger, verstehe jedoch schon vieles ganz gut denke ich.
Meine App baut eine Bluetooth Verbindung als Server auf und hält diese. Das funktioniert gut.

Hierfür habe ich folgende Klasse von PieterDD herangezogen: LINK darf ich noch nicht posten

Im Grunde macht er nichts anderes als eine Bluetooth Verbindung aufzubauen und diese in einen Async Thread zu schieben.

Initiert wird das ganze in der Main Activity hiermit:

Code:
BtClientTask clientTask = new BtClientTask(target);
        clientTask.execute(new BtConnectionEstablishedCallback() {
            @Override
            public void connectionEstablished(BluetoothSocket socket) {
                _btCurCon = new BtConnectionTask(socket, new BtIncomingDataCallback() {
                    @Override
                    public void incomingData(String text) {
                        label.setText(text);
                    }
                });
                _btCurCon.execute();
                _btCurCon.send("Hello world!");
            }   
        });

Wie man dort sieht kann ich mit "incomingData" die eingehenden Daten auswerten.
Mit der send() Methode kann ich an beliebiger Stelle im Programm auch Data nun verschicken.

Alles soweit schön und gut.

Jetzt mein Problem.

Ich habe hier eine Liste von Befehlen die ich per Bluetooth an meine Maschine senden möchte.

Beispiel

Befehl - Mach irgendwas - 10 Sekunden lang
Befehl - Mach irgendwas - 12 Sekunden lang
Befehl - Mach irgendwas - 5 Sekunden lang
........
Diese Befehle an die Maschine zu senden geht ja mit send() easy und das klappt auch wunderbar, nur macht Android das ja ganz schnell und somit führt meine Maschine immer nur den letzten Befehl aus der geschickt wurde.

Ich muss also eine Abfrage implementieren, wenn Befehl 1 geschickt wurde, warte bis Maschine "OK" gesagt hat und sende anschließend "Befehl 2". Bis die ganze Liste abgearbeitet ist.

Hier zu muss ich irgendwie ein Variable deklarieren die ich hin und her schalte, wenn etwas geschickt wurde "null" setzen. dann wird nichts mehr geschickt. Die RecieveMethode muss sie wieder "eins" setzen, wenn die maschine "ok" zurück gemeldet hat. Dann soll die Schleife weiter gehen und der Zweite befehl gesendet werden.

Wie kann ich soetwas umsetzen, ich muss ja eine Schleife anlegen und irgendwie Daten zwischen Methoden austauschen, die aber in einem Execute teilweise drin sind.

Hilfe :)

Der ursprüngliche Beitrag von 22:09 Uhr wurde um 23:02 Uhr ergänzt:

Ich habe mittlerweile eine Lösung gefunden, bin aber über weitere Vorschläge dankbar.

Schritt 1:
Button anlegen (Befehle schicken Starten)

Schritt 2: Go Befehl an Maschine senden, Maschine antwortet mit "los gehts"

Schritt 3: Bei der Abfrage für eingehende Daten von Bluetooth in der Activity wird dieses "los gehts" gefiltert und ein Zähler gesetzt auf z.B. 10 (für 10 Befehle). Diese 10 wird in in Textfeld neugeschrieben.

Ein addTextChangeListener registriert die Änderung. Hierdrin wird nun der erste Befehl losgeschickt und runtergezählt.

Wenn der Befehl ausgeführt wurde, registriert es wieder die Funktion für eingehende Bluetooth daten und ändert das Textfeld.

Dadurch wird wieder der ChangeListener aktiviert und so weiter.

Es funktioniert schon!

Die Befehle packe ich jetzt in ein Array das ich dann halt je nach Befehl einfach verschicke!
 
Ja genau das ist schon das richtige Vorgehen:

Im Prinzip musst du ein Protokoll "erfinden".

Dazu kannst du eine Statemachine verwenden: Endlicher Automat

- Aus den States würde ich die "OP-Codes" sprich die Befehle machen (analog z.B. wie das eine CPU macht).
- Wenn eine Transition schaltet würde ich eine Funktion aufrufen - z.b. in Java umgesetzt durch ein Interface.

Wichtig ist, das du dir überlegst, was du machst, wenn eines der Geräte nicht mehr antwortet. Es kann z.B. sein das jemand 50% überträgt und dann kommt nichts mehr.

Hier würde ich mit Zeitstempeln arbeiten, also:

1) speichere die Uhrzeit
2) führe einen Befehl aus
3) warte auf die Antwort. Wenn eine Antwort kommt cool. Bearbeiten.
4) wenn z.b. 5sec vergangen sind oder ein State kommt der unmöglich ist, setze das Protokoll zurück und gehe in einen Fehlermodus

Generell: Das was du machst ist nicht so easy und Regel #1:

Niemals Protokoll und UI Code mischen... stell dir vor in 2 Monaten musst
du 10 neue Befehle einbauen. Dann bist du froh das du nichts mit einem
changeListener zu tun hast.
 

Ähnliche Themen

FabianDev
Antworten
5
Aufrufe
561
swa00
swa00
S
Antworten
4
Aufrufe
4.479
mblaster4711
mblaster4711
B
Antworten
4
Aufrufe
496
bb321
B
Zurück
Oben Unten