Forum: Mikrocontroller und Digitale Elektronik Mehrer Abfragen SPP über Bluetooth (Androide)


von Berg T. (berg2304troll)


Lesenswert?

Hallo zusammen!

Brauch einen Rat?

Wie würdet ihr mehrere Befehle über Bluetooth versenden, viel wichtiger 
wie Empfangen. SPP ?

Es geht um die Abfrage eines TemperaturSensors der verschieden 
Temperaturen liefert.

Die einfache Abfrage klappt eine Befehl eine Antwort alle 1sec, aber bei 
zwei Abfragen obwohl logisch getrennt, kommt es zu einem durcheinander.

Das ganze soll über eine APP Androide abgefragt werden
.

Danke für jede Hilfe

von Jim M. (turboj)


Lesenswert?

Berg T. schrieb:
> Die einfache Abfrage klappt eine Befehl eine Antwort alle 1sec, aber bei
> zwei Abfragen obwohl logisch getrennt, kommt es zu einem durcheinander.

Wie trennst Du die "logisch"? Bei SPP gibt es für ein BT Gerät nur je 
einen Input- und Outputstream.

Und ja, bei Abfragezeiten <1s könnten die Antworten in einer Übertragung 
zusammen ankommen. Dein Code muss die sich aus dem Stream 
herausklamüsern.

von Berg T. (berg2304troll)


Lesenswert?

Hallo und Danke für die Antwort.

Ich trenne die Logisch in dem ich sage. true/false

Sende Befehl 1 ->warte auf Antwort1 -> wenn Antwort 1 da ->sende Befehl 
2-> warte auf Antwort 2 -> sende Befehl 1.

Das war halt ein Versuch

von Berg T. (berg2304troll)


Lesenswert?

Hallo, hätte den jmd ein Tipp wie ich zwei Werte zeitgesteuert über 
Bluetooth abfragen kann?

Danke

von Jim M. (turboj)


Lesenswert?

Berg T. schrieb:
> Sende Befehl 1 ->warte auf Antwort1 -> wenn Antwort 1 da ->sende Befehl
> 2-> warte auf Antwort 2 -> sende Befehl 1.
>
> Das war halt ein Versuch

Den wir ohne Source Code nicht wirklich nachvollziehen können. Deine 
Prosa hilft da nix.

von Berg T. (berg2304troll)


Lesenswert?

Hier Bitte.
Senden 1 und 2 werden jeweils einer anderen Klasse zeitlich gesteuert
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;

import android.R.integer;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothSocket;
import android.content.DialogInterface;
import android.os.Handler;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;


public class EsbinBlueCon {

    Timmer t = new Timmer();

  private static final String LOG_TAG = "EsbinBlueCon";
  public  BluetoothAdapter adapter;
  public  BluetoothSocket socket = null;
  public  Set<BluetoothDevice> pairedDevices;
  public  OutputStream stream_out = null;
  public  InputStream stream_in = null;
      public boolean is_connected = false;
      public   String mac_adresse; // MAC Adresse des Bluetooth Adapters

   public UUID myUUid = 
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  public float tempC = 0;
  public float tempUM = 0;
   public boolean is_send = false;
   public boolean is_send2 = false;
  public boolean sendErr= false;
    public boolean setTempUM= false;
    public String HEXTEMPC;
    public String HEXTEMPUM;

   public void verbinden(){




          Log.d(LOG_TAG, "Verbinde mit " + mac_adresse);


          BluetoothDevice remote_device = 
adapter.getRemoteDevice(mac_adresse);

        try {
           socket = 
remote_device.createRfcommSocketToServiceRecord(myUUid);
           Log.d(LOG_TAG, "Socket erstellt");
       } catch (Exception e) {
           Log.e(LOG_TAG, "Socket Erstellung fehlgeschlagen: " + 
e.toString());
       }

       adapter.cancelDiscovery();






       // Socket verbinden
       try {
           socket.connect();
           Log.d(LOG_TAG, "Socket verbunden");
           is_connected = true;
       } catch (IOException e) {
           is_connected = false;
           Log.e(LOG_TAG, "Socket kann nicht verbinden: " + 
e.toString());
       }

       // Socket beenden, falls nicht verbunden werden konnte
       if (!is_connected) {
           try {
               socket.close();
           } catch (Exception e) {
               Log.e(LOG_TAG,
                       "Socket kann nicht beendet werden: " + 
e.toString());
           }
       }



       // Outputstream erstellen:
       try {
           stream_out = socket.getOutputStream();
           Log.d(LOG_TAG, "OutputStream erstellt");
       } catch (IOException e) {
           Log.e(LOG_TAG, "OutputStream Fehler: " + e.toString());
           is_connected = false;
       }

       // Inputstream erstellen
       try {
           stream_in = socket.getInputStream();
           Log.d(LOG_TAG, "InputStream erstellt");
       } catch (IOException e) {
           Log.e(LOG_TAG, "InputStream Fehler: " + e.toString());
           is_connected = false;
       }




  }


private Timer timer1 = new Timer();

public long CTime(){
  Log.e(LOG_TAG, "CTIME: " + t.getTotalTime());
   return t.getTotalTime();



}





public void checkSenden (){

  try {
    if(stream_in.available() > 0){

      t.end();
    }else{



    }


  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }

}


