Я пытаюсь получить сигналы I / Q от ключа RTL-SDR (RTL2832U R820T2), подключенного к телефону Android (Samsung Galaxy 7, Android 8.0) с помощью кабеля OTG. Я использую драйвер rtl-tcp-android . Я установил драйвер, скомпилировав и загрузив из его исходного кода, и я могу получать FM-сигналы с помощью приложения SDR Touch (созданного автором драйвера), насколько я понимаю, сама установка драйвера должна бытьхорошо.
Страница github для драйвера объясняет, как получить образцы I / Q. В нем говорится, что после того, как драйвер был правильно вызван с помощью намерения Android, я смогу просто прочитать чередующиеся данные I / Q в формате uint_8, если смогу прочитать вывод драйвера с помощью tcp клиента . Я пытаюсь использовать этот ответ , чтобы сделать клиент TCP. В классе TcpClinet
внутри цикла while (mRun)
я изменил строку
mServerMessage = mBufferIn.readLine();
на
mServerMessage = Integer.toString( mBufferIn.read() );
Видимо, этот ответ ожидает, что данные tcp будут представлены в виде строктекста, в то время как данные, которые я должен получать, - это непрерывные потоки данных uint_8. (на самом деле, если я не сделаю это изменение, программа в конечном итоге завершится с исключением из-за нехватки памяти в функции readLine ()). Я также изменил значения переменных-членов SERVER_IP и SERVER_PORT в классе TcpClient с соответствующими значениями для моего устройства. Все остальное, связанное с tcp клиентом, такое же, как и в этом ответе.
В onProgressUpdate () я получаю случайные последовательности 0x7f и 0xfffd.
Это функция onProgressUpdate (), которую я сейчас использую в MainActivity:
@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;
Я хотел бы сначала убедиться, что правильные данные поступают в саму функцию run()
класса TcpClient
класса,до того, как программа сделает что-нибудь еще. С этим обновлением я получаю 0x7f и 0x80 в logcat.