通过蓝牙在python和Java之间正确发送数据

时间:2017-07-07 10:12:58

标签: java android python bluetooth

我实际上是在智能手机上开发应用程序(频谱分析仪)。这个应用程序可以通过蓝牙与树莓派3进行通信,并从我的RTLSDR-2832(插入RPI3)扫描频率。

我写了一个脚本来从我的RTLSDR-2832获取样本,然后我通过蓝牙将它发送到我的应用程序:

from pylab import*
from rtlsdr import*
from bluetooth import*
import sys

#configure device
sdr= RtlSdr()
sdr.sample_rate=double(sys.argv[3])
sdr.gain=double(sys.argv[2])
sdr.center_freq=double(sys.argv[1])
NFFT=50

#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, Fs=sdr.sample_rate/1e6,    Fc=sdr.center_freq*1e6/1e6)
        tab_freq=(result[1]/1e6) 
        value_freq=str(tab_freq)[1:-1]
        value_list=[format(float(v), ".10f") for v in value_freq.split()]
        value_freq2= "\n".join(value_list)
        tab_pxx=result[0]
        value_pxx=str(tab_pxx)[1:-1]
        client_sock.send(value_freq2+'\n'+'\n'.join(value_pxx.split()))

因此,使用此脚本,我可以从RTLSDR2838获取数据并发送数据。我首先通过蓝牙发送所有数据freq,pxx值(以db / Hz为单位)。

我用我的应用程序获取了所有数据:

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, 15*nb_points);
                    final String strReceived_pxx = new String(buffer,15*nb_points, 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();
            }
        }
    }

变量nb_points在我的脚本上像NFFT一样固定为50。但是当我这样做时,我不会得到我的50个值。如果我尝试将nb_points和NFFT修复为30或更低,它可以工作但不是......

我想早点可能问题来自缓冲区,但显然没有...

有人有任何想法解决这个问题吗?

感谢您的帮助!

编辑:在我不知道是否与我的缓冲区有关之后,它确切地工作到33,但对于我的标签的每个案例,我得到2个值在标签再次写入的同时(我的频率和pxx值)

0 个答案:

没有答案