2010-11-12 2 views
1

Я использую приложение для примера Bluetooth Chat с веб-сайта Android. Я хочу передать полное входящее сообщение (формат сообщения, включенный в приведенный ниже код, поскольку этот сайт анализирует сообщение для меня, которое также является моей работой в коде, функции, которая удаляет теги и извлекает имя и значение сообщения и использует его для дальнейших действий. Строка readMessage (в случае коммутатора Message_Read) отправляет выбранные символы и пропускает несколько специальных символов. Ниже приведен код из приложения Bluetooth Chat (с сайта Android).Bluetooth Chat - передать все входящее сообщение как строку

Я не могу получить полное сообщение в формате, который я упомянул в коде. Он отображается в нескольких строках, и многие символы удаляются. Любое предположение, почему это происходит?

// The Handler that gets information back from the BluetoothChatService 

private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case MESSAGE_STATE_CHANGE: 
      if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1); 
      switch (msg.arg1) { 
      case BluetoothChatService.STATE_CONNECTED: 
       mTitle.setText(R.string.title_connected_to); 
       mTitle.append(mConnectedDeviceName); 
       mConversationArrayAdapter.clear(); 
       break; 
      case BluetoothChatService.STATE_CONNECTING: 
       mTitle.setText(R.string.title_connecting); 
       break; 
      case BluetoothChatService.STATE_LISTEN: 
      case BluetoothChatService.STATE_NONE: 
       mTitle.setText(R.string.title_not_connected); 
       break; 
      } 
      break; 
     case MESSAGE_WRITE: 
      byte[] writeBuf = (byte[]) msg.obj; 
      // construct a string from the buffer 
      String writeMessage = new String(writeBuf); 
      mConversationArrayAdapter.add("Me: " + writeMessage); 
      break; 
     case MESSAGE_READ: 
      byte[] readBuf = (byte[]) msg.obj; 
      // construct a string from the valid bytes in the buffer 
      String readMessage = new String(readBuf, 0, msg.arg1); 
      mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage);     

      //Make sure there is a received message. Extract it's name and value 
      //int msgLen = readMessage.length(); 
      //if(msgLen!= 0) 
      // Message format is <MSG><N>shiftDirection<!N><V>1<!V><!MSG> 
      if (readBuf.equals("<MSG><N>.*<!N><V>.*<!V><!MSG>")) 
      extractData(readMessage); 
      else mTitle.setText(R.string.floor_it); 

      break; 
     case MESSAGE_DEVICE_NAME: 
      // save the connected device's name 
      mConnectedDeviceName = msg.getData().getString(DEVICE_NAME); 
      Toast.makeText(getApplicationContext(), "Connected to " 
          + mConnectedDeviceName, Toast.LENGTH_SHORT).show(); 
      break; 
     case MESSAGE_TOAST: 
      Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST), 
          Toast.LENGTH_SHORT).show(); 
      break; 
     } 
    } 
}; 

Часть кода, которая считывает входящий поток байтов в буфер и передает объект-буфер для отображения.

public void run() { 
     Log.i(TAG, "BEGIN mConnectedThread"); 
     byte[] buffer = new byte[1024]; 
     int bytes; 

     // Keep listening to the InputStream while connected 
     while (true) { 
      try { 
       // Read from the InputStream 
       bytes = mmInStream.read(buffer); 
       //String Incoming = new String(buffer); 
       //Pass "Incoming" instead of "buffer" 
       // Send the obtained bytes to the UI Activity 
       mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer) 
         .sendToTarget(); 
      } catch (IOException e) { 
       Log.e(TAG, "disconnected", e); 
       connectionLost(); 
       break; 
      } 
     } 
    } 
+0

В чем вопрос? – Axarydax

ответ

0
if (readBuf.equals("<MSG><N>.*<!N><V>.*<!V><!MSG>")) 
     extractData(readMessage); 
  • equals() не применяются регулярные выражения. Если вы хотите соответствовать .*, используйте классы от java.util.regex, чтобы помочь вам.
+0

Благодарим за отзыв. Я отметил это раньше и использовал readBuf.matches («...»). Но это не главная проблема, поскольку она не работает. –

1

Я думаю, что проблема в том, что case MESSAGE_READ: не только вызывается, если полный Packet получен, он также называется, если небольшой фрагмент получен. Поэтому вы должны поместить readMessage в отдельный буфер (т. Е. mNewBuf += readMessage). В поле mNewBuf имеется полный пакет. Если это так, вы анализируете свое сообщение, после чего очищаете свой буфер. Это сработало для меня.

0

У меня была такая же проблема, и я не 100% это всегда будет работать, но я нашел это на Javadoc:

read(byte[] b, int off, int len) 
     Reads up to len bytes of data from the input stream into an array of bytes. 

Если вы знаете, сколько байт вы ожидали, то вы можете попробовать с использованием

bytes = mmInStream.read(buffer, 0, lengthYouWant); 

Однако это не сработает, если ваши входящие данные имеют переменную длину.