создать андроид TCP-клиент для rtl-tcp-android - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь получить сигналы 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.

...