Java 为什么我能够通过蓝牙4.2发送的数据量超过了明显的最大值?
(参见第5页)通过蓝牙4.2发送的最大数据量为257字节 然而,我能够在Python脚本和Java应用程序之间发送990字节。为什么我能发送这么多数据?我发现的关于最大数据的信息是错误的,还是发生了其他事情 Python蓝牙脚本: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
#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
。我的值的一半是功率值,所以我发送所有值,然后发送所有频率值。