2012-04-10 31 views
2

----------------------編集------------------------ -
少し進歩しましたが、解決策ではありません。送信したいコマンドの間に次のコードを挿入すると、少なくともコマンドはリモートエンドで処理する時間を持つことができます(ただしこれは正しい方法ではありませんが、正しい方法は待機することです他のコマンドを送信する前に応答 ">")...Bluetooth Android SPP、コマンドをデバイスに直列に送信しますか?

android.os.SystemClock.sleep(150);

システムクロックがスリープしている間にリスナースレッドがブロックされるため、コードの送信が完了するまでモデムからの入力がテキストビューに追加されません。しかし、睡眠は正しい方法ではありません。より良い方法を見つける必要がありますので、相手のデバイスから ">"結果が戻ってくるまで私は新しいコマンドを送信しません。私がこのコードを書き終えたら、どちらかの方法で入力を処理する方法が必要なので、それについて考えると睡眠は本当に進歩ではありません。睡眠を挿入する例:-----------以下

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... 

----------------------元の投稿---------------

私はここにあり、マット・ベルのブログからのコードのこのエレガント書かれた作品で働いている:ここにある http://bellcode.wordpress.com/2012/01/02/android-and-arduino-bluetooth-communication/

ソース: をhttp://project-greengiant.googlecode.com/svn/trunk/Blog/Android%20Arduino%20Bluetooth

私は、次のコマンドを送る前に完全な応答が受信されるまで待つたびに、接続されたモデムにコマンドを順番にエレガントに送る方法に適合しようとしています。 (私はこれがAndroidのやり方ではないことを知っており、これを他の言語を使用して心拍で処理することができます)。

これまで私がこれまで取り組んできたことは、私が遠くに作っていないことが分かります。実際、このコードは送信前に最初のコマンドが完了するまで待つ必要があります。より多くのコマンド)。私はこの質問に関係しないほどのコードを省略しました。前もって感謝します。

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

私はコマンドの間に休止を入れて少し進歩しました。だから、少なくともコマンドはリモートエンドで実行する時間があります。これは正しい方法ではありません。コマンドを送信したり、リモートデバイスからの入力を解釈/処理したりして、 "処理済みの文字" "を受け取らないようにしてはいけません。 – user1324818

+1

私はこれを介して自分の道をハックし、それを動作させた。それは正しくないかもしれませんが、私がチャンスを取ったときにコードを投稿します。それは動作しますが、私はエラー処理を追加する必要があります! – user1324818

+1

私は本当にあなたがいくつかの進歩や最終的な解決策について書いていただければ幸いです。ありがとうございます。乾杯。 – Ewoks

答えて

1

これはかなり古い質問であると認識しています。しかし、私は同様のアプリケーションを開発しているので、別の方法で解決しています。

送信の間に遅延の代わりに、フラグを使用して送信/応答ロジックを実装することができます。ですから最初は接続はinitialです。 enableを送信し、フラグをenableRequestedに設定します。次に、リスナーが応答を待つようにします。 passwordを送信し続けたら、フラグをpasswordSentに設定し、スレッドを再び解放します。

私はonCreateでそれをしないでくださいが、onCreateから接続するスレッドをトリガすることをお勧めします。それはうまくいくはずです。

+0

グレート....それを探して、あなたの答えは私にヒントを与えた:) – Snake

関連する問題