我正在尝试从使用 OTG 电缆连接到安卓手机(三星 Galaxy 7、安卓 8.0)的 RTL-SDR 加密狗(RTL2832U R820T2)获取 I/Q 信号。我正在使用rtl-tcp-android驱动程序。我已经通过编译和下载它的源代码安装了驱动程序,并且我可以使用SDR Touch应用程序(由驱动程序的作者创建)接收 FM 信号,据我了解驱动程序安装本身应该没问题。
驱动程序的github 页面解释了如何获取 I/Q 样本。它说一旦使用 Android Intent 正确调用了驱动程序,如果我可以使用 tcp client读取驱动程序的输出,我应该能够读取 uint_8 格式的交错 I/Q 数据。我正在尝试使用这个答案来制作一个 tcp 客户端。在TcpClinet
课堂上,在while (mRun)
循环内,我改变了行
mServerMessage = mBufferIn.readLine();
至
mServerMessage = Integer.toString( mBufferIn.read() );
显然,该答案期望 tcp 数据以文本行的形式出现,而我应该获得的数据是 uint_8 数据的连续流。(实际上,如果我不进行此更改,程序最终会在 readLine() 函数处因内存不足异常而崩溃)。我还使用适合我设备的值更改了 TcpClient 类中 SERVER_IP 和 SERVER_PORT 成员变量的值。与 tcp 客户端相关的所有其他内容都与该答案中的相同。
在 onProgressUpdate() 中,我得到 0x7f 和 0xfffd 的随机序列。
这是我现在在 MainActivity 中使用的 onProgressUpdate() 函数:
@Override
protected void onProgressUpdate(String...values){
super.onProgressUpdate(values);
Log.d("MYLOG", "response " + values[0] + String.format( "(0x%x)", Integer.parseInt( values[0] ) );
}
这是我的 logcat 的一部分:
2019-10-31 14:37:21.629 7232-7232/? D/MYLOG: response 65533(0xfffd)
2019-10-31 14:37:21.633 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.635 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.643 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.645 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.651 7232-7232/? D/MYLOG: response 65533(0xfffd)
2019-10-31 14:37:21.654 7232-7232/? D/MYLOG: response 65533(0xfffd)
2019-10-31 14:37:21.655 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.657 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.658 7232-7232/? D/MYLOG: response 65533(0xfffd)
2019-10-31 14:37:21.663 7232-7232/? D/MYLOG: response 65533(0xfffd)
2019-10-31 14:37:21.666 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.669 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.671 7232-7232/? D/MYLOG: response 65533(0xfffd)
2019-10-31 14:37:21.673 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.687 7232-7232/? D/MYLOG: response 127(0x7f)
2019-10-31 14:37:21.689 7232-7232/? D/MYLOG: response 65533(0xfffd)
我很确定这是不正确的,我怀疑 tcp 客户端代码有问题。如何修改此代码以正确与 rtl-tcp-android 驱动程序通信?
编辑 1---
这是对我尝试但不起作用的代码的编辑(基于对同一链接问题的回答) :
mRun = true;
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
Log.e("TCP Client", "C: Connecting...");
Socket socket = new Socket(serverAddr, SERVER_PORT);
try {
mBufferOut = new PrintWriter(socket.getOutputStream());
Log.e("MYLOG", "TCP Client; C: Sent.");
mBufferIn = new DataInputStream(socket.getInputStream());
int charsRead = 0; short[] buffer = new short[1024]; //choose your buffer size if you need other than 1024
while (mRun) {
// charsRead = mBufferIn.read(buffer);
// int length = mBufferIn.readInt();
int length = 5;
// Log.d("MYLOG", String.format("length = %d", length ) );
if(length > 0){
byte[] message = new byte[length];
// mBufferIn.readFully(message, 0, message.length);
mBufferIn.read(message, 0, message.length);
// just display here instead of sending as a String to onProgressUpdate()
for(int i=0; i<length; i++){
Log.d("MYLOG", String.format("message[%d] = %d (0x%x)", i, message[i], message[i]) );
}
}
// mServerMessage = new String(buffer).substring(0, charsRead);
if (mServerMessage != null && mMessageListener != null) {
mMessageListener.messageReceived(mServerMessage);}
mServerMessage = null;
}
Log.e("MYLOG", "RESPONSE FROM SERVER; S: Received Message: '" + mServerMessage + "'");
mBufferIn
声明已更改为
private DataInputStream mBufferIn;
在程序执行其他任何操作之前,我想首先确保正确的数据来自TcpClient
类的函数本身。run()
通过此更新,我在 logcat 中得到 0x7f 和 0x80。