2012-04-10 9 views
2

---------------------- bearbeiten ------------------------ -
Ein kleiner Fortschritt, keine Lösung. Wenn ich zwischen den Befehlen, die ich senden möchte, den folgenden Code einfüge, können zumindest die Befehle Zeit haben, auf dem entfernten Ende zu verarbeiten (aber dies ist immer noch nicht der richtige Weg, um dies zu tun, wäre der richtige Weg zu warten für Antwort ">" vor dem Senden eines anderen Befehls) ...Bluetooth Android SPP, Befehle in Serie an Gerät senden?

android.os.SystemClock.sleep (150);

Der Listener-Thread ist zwar blockiert, während die Systemuhr schläft, daher wird die Eingabe vom Modem erst nach dem Senden der Codefolge an die Textansicht angehängt, was weniger als wünschenswert ist. Auch hier ist Schlaf nicht der richtige Weg, und ich muss einen besseren Weg finden, damit ich keinen neuen Befehl sende, bis das ">" Ergebnis vom Gerät am anderen Ende zurückkommt. Wenn ich mit diesem Code fertig bin, brauche ich einen Weg, um mit den Eingaben umzugehen, so dass der Schlaf wirklich kein Fortschritt ist, wenn ich darüber nachdenke. Beispiel des Einsetzens des Schlafes:

sendData("enable"); 
    android.os.SystemClock.sleep(150); 
    sendData("password");   
    android.os.SystemClock.sleep(150); 
    sendData("conf t");   
    android.os.SystemClock.sleep(150);  
    sendData("interface eth0");   
    android.os.SystemClock.sleep(150);  
    //etc...etc...etc... 

---------------------- Original-Beitrag unter ----------- ---------------

ich mit diesem elegant geschrieben Stück Code von Matt Bell Blog gerade arbeite, befindet sich hier: http://bellcode.wordpress.com/2012/01/02/android-and-arduino-bluetooth-communication/

Quelle hier zu finden: http://project-greengiant.googlecode.com/svn/trunk/Blog/Android%20Arduino%20Bluetooth

Ohne den c Ode zu schlecht, ich versuche, in einer Weise zu passen, elegant Befehle seriell zu dem angeschlossenen Modem zu senden, jedes Mal wartend, bis eine komplette Antwort empfangen wird, bevor ich den folgenden Befehl sende. (Ich weiß, dass dies nicht die Android-Methode ist, und ich könnte das mit anderen Sprachen umgehen).

Hier ist, was ich bis jetzt arbeite (Sie werden sehen, ich habe es nicht sehr weit gemacht, in der Tat funktioniert dieser Code bis zu dem Punkt, wo ich auf den ersten Befehl warten muss, bevor Sie senden mehr Befehle). Ich habe so viel Code weggelassen, wie ich konnte, was nicht zu dieser Frage gehört. Danke im Voraus.

