2010-11-12 2 views
1

J'utilise l'exemple d'application Bluetooth Chat du site Web Android. Je veux passer le message entrant complet, (format de message inclus dans le code ci-dessous que ce site analyse le message pour moi qui est mon travail dans le code, à une fonction qui supprime les balises et extrait le nom et la valeur du message La chaîne readMessage (dans le commutateur Message_Read) envoie les caractères sélectionnés et omet quelques caractères spéciaux.Voici le code de l'application Bluetooth Chat (du site Web Android)Bluetooth Chat - Passer le message entrant complet sous forme de chaîne

Je ne suis pas en mesure de recevoir le message complet dans le format que je l'ai mentionné dans le code. Il s'affiche dans plusieurs lignes et plusieurs caractères sont supprimés. Toute suggestion pourquoi cela se produit?

// 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; 
     } 
    } 
}; 

La partie du code qui lit le flux entrant d'octets dans un tampon et transmet l'objet tampon pour l'affichage.

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

Quelle est la question? – Axarydax

Répondre

0
if (readBuf.equals("<MSG><N>.*<!N><V>.*<!V><!MSG>")) 
     extractData(readMessage); 
  • equals() ne s'applique pas des expressions régulières. Si vous voulez faire correspondre .*, utilisez des classes de java.util.regex pour vous aider.
+0

Merci pour la réponse. J'avais noté cela plus tôt et j'ai utilisé readBuf.matches ("..."). Mais ce n'est pas le problème principal car il ne fonctionne pas encore. –

1

Je pense que le problème est que case MESSAGE_READ: est non seulement appelé si un complet Packet est reçu, il est aussi appelé si un petit fragment est reçu. Vous devez donc placer le readMessage dans un tampon séparé (c'est-à-dire mNewBuf += readMessage) vérifiez que le mNewBuf contient un paquet complet. Si c'est le cas, vous analyser votre message et après cela, vous effacez votre tampon. Cela a fonctionné pour moi.

0

Je faisais la même question, et je ne suis pas 100% ce sera toujours travailler mais je trouve cela sur le javadoc:

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

Si vous savez combien d'octets que vous attendez que vous pourriez essayer en utilisant

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

Toutefois, cela ne fonctionnerait pas si vos données entrantes sont de longueur variable.

Questions connexes