Java Android:BluetoothSocket接收自己的输出
我有一个通过蓝牙连接到RaspberryPi的应用程序,当它接收到一些数据时,会将相同的数据循环到它 我的连接有一些问题,因此需要此解决方法将我的android手机连接到RaspberryPi: 出于某种原因,android手机正在接收自己的输出。 字符串“Hello Raspberry.It’s me,AndroidPhone”以永无止境的循环发送到输出。传入的数据(来自RaspberryPi)也是在一个永无止境的循环中读取的 但不知何故,我不仅从树莓中接收数据,还通过智能手机发送字符串。这是我的代码:Java Android:BluetoothSocket接收自己的输出,java,android,bluetooth,android-bluetooth,Java,Android,Bluetooth,Android Bluetooth,我有一个通过蓝牙连接到RaspberryPi的应用程序,当它接收到一些数据时,会将相同的数据循环到它 我的连接有一些问题,因此需要此解决方法将我的android手机连接到RaspberryPi: 出于某种原因,android手机正在接收自己的输出。 字符串“Hello Raspberry.It’s me,AndroidPhone”以永无止境的循环发送到输出。传入的数据(来自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));
}
}
}
在树莓方面,一切看起来都很正常。一个简单的java程序启动Linux命令rfcomm listen/dev/rfcomm0
,并使用FileReader
和FileWriter
读取/写入文件/dev/rfcomm0
。这方面唯一相关的行是:
run {
// Inside writer-thread
bluetoothWriter = new BufferedWriter(new FileWriter("/dev/rfcomm0"));
while(true) {
bluetoothWriter.write("This is RaspPi");
bluetoothWriter.flush();
}
}
及
谢谢你的帮助
编辑:此问题仍然没有解决方案。我怀疑覆盆子不知怎的把它收到的东西寄回去了。但当我禁用它发送任何信息时,智能手机仍然会直接接收它发送的信息 我搜索了蓝牙类的源代码。乍一看,解决办法似乎是合法的。先试试这个:
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;
}
if(延迟==0){
Log.i(“WRT”,“写给树莓”);
out.write(“你好,覆盆子,是我,AndroidPhone.getBytes());
out.flush();//我不确定这是否是您需要的解决方案,因为我不知道您使用的是bluetooth classic还是bluetooth 4.0>+,但我为android编写了一个基于文本的BLE和WiFi P2P双向通信(我知道Raspberry Pi能够进行BLE通信),虽然我没有为BLE通信创建套接字连接,但我为WiFi P2P创建了套接字连接。看一看,我希望它有帮助。它还没有发布,所以您必须克隆/分叉回购。我想您在编写时遇到了麻烦
据我所知,对于缓冲区,应该使用\n和…
bluetoothWriter.write("This is RaspPi\n");
但是我更喜欢结合使用DataOutputStream
和BufferedReader
全文如下:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
try {
String line = bufferedReader.readLine();
System.out.println(line);
} catch (IOException e) {
e.printStackTrace();
}
对于写入:
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
String s = "Hi\n";
try {
dataOutputStream.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
最好纠正一位亲爱的朋友关于flush()的观点
我不确定,请测试您自己…
您是否尝试更改调用createRfcommSocket
的反射方法的参数?它应该更改蓝牙套接字的频道,可能这就是出现问题的地方。是的,我已经尝试更改android应用程序中使用的频道,并且(只是为了完全确定)运行在RaspberryPi上的程序使用的一个。遗憾的是,它没有解决问题。您是否尝试过在发送之间大约30秒的时间内严重减少发送,只是为了真正分析调试器内部的输出和输入?看起来确实有什么东西在回响。您是否尝试过添加“my rasberry pi prefix”(我的rasberry pi前缀)到rasberry pi输出上的消息,查看rasberry pi上是否有完整的消息?您是否检查了输出和接收的字节十进制值,以比较到达Rasberri pi的内容。我更感兴趣的是rasberry pi得到了什么以及它返回了什么“确切地发送”“。我想说的是,你是否100%肯定你已经检查了离开rasberri pi的字节,并确认它们不包含你的消息。因为如果它们包含,那么你发布的不是rasberri端,也不是Android。
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
String s = "Hi\n";
try {
dataOutputStream.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
}