    public void senden() {
  t.start();
   if( is_send==true){
     is_send2=false;
                byte[] message = new byte[]{0x3e, 0x02, 0x00};
                byte[] msgBuffer = (message);

                if (is_connected) {
                    Log.d(LOG_TAG, "Sende Nachricht: " + message);


                    Log.d(LOG_TAG, "STARTTIME");
                    try {
                        stream_out.write(msgBuffer);


                    } catch (IOException e) {
                        Log.e(LOG_TAG,
                                "Bluetest: Exception beim Senden: " + 
e.toString());
                    }


                }
                Log.e(LOG_TAG, "is_send (senden): " + is_send);
                Log.e(LOG_TAG, "is_send2:(senden): " + is_send2);
            }

}









    public void empfangen() {
checkSenden();;
      if( is_send==true){
                byte[] buffer = new byte[4]; // Puffer
                int laenge; // Anzahl empf. Bytes
             try{

                    if (stream_in.available() > 0) {

                      String msg="";
                      laenge = stream_in.read(buffer);



                       for (int i = 0; i < laenge; i++) {
                      msg += String.format("%02x", buffer[i]);
                             HEXTEMPC=msg;
                        Log.d(LOG_TAG, "MessageMSG 1: " +msg);
                      if(msg.length()==4){

                      float decim = Integer.parseInt(msg,16);
                       tempC = ((decim-1000)/10);

                      }
                       }
                      if(msg.length()==2){

                            Log.d(LOG_TAG, "MESSFEHLER1");}

                       // String msg2="";

                       // t.end();
                        Log.d(LOG_TAG, "Anzahl empfangender Bytes: " + 
String.valueOf(laenge));


                        Log.d(LOG_TAG, "MessageMSG 1LL: " + laenge);
                        // Message zusammensetzen und in HEX 
konvertieren + umrechnen:


                            //Log.d(LOG_TAG, "MessageMSG 1L: " + 
msg.length());

                            Log.d(LOG_TAG, "Message: " + tempC);







                     } //else{Log.e(LOG_TAG, "NICHTS EMPF");


                 buffer=null;
                    is_send=false;
                    is_send2=true;
                    Log.e(LOG_TAG, "is_send (empfangen): " + is_send);
                    Log.e(LOG_TAG, "is_send2:(empfangen): " + is_send2);
        } catch (Exception e) {
                Log.e(LOG_TAG, "Fehler beim Empfangen: " + 
e.toString());
            }

       }
    }


    public void senden2() {

      if( is_send2==true) {
            is_send = false;

            byte[] message = new byte[]{0x3e, 0x02, 0x02};
            byte[] msgBuffer = (message);

            if (is_connected) {
                Log.d(LOG_TAG, "Sende Nachricht 2: " + message);
                try {
                    stream_out.write(msgBuffer);

                } catch (IOException e) {
                    Log.e(LOG_TAG,
                            "Bluetest: Exception beim Senden: " + 
e.toString());
                }


            }
            Log.e(LOG_TAG, "is_send (senden2): " + is_send);
            Log.e(LOG_TAG, "is_send2:(senden2): " + is_send2);
            }
    }



public void empfangen2() {
    Log.d(LOG_TAG, "SetTempUmg"+setTempUM);

    if (is_send2 == true) {


        byte[] buffer1 = new byte[4]; // Puffer

        int laenge; // Anzahl empf. Bytes
        try {

            if (stream_in.available() > 0) {

                Log.d(LOG_TAG, "NICHTS EME2");
                String msg = "";
                // String msg2="";
                laenge = stream_in.read(buffer1);

                Log.d(LOG_TAG,
                        "Anzahl empfangender Bytes2: " + 
String.valueOf(laenge));

                // Message zusammensetzen und in HEX konvertieren + 
umrechnen:
                for (int i = 0; i < laenge; i++) {
                    msg += String.format("%02x", buffer1[i]);
                    HEXTEMPUM = msg;
                    Log.d(LOG_TAG, "MessageMSG 2: " + msg);
                    if (msg.length() == 4) {

                        float decim = Integer.parseInt(msg, 16);
                        tempUM = ((decim - 1000) / 10);

                    }
                    if (msg.length() == 2) {
                        Log.d(LOG_TAG, "MESSFEHLER2");
                    }
                }


                Log.d(LOG_TAG, "Message 2: " + tempUM);


                buffer1 = null;
                is_send2 = false;
                is_send = true;
                Log.e(LOG_TAG, "is_send (empfangen2): " + is_send);
                Log.e(LOG_TAG, "is_send2:(empfangen2): " + is_send2);
            } else {
                Log.e(LOG_TAG, "NICHTS EMPF2");


            } //else Toast.makeText(this, "Nichts empfangen", 
Toast.LENGTH_LONG).show();
            //Toast.makeText(this, "Nichts empfangen", 
Toast.LENGTH_LONG)
            // .show();


        } catch (Exception e) {
            Log.e(LOG_TAG, "Fehler beim Empfangen2: " + e.toString());
        }

    }

}


    public void trennen() {

      if (is_connected && stream_out != null) {

              is_connected = false;
              is_send=false;
              is_send2=false;
              Log.d(LOG_TAG, "Trennen: Beende Verbindung");
              try {
                  stream_out.flush();
                  socket.close();
              } catch (IOException e) {
                  Log.e(LOG_TAG,
                          "Fehler beim beenden des Streams und 
schliessen des Sockets: "
                                  + e.toString());
              }
          } else
              Log.d(LOG_TAG, "Trennen: Keine Verbindung zum beenden");


        }

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.