package Android.Arduino.Bluetooth;   

    import java.io.IOException;   
    import java.io.InputStream;   
    import java.io.OutputStream;   
    import java.util.Set;   
    import java.util.UUID;   
    import android.app.Activity;   
    import android.bluetooth.BluetoothAdapter;   
    import android.bluetooth.BluetoothDevice;   
    import android.bluetooth.BluetoothSocket;   
    import android.content.Intent;   
    import android.os.Bundle;   
    import android.os.Handler;   
    import android.widget.TextView;   


    public class BluetoothTest extends Activity   
    {   
     TextView myLabel;   
     BluetoothAdapter mBluetoothAdapter;   
     BluetoothSocket mmSocket;   
     BluetoothDevice mmDevice;   
     OutputStream mmOutputStream;   
     InputStream mmInputStream;   
     int counter;   
     Thread workerThread;   
     byte[] readBuffer;   
     int readBufferPosition;   
     volatile boolean stopWorker;   

     @Override   
     public void onCreate(Bundle savedInstanceState)   
     {   
      super.onCreate(savedInstanceState);   
      setContentView(R.layout.main);   

      myLabel = (TextView)findViewById(R.id.label);   

         try   
         {   
          findBT();   
          openBT();   
          sendData("enable");   
          //insert some code to wait for response before sending (or handle that in the above line, or otherwise) 
          sendData("password");   
          //insert some code to wait for response before sending (or handle that in the above line, or otherwise)   
          sendData("conf t");   
          //insert some code to wait for response before sending (or handle that in the above line, or otherwise)   
          sendData("interface eth0");   
          //insert some code to wait for response before sending (or handle that in the above line, or otherwise)   
          //etc...etc...etc...   
         }   
         catch (IOException ex) { }        

     }   

     }   

     void openBT() throws IOException   
     {   
      UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard SerialPortService ID   
      mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);     
      mmSocket.connect();   
      mmOutputStream = mmSocket.getOutputStream();   
      mmInputStream = mmSocket.getInputStream();   
      beginListenForData();   
      myLabel.append("Bluetooth Opened" + "\n");   
     }   

     void beginListenForData()   
     {   
      final Handler handler = new Handler();   
      final byte delimiter = 62; //This is the ASCII code for a > character indicating all data received   

      stopWorker = false;   
      readBufferPosition = 0;   
      readBuffer = new byte[1024];    

      workerThread = new Thread(new Runnable()   
      {   
       public void run()   
       {       

       while(!Thread.currentThread().isInterrupted() && !stopWorker)   
        {   
         try   
         {   
          int bytesAvailable = mmInputStream.available();         
          if(bytesAvailable > 0)   
          {   
           byte[] packetBytes = new byte[bytesAvailable];   
           mmInputStream.read(packetBytes);   
           for(int i=0;i<bytesAvailable;i++)   
           {   
            byte b = packetBytes[i];   
            if(b == delimiter)   
            {   
             byte[] encodedBytes = new byte[readBufferPosition];   
             System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);   
             final String data = new String(encodedBytes, "US-ASCII");   
             readBufferPosition = 0;   

             handler.post(new Runnable()   
             {   
              public void run()   
              {              
               myLabel.append(data);           
              }   
             });   
            }   
            else   
            {   
             readBuffer[readBufferPosition++] = b;   
            }   
           }   
          }   
         }   
         catch (IOException ex)   
         {   
          stopWorker = true;   
         }   
        }   

       }   
      });   

      workerThread.start();   
     }   

     void sendData(String msg0) throws IOException   
     {   
      msg0 += "\r";   
      mmOutputStream.write(msg0.getBytes());   
      myLabel.append("Data Sent" + "\n");   
     }   

    }   
+0

Ok, ich habe ein wenig Fortschritte gemacht, indem ich eine Pause zwischen den Befehlen eingefügt habe, so dass zumindest die Befehle einige Zeit auf dem entfernten Ende ausführen können. Dies ist jedoch immernoch nicht der richtige Weg, da ich keine Befehle senden oder Eingaben von dem entfernten Gerät interpretieren/verarbeiten sollte, bis ich ein "fertig bearbeitetes" Zeichen ">" erhalte. – user1324818

+1

Ok. Ich habe mich gehackt und es funktioniert. Es ist vielleicht nicht richtig, aber ich werde den Code veröffentlichen, wenn ich eine Chance bekomme.Es funktioniert, aber ich muss mehr Fehlerbehandlung hinzufügen! – user1324818

+1

Ich würde es wirklich schätzen, wenn Sie über einen Fortschritt oder eine endgültige Lösung schreiben würden, die Sie sich ausgedacht haben. Vielen Dank im Voraus .. Prost – Ewoks

Antwort

1

Ich erkenne, dass dies eine ziemlich alte Frage ist. Da ich jedoch eine ähnliche Anwendung entwickle, habe ich es anders gelöst und es könnte helfen.

Anstelle einer Verzögerung zwischen dem Senden können Sie eine Sende/Antwort-Logik über Flags implementieren. Also am Anfang ist die Verbindung initial. Sie senden die enable und setzen Sie Ihre Flagge auf enableRequested. Dann lassen Sie Ihren Hörer auf die Antwort warten. Wenn Sie mit dem Senden von password fortfahren, setzen Sie das Flag auf passwordSent und geben Sie den Thread erneut frei.

Also ich schlage vor, es nicht in der onCreate zu tun, sondern einen Thread von onCreate zu verbinden. Das sollte gut funktionieren.

+0

Großartig .... suchen, und Ihre Antwort gab mir einen Hinweis :) – Snake

Verwandte Themen