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 как-то отправляет обратно то, что получил. Но когда я отключил, что он отправляет что-либо, смартфон по-прежнему напрямую получает то, что он отправил.