Android和Arduino蓝牙通信。如何指示当前数据事务已结束?

Android和Arduino蓝牙通信。如何指示当前数据事务已结束?,android,bluetooth,arduino,Android,Bluetooth,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

我正在做一个项目,需要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;
  }
}
//从Arduino读取到达的蓝牙数据并将其转发给其他活动
//注意:到达的BT数据是ASCII值,该类将其转换为整数
//值,然后再发送。
私有类btDataListener扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…设备){
List BtMessage=new ArrayList();
while(isBtConnected){
试一试{
如果(mmInStream!=null){
while(btSocket.getInputStream().available()>0){
添加(btSocket.getInputStream().read());
}
如果(BtMessage.size()>0){
//将收到的消息发送到活动
意向意向=新意向(“我的整数”);
intent.putExtra(“消息”,BtMessageToInt(BtMessage));
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
BtMessage.clear();
}
}
}
捕获(例外e){
e、 printStackTrace();
Log.d(标记“btCommunicationService:btDataListener:ERROR::”+e);
}
}
返回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;
        }
    }
私有类btDataListener扩展异步任务
{
@凌驾
受保护的Void doInBackground(Void…设备)
{
byte[]buffer=新字节[1024];//流的缓冲区存储
int bytes;//从read()返回的字节
字符串completeMessage=“”;
字符串startSymbol=“*”;
字符串endSymbol=“|”;
while(isBtConnected)
{
尝试
{
如果(mmInStream!=null)
{
while(btSocket.getInputStream().available()>0 | | incomingData.length()!=0)
{
if(btSocket.getInputStream().available()>0)
{
字节=mmInStream.read(缓冲区);
incomingData=incomingData+新字符串(缓冲区,0,字节);
}
//这里我们分析incomingData字符串以及它是否包含
//完整的消息(意味着在正确的位置有开始符号*和结束符号|),
//我们提取coomplete消息并将其传递给活动
//如果我们发现错误,例如开始符号与结束符号不匹配等等,
//我们清除坏字符串中的输入数据。
int start=incomingData.indexOf(startSymbol);
int end=incomingData.indexOf(endSymbol);
int extraStartSymbol=incomingData.substring(start+1,incomingData.length()).indexOf(startSymbol);
如果(开始==-1&&end!=-1)
{
incomingData=incomingData.substring(end+1,incomingData.length());
}
else if(开始!=-1&&end!=-1&&start>end)
{
incomingData=incomingData.substring(start,incomingData.length());
}
else if(start!=-1&&end!=-1&&extraStartSymbol!=-1&&extraStartSymbol
我明白了,您可以关闭套接字或写入消息结尾(EOM)字符串来指示消息已结束。有没有一种简单的方法来提取整数或整数