Java 为什么我能够通过蓝牙4.2发送的数据量超过了明显的最大值?

Java 为什么我能够通过蓝牙4.2发送的数据量超过了明显的最大值?,java,bluetooth,Java,Bluetooth,(参见第5页)通过蓝牙4.2发送的最大数据量为257字节 然而,我能够在Python脚本和Java应用程序之间发送990字节。为什么我能发送这么多数据?我发现的关于最大数据的信息是错误的,还是发生了其他事情 Python蓝牙脚本: #Parameters config sdr=RtlSdr() sdr.fc=100e6 sdr.gain=48 sdr.rs=1.024e6 #Bluetooth co

(参见第5页)通过蓝牙4.2发送的最大数据量为257字节

然而,我能够在Python脚本和Java应用程序之间发送990字节。为什么我能发送这么多数据?我发现的关于最大数据的信息是错误的,还是发生了其他事情

Python蓝牙脚本:

        #Parameters config
        sdr=RtlSdr()
        sdr.fc=100e6
        sdr.gain=48
        sdr.rs=1.024e6

        #Bluetooth connection

        server_sock=BluetoothSocket(RFCOMM)
        server_sock.bind(("",PORT_ANY))
        server_sock.listen(1)

        port=server_sock.getsockname()[1]
        uuid="94f39d29-7d6d-437d-973b-fba39e49d4ee"
        client_sock,client_info=server_sock.accept()
 while (1):   
        samples= sdr.read_samples(256*1024)
        result=psd(samples, NFFT=70, Fc=sdr.fc/1e6, Fs=sdr.rs/1e6)
        tab_freq=(result[1])
        value_freq=str(tab_freq)[1:-1]
        value_freq2=[format(float(v),".4f")[:6] for v in value_freq.split()]
        value_freq3="\n".join(value_pxx2)

        #SAME FOR POWER VALUE
        #THEN I SEND DATA BY BLUETOOTH

        client_sock.send(value_freq3)
private class ThreadConnected extends Thread {
        private final BluetoothSocket connectedBluetoothSocket;
        private final InputStream connectedInputStream;
        private final OutputStream connectedOutputStream;

        boolean running;

