安卓和Arduino蓝牙通信.如何指示当前数据事务已结束



我正在做一个需要Android手机发送和接收蓝牙数据的项目。Arduino总是向Android手机发送整数值,我想知道如何让Android手机知道当前数据交易已经结束。以下是我如何处理在Android中接收数据的方法。

//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开发很陌生,所以如果我的方法一开始不好,请告诉我在哪里可以阅读如何处理这种情况。谢谢。

所以这是我目前的解决方案。我还没有对函数进行单元测试,但目标是确保我将输入流中的数据获取到字符串中。此外,该函数确保开始和结束符号存在且格式正确。否则,将忽略该消息。未来的工作可能应该实现一种机制,通过 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;
        }
    }