Bluetooth Verbindung - Send and Recieve Data in a Loop

  • Antworten:1
Godsplan
  • Forum-Beiträge: 1

24.11.2014, 20:58:30 via Website

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:

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

  1. Befehl - Mach irgendwas - 10 Sekunden lang
  2. Befehl - Mach irgendwas - 12 Sekunden lang
  3. Befehl - Mach irgendwas - 5 Sekunden lang
  4. ........

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 :)

Antworten
Sven R.
  • Forum-Beiträge: 1.904

25.11.2014, 07:11:20 via App

Verzögerungen kannst du in allen Threads außer dem MainThread mit

 Thread.sleep(millisekunden);

Das wäre aber etwas umständlich in dieser Situation, weil du ja auf das okay vom Gerät warten musst.

Also machst du, wenn du das okay empfangen hast, ein
Handler#postDelayed(deineRunnableMitDemCodeZumSignalSchicken, millisekundenDieVorherAbgewartetWerden);

Dazu gibt es einige Tutorials.

In der Runnable machst du dann dein
bluetooth#send(...);

Und wenn wieder ein Okay empfangen hast, suchst du dir aus einem Array oder einer Liste dein nächstes Kommando mit Zeit zum warten raus und führst das ganze wieder mit postDelayed aus.

Edit:.Aufe Schnelle geschrieben. Bei Fragen, gerne fragen. 😀

— geändert am 25.11.2014, 07:13:46

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten