2017-06-17 3 views
0

私は、Android携帯電話がBluetoothデータを送受信する必要があるプロジェクトに取り組んでいます。 ArduinoはいつもAndroidの電話機に整数値を送信し、私はAndroidの携帯電話に現在のデータの処理が終了したことを知らせることができないのかと思っていました。ここで私はAndroidでデータを受け取る方法を扱っています。AndroidとArduinoのBluetooth通信。現在のデータトランザクションが終了したことを示す方法

//Reads the arriving bluetooth data from Arduino and forwards it to other activities 
//Note: Arriving BT data is in ASCII values and this class converts it to its integer 
//Values before sending it. 
private class btDataListener extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... devices) { 
    List<Integer> BtMessage = new ArrayList<>(); 
    while(isBtConnected) { 
     try { 
     if(mmInStream != null) { 
      while(btSocket.getInputStream().available() > 0) { 
      BtMessage.add(btSocket.getInputStream().read()); 
      } 
      if(BtMessage.size() > 0) { 
      //Send received message to Activities 
      Intent intent = new Intent("my-integer"); 
      intent.putExtra("message", BtMessageToInt(BtMessage)); 
      LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); 
      BtMessage.clear(); 
      } 
     } 
     } 
     catch (Exception e) { 
     e.printStackTrace(); 
     Log.d(TAG,"btCommunicationService: btDataListener: ERROR:: " + e); 
     } 
    } 
    return null; 
    } 
} 

これらは同じメッセージの一部と見なされません。また、私はAndroidの開発には全く新しいので、私の方法がまずはうまくいかない場合は、この状況をどのように処理するかについて、どこで読むことができるかアドバイスしてください。ありがとうございました。

+0

メッセージが( –

+0

)を超えていることを示すために、ソケットを閉じるか、メッセージの終わり(EOM)文字列を書くことができます。ところで、ソケットから整数や文字列を抽出する簡単な方法はありますか? Bluetoothは常に各バイトのASCII文字を受信するようです。 – Saik

+0

Stringコンストラクタはバイト配列を受け入れます。 Stringオブジェクトを解析してintにすることができます。 –

答えて

0

これは私の現在の解決策です。私はまだ関数を単体テストしませんでしたが、目標は入力ストリームからデータを文字列に変換することです。また、この関数は、開始記号と終了記号が存在し、正しい形式であることを確認します。そうでない場合、そのメッセージは無視されます。今後の作業は、おそらくAckメカニズムを介してこれから回復するためのメカニズムを実装するべきです。私はメッセージの開始記号として*を使用します。終了記号として。

private class btDataListener extends AsyncTask<Void, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(Void... devices) 
     { 
      byte[] buffer = new byte[1024]; // buffer store for the stream 
      int bytes; // bytes returned from read() 
      String completeMessage = ""; 
      String startSymbol = "*"; 
      String endSymbol = "|"; 
      while(isBtConnected) 
      { 
       try 
       { 
        if(mmInStream != null) 
        { 

         while(btSocket.getInputStream().available() > 0 || incomingData.length() != 0) 
         { 
          if(btSocket.getInputStream().available() > 0) 
          { 
           bytes = mmInStream.read(buffer); 
           incomingData = incomingData + new String(buffer, 0, bytes); 
          } 

          //here we are parsing the incomingData string and if it contains 
          //a full message(meaning it have starting symbol * and ending symbol | in correct places), 
          //We extract the coomplete message and pass it on to activities 
          //If we find mistakes such as unmatched start symbols for end symbols and so on, 
          //We clean the incomingData from bad strings. 

          int start = incomingData.indexOf(startSymbol); 
          int end = incomingData.indexOf(endSymbol); 
          int extraStartSymbol = incomingData.substring(start+1, incomingData.length()).indexOf(startSymbol); 

          if(start == -1 && end != -1) 
          { 
           incomingData = incomingData.substring(end + 1, incomingData.length()); 
          } 
          else if(start != -1 && end != -1 && start > end) 
          { 
           incomingData = incomingData.substring(start, incomingData.length()); 
          } 
          else if(start != -1 && end != -1 && (extraStartSymbol != -1 && extraStartSymbol < end)) 
          { 
           incomingData = incomingData.substring(extraStartSymbol + 1, incomingData.length()); 
          } 
          else if(start != -1 && end != -1) 
          { 
           completeMessage = incomingData.substring(start+1,end); 
           incomingData = incomingData.substring(end + 1,incomingData.length()); 
          } 

          if(!completeMessage.equals("")) 
          { 
           //Send received message in int form to Activities 
           Intent intent = new Intent("my-integer"); 
           intent.putExtra("message", Integer.parseInt(completeMessage)); 
           LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); 

           completeMessage = ""; 
          } 
         } 
        } 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
        Log.d(TAG,"btCommunicationService: btDataListener: ERROR:: " + e); 
       } 
      } 
      return null; 
     } 
    } 
関連する問題