Bluetooth-чат - передать все входящее сообщение в виде строки - PullRequest
1 голос
/ 12 ноября 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

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

0 голосов
/ 30 июня 2012

У меня была та же проблема, и я не на 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);

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

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