我正在做一个需要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;
}
}