        public ThreadConnected(BluetoothSocket socket) {
            connectedBluetoothSocket = socket;
            InputStream in = null;
            OutputStream out = null;
            running = true;
            try {
                in = socket.getInputStream();
                out = socket.getOutputStream();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            connectedInputStream = in;
            connectedOutputStream = out;
        }

        @Override
        public void run() {
            byte[] buffer = new byte[1048576]; // 20 bits
            int bytes;
            String strRx = "";

            while (running) {
                try {
                    bytes = connectedInputStream.read(buffer);
                    final String strReceived_freq = new String(buffer,0, bytes/2);
                    final String strReceived_pxx = new String(buffer,(bytes/2)+1, bytes);
                    //final int samples_sdr=new Integer(buffer,0,bytes);
                    final String strByteCnt = String.valueOf(bytes) + " bytes received.\n";

                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                                Pxx_value.setText(strReceived_pxx+"\n");    // get data PXX
                                freq_value.setText(strReceived_freq+"\n"); // get data freq

                            // plot value
                          /*  for (int i=0; i<nb_points; i++)
                            {
                                freq[i]=Double.parseDouble(strReceived_freq);
                                pxx[i]=Double.parseDouble(strReceived_pxx);
                                series.appendData(new DataPoint(freq[i],pxx[i]), true,500);
                            }*/

                        }});

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    cancel();

                    final String msgConnectionLost = "Connection lost:\n" + e.getMessage();
                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {

                        }});
                }
            }
        }

        public void write(byte[] buffer) {
            try {
                connectedOutputStream.write(buffer);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        public void cancel() {
            running = false;
            try {
                connectedBluetoothSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
Java蓝牙代码:

        #Parameters config
        sdr=RtlSdr()
        sdr.fc=100e6
        sdr.gain=48
        sdr.rs=1.024e6

        #Bluetooth connection

        server_sock=BluetoothSocket(RFCOMM)
        server_sock.bind(("",PORT_ANY))
        server_sock.listen(1)

        port=server_sock.getsockname()[1]
        uuid="94f39d29-7d6d-437d-973b-fba39e49d4ee"
        client_sock,client_info=server_sock.accept()
 while (1):   
        samples= sdr.read_samples(256*1024)
        result=psd(samples, NFFT=70, Fc=sdr.fc/1e6, Fs=sdr.rs/1e6)
        tab_freq=(result[1])
        value_freq=str(tab_freq)[1:-1]
        value_freq2=[format(float(v),".4f")[:6] for v in value_freq.split()]
        value_freq3="\n".join(value_pxx2)

        #SAME FOR POWER VALUE
        #THEN I SEND DATA BY BLUETOOTH

        client_sock.send(value_freq3)
private class ThreadConnected extends Thread {
        private final BluetoothSocket connectedBluetoothSocket;
        private final InputStream connectedInputStream;
        private final OutputStream connectedOutputStream;

        boolean running;

        public ThreadConnected(BluetoothSocket socket) {
            connectedBluetoothSocket = socket;
            InputStream in = null;
            OutputStream out = null;
            running = true;
            try {
                in = socket.getInputStream();
                out = socket.getOutputStream();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            connectedInputStream = in;
            connectedOutputStream = out;
        }

        @Override
        public void run() {
            byte[] buffer = new byte[1048576]; // 20 bits
            int bytes;
            String strRx = "";

            while (running) {
                try {
                    bytes = connectedInputStream.read(buffer);
                    final String strReceived_freq = new String(buffer,0, bytes/2);
                    final String strReceived_pxx = new String(buffer,(bytes/2)+1, bytes);
                    //final int samples_sdr=new Integer(buffer,0,bytes);
                    final String strByteCnt = String.valueOf(bytes) + " bytes received.\n";

                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {
                                Pxx_value.setText(strReceived_pxx+"\n");    // get data PXX
                                freq_value.setText(strReceived_freq+"\n"); // get data freq

                            // plot value
                          /*  for (int i=0; i<nb_points; i++)
                            {
                                freq[i]=Double.parseDouble(strReceived_freq);
                                pxx[i]=Double.parseDouble(strReceived_pxx);
                                series.appendData(new DataPoint(freq[i],pxx[i]), true,500);
                            }*/

                        }});

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    cancel();

                    final String msgConnectionLost = "Connection lost:\n" + e.getMessage();
                    runOnUiThread(new Runnable(){

                        @Override
                        public void run() {

                        }});
                }
            }
        }

        public void write(byte[] buffer) {
            try {
                connectedOutputStream.write(buffer);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        public void cancel() {
            running = false;
            try {
                connectedBluetoothSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
私有类ThreadConnected扩展线程{
专用最终蓝牙插座连接蓝牙插座;
私有最终输入流连接到输入流;
私有最终输出流连接输出流;
布尔运算;
公共螺纹连接(蓝牙插座){
connectedBluetoothSocket=插座;
InputStream in=null;
OutputStream out=null;
运行=真;
试一试{
in=socket.getInputStream();
out=socket.getOutputStream();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
connectedInputStream=in;
connectedOutputStream=out;
}
@凌驾
公开募捐{
字节[]缓冲区=新字节[1048576];//20位
整数字节;
字符串strRx=“”;
(跑步时){
试一试{
字节=connectedInputStream.read(缓冲区);
最终字符串strReceived_freq=新字符串(缓冲区,0,字节/2);
最终字符串strReceived_pxx=新字符串(缓冲区,(字节/2)+1,字节);
//final int samples_sdr=新整数(缓冲区,0,字节);
最终字符串strByteCnt=String.valueOf(bytes)+“已接收字节”。\n”;
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
Pxx_value.setText(strReceived_Pxx+“\n”);//获取数据Pxx
freq_value.setText(strReceived_freq+“\n”);//获取数据频率
//绘图值

/*对于(int i=0;i,您链接到的文档显示了LE(低能)链路层数据包格式,如蓝牙核心规范第6卷第B部分第2.1节所述

您正在使用RFCOMM,这是一种蓝牙经典(又名BR/EDR)配置文件。BR/EDR的链路层数据包格式在第2卷第B部分第6节中指定,并显示有效负载的长度可达2790字节


在任何情况下,您使用的API都不允许您访问链路层。您是在RFCOMM通道上编写的(该通道的设计或多或少类似于串行端口)您可以写入任意数量的字节。您的库和底层平台将负责将数据放入适当数量的L2CAP数据包中,然后这些数据包将进一步封装在链路层数据包中。您将遇到的主要限制是实现中的缓冲区大小。在这种情况下,您将使用基于套接字的API将返回调用
send
时写入的字节数,您可以稍后尝试重新传输。

感谢@CodyGray的编辑,现在它真的更清晰了!不客气!感谢您留下来更新您的问题以回应反馈。如果每个人都这样做,事情会变得非常顺利oother.希望你得到一个很好的答案!我只是假设你确定蓝牙设备没有发送多个标签吗?我不知道你是否正确,但当我使用这个变量时:
final String strByteCnt=String.valueOf(bytes)+“bytes received”。\n
它给了我所有时间990字节。感谢您提供的信息!我将缓冲区大小固定为
byte[]buffer=new byte[1048576];//20位
不够正常?是的,1MB对于接收缓冲区来说已经足够了。我使用65535,这是最大的L2CAP MTU,但在我的用例中从未达到。这真的很奇怪,因为在大约990字节之后,我的值被新值擦除。你能详细说明一下吗?我不理解这个问题。我还看了解析code(
final String strReceived_freq=new String(buffer,0,15*nb_points);
等)。您绝对不应该假设在一次调用中始终会收到完整的数据包进行读取。相反,您应该循环缓冲区中的字节,直到
字节
索引,然后将数据复制到其他地方(例如,在您的示例中是
StringBuilder
)。当您确定已收到完整的数据包时,请更新UI。是的,对不起。我刚刚编辑过。我的变量现在是
final String strReceived\u freq=new String(缓冲区,0,字节/2);
我刚刚编辑了我的脚本python,向您展示了什么类型的数据。我实际上尝试发送两种类型的值:功率值和频率值。这就是为什么我使用
字节/2
。我的值的一半是功率值,所以我发送所有值,然后发送所有频率值。