Android: BluetoothSocket получает свой собственный выход

У меня есть приложение, которое подключается к RaspberryPi через bluetooth и обходит те же данные, пока оно получает некоторые данные.

У меня были некоторые проблемы с подключением, поэтому это обходное решение необходимо для подключения моего телефона Android к RaspberryPi: IOException: чтение не удалось, сокет может быть закрыт - Bluetooth на Android 4.3

По какой-то причине телефон android получает свой собственный выход. Строка "Hello Raspberry. Это я, AndroidPhone" отправляется на вывод в бесконечном цикле. Входящие данные (из RaspberryPi) также читаются в бесконечном цикле.

Но каким-то образом я получаю не только данные от RaspberryPi, но и строку отправки через смартфон. Это мой код:

public class MainActivity extends AppCompatActivity {
    private BluetoothAdapter bluetoothAdapter;
    UUID SERIAL_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // (...)
        // Only GUI-stuff until this point

        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        BluetoothDevice raspberryPi = bluetoothAdapter.getRemoteDevice("B8:27:EB:56:DC:B2");
        BluetoothSocket btSocket;

        try {
            btSocket = raspberryPi.createRfcommSocketToServiceRecord(SERIAL_UUID);
            btSocket.connect();
        } catch (IOException e) {
            Log.e("BTError", e.getMessage());
            // Workaround, found on: /info/91689/ioexception-read-failed-socket-might-closed-bluetooth-on-android-43
            try {
                Log.e("BTError", "Trying fallback...");
                btSocket = (BluetoothSocket) raspberryPi.getClass().getMethod("createRfcommSocket", new Class[]{int.class}).invoke(raspberryPi, 1);
                btSocket.connect();

                (new Thread(new SendingThread(btSocket))).start();
                (new Thread(new ReceivingThread(btSocket))).start();
            } catch (Exception e2) {
                Log.e("BTError", e2.getMessage());
                Log.e("BTError", "Couldn't establish Bluetooth connection!");
            }
        }
    }

    private class SendingThread extends Thread {
        private OutputStream out;

        public SendingThread(BluetoothSocket btSocket) {
            try {
                out = btSocket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            try {
                int delay = 100000000;
                while (true) {
                    if (delay == 0) {
                        Log.i("WRT", "Written to RaspberryPi");
                        out.write("Hello Raspberry. It me, AndroidPhone".getBytes());
                        delay = 100000000;
                    }
                    delay--;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private class ReceivingThread extends Thread {
        private InputStream in;

        public ReceivingThread(BluetoothSocket btSocket) {
            try {
                in = btSocket.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            int data = 0;
            while (true) {
                try {
                    data = in.read();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Log.i("RCV", String.valueOf((char) data));
            }
        }
    }

На конце RaspberryPi все выглядит нормально. Простая java-программа запускает команду linux rfcomm listen/dev/rfcomm0 и читает/записывает файл /dev/rfcomm0 с помощью FileReader и FileWriter. Единственными соответствующими линиями на этой цели являются:

run {
    // Inside writer-thread
    bluetoothWriter = new BufferedWriter(new FileWriter("/dev/rfcomm0"));
    while(true) {
        bluetoothWriter.write("This is RaspPi");
        bluetoothWriter.flush();
    }
}

а также

run {
    // Inside reader-thread
    bluetoothReader = new BufferedReader(new FileReader("/dev/rfcomm0"));
    while(true) {
        int incData = bluetoothReader.read();
        System.out.print((char) incData);
    }
}

Спасибо за помощь!

edit: По-прежнему нет решения этой проблемы. Я подозревал, что RaspberryPi как-то отправляет обратно то, что получил. Но когда я отключил, что он отправляет что-либо, смартфон по-прежнему напрямую получает то, что он отправил.

Ответы