Проблема с обработчиком Bluetooth при получении данных в Android (байты) - PullRequest
0 голосов
/ 18 октября 2019

Я действительно не знаю, что я делаю неправильно, но это моя ситуация. Я общаюсь с модулем Bluetooth HC-05 и отправляю и получаю несколько байтов. Я использую образец BluetoothChat от android dev, чтобы упростить мою проблему. Вы можете найти класс BluetoothService здесь:

BluetoothService.java

и фрагмент, где я получаю сообщение здесь:

BluetootChatFragment.java

Эта функция внутри класса BluetoothService, модифицированная для получения данных:

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

  // Keep listening to the InputStream while connected
  while (mState == STATE_CONNECTED) {
    try {
      // Read from the InputStream
      bytes = mmInStream.read(buffer);
      int[] bArray = new int[bytes]
      for(int i =0; i < bArray; i++) {
        bArray[i] = buffer[i] & 255;
      }

      // Send the obtained bytes to the UI Activity
      mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, new String(bArray, 0, bytes)
      .sendToTarget();
    } catch (IOException e) {
      Log.e(TAG, "disconnected", e);
      connectionLost();
      break;
    }
  }
}

Здесь вместо этого используется функция обработчика, вызванная предыдущим:

private final Handler mHandler = new Handler() {
  public void handleMessage(Message message) {
    switch (message.what) {

      case 2:
      String str = (String) message.obj;
      mConversationArrayAdapter.add(mConnectedDeviceName + ":  " + str);
    }
    default:
    return;
  }
}

Таким образом, все работает нормально, и я получаю:

0C 03 00 02 01 1C 04 CB AF 97 7F AC 07

, но я хочу оставить класс BluetoothService более общим, поэтому я переместил цикл for в другой класс.

Класс BluetoothService:

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

  // Keep listening to the InputStream while connected
  while (mState == STATE_CONNECTED) {
    try {
      // Read from the InputStream
      bytes = mmInStream.read(buffer);

      // Send the obtained bytes to the UI Activity
      mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)
      .sendToTarget();
    } catch (IOException e) {
      Log.e(TAG, "disconnected", e);
      connectionLost();
      break;
    }
  }
}

Фрагмент BluetoothChat с обработчиком:

// this is a class variable
private StringBuilder sb = new StringBuilder();

private final Handler mHandler = new Handler() {
  public void handleMessage(Message message) {
    switch (message.what) {

      case 2:
      int[] bArray = new int[message.arg1]
      for(int i =0; i < bArray; i++) {
        bArray[i] = message.obj[i] & 255;
      }
      String str = new String(bArray, 0, message.arg1);
      sb.append(str);                  
      mConversationArrayAdapter.add(mConnectedDeviceName + ":  " + sb.toString());
    }
    default:
    return;
  }
}

На данный момент то, что я получаю из потока Bluetooth, выглядит примерно так:

0C 00 02 01 02 01 02 01 97 7F 02 01

У вас есть предложения по решению проблемы? Похоже, что проблема синхронизации или проблема с обратным вызовом (синхронизацией), или цикл for, на данный момент, слишком медленная.

Я использую Android Studio 3.5 и 8.0 (API Level 26)

Спасибо

...