Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:BluetoothSocket接收自己的输出_Java_Android_Bluetooth_Android Bluetooth - Fatal编程技术网

Java Android:BluetoothSocket接收自己的输出

Java Android:BluetoothSocket接收自己的输出,java,android,bluetooth,android-bluetooth,Java,Android,Bluetooth,Android Bluetooth,我有一个通过蓝牙连接到RaspberryPi的应用程序,当它接收到一些数据时,会将相同的数据循环到它 我的连接有一些问题,因此需要此解决方法将我的android手机连接到RaspberryPi: 出于某种原因,android手机正在接收自己的输出。 字符串“Hello Raspberry.It’s me,AndroidPhone”以永无止境的循环发送到输出。传入的数据(来自RaspberryPi)也是在一个永无止境的循环中读取的 但不知何故,我不仅从树莓中接收数据,还通过智能手机发送字符串。这是

我有一个通过蓝牙连接到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();
    }