gpt4 book ai didi

java - Android:BluetoothSocket 接收自己的输出

转载 作者:行者123 更新时间:2023-12-01 06:44:43 24 4
gpt4 key购买 nike

我有一个应用程序,它通过蓝牙连接到 RaspberryPi,并在接收一些数据时将相同的数据循环给它。

我在连接时遇到了一些问题,因此需要使用此解决方法将我的 Android 手机连接到 RaspberryPi:IOException: read failed, socket might be closed - Bluetooth on 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: https://stackoverflow.com/questions/18657427/ioexception-read-failed-socket-might-closed-bluetooth-on-android-4-3
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's 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/rfcomm0FileReaderFileWriter .唯一相关的行是:
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);
}
}

谢谢您的帮助!

编辑:仍然没有解决这个问题。我怀疑 RaspberryPi 以某种方式发回了它收到的东西。但是当我禁用它发送任何东西时,智能手机仍然直接接收它发送的东西。

最佳答案

我搜索了蓝牙类(class)的来源。乍一看,解决方法似乎是合法的。先试试这个:

if (delay == 0) {
Log.i("WRT", "Written to RaspberryPi");
out.write("Hello Raspberry. It's me, AndroidPhone".getBytes());
out.flush(); // <-- You are not flushing
delay = 100000000;
}

消息会留在您的 socket 中,供您一遍又一遍地阅读。

如果这不能解决它,我能想到的另一个选项是,以某种方式将套接字初始化为您的 Android 设备的套接字。 .createRfcommSocket() 如果蓝牙设备是 null,则该方法似乎会为您自己的设备创建一个套接字创建套接字时。我不确定这到底是怎么发生的,但是如果 Raspberry Pi 的状态在异常之后以某种方式被破坏,我想这可能是值得研究的事情。

raspy side:如果您只是启动这两个线程,这并不意味着您会不断地向 发送消息。 /dev/rfcomm0 和冲洗。我建议您将其更改为 raspy通过发回想要的消息而不是一直发送垃圾邮件来对收到的消息使用react。我不确定这是否是您的问题的一部分,但它至少会使调试和开发更容易一些。

关于java - Android:BluetoothSocket 接收自己的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49793155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com