Проблемы с отображением UDP-сообщений в виде открытого текста - PullRequest
0 голосов
/ 02 декабря 2011

Имейте срочную проблему и не можете найти решение для этого. Чтобы дать вам краткий обзор моей проблемы и моего проекта, над которым я работаю ... речь идет о считывании значений акселерометра моего телефона android и отправке этих значений на мой нетбук на основе Ubuntu. На стороне Linux я получаю эти значения и намерен работать с ними для дальнейших целей. Но я даже не могу получить к ним доступ. Но сначала давайте начнем с клиента:

  • Программное обеспечение на стороне клиента, написанное на Android следующим образом, не может отображать ни DatagramPacket packet, ни byte[] g в открытом тексте:

            try{
            DatagramSocket socket = new DatagramSocket();
            InetAddress addr = InetAddress.getByName("192.168.1.2"); // Dell Netbook
            if(D) Log.d("UDP", "Client: Connecting...");
    
            // Neues Byte erstellen
            byte[] g = {vts.getGxByte(),vts.getGyByte(),vts.getGzByte()};
            if(D) Log.d("byte-Länge:", " " + g.length);
    
            // UDP-Paket erstellen mit Daten, Zieladresse und -port
            DatagramPacket packet = new DatagramPacket(g, g.length, addr, 3333);
            if (D) Log.d("UDP", "Client: Sending x-Value: '" + Byte.toString(vts.getGxByte()));
            if (D) Log.d("UDP", "Client: Sending y-Value: '" + Byte.toString(vts.getGyByte()));
            if (D) Log.d("UDP", "Client: Sending z-Value: '" + Byte.toString(vts.getGzByte()));
            if (D) Log.d("UDP", "Client: Sending Byte-Values: '" + g);
            if (D) Log.d("UDP", "Client: Sending String-Values: '" + new String(g));
            if (D) Log.d("UDP", "Client: Sending Packet: '" + packet);
    
            socket.send(packet);
            if (D) Log.d("UDP", "Client: Sent.");
            if (D) Log.d("UDP", "Client: Done.");
    
        }
    

    Мои зарегистрированные данные для целей отладки не то, что я ожидаю:

    12-02 14: 46: 30.115: ОТЛАДКА / Акселерометр х-значение: (21290): 1,7570249

    12-02 14: 46: 30.125: DEBUG / Акселерометр y-значение: (21290): -0,87170225

    12-02 14: 46: 30.125: ОТЛАДКА / Акселерометр z-значение: (21290): 4.4936256

    12-02 14: 46: 30.165: DEBUG / PendingMsgSendReceiverRegister (769): введите sendQueuedMessage

    12-02 14: 46: 30.185: DEBUG / PendingMsgSendReceiverRegister (769): sendQueuedMessage, курсор не нулевой и счетчик: 0

    12-02 14: 46: 30.195: DEBUG / UDP (21290): Клиент: Соединение ...

    12-02 14: 46: 30.195: DEBUG / byte-Länge: (21290): 3

    12-02 14: 46: 30.195: DEBUG / UDP (21290): Клиент: Отправка x-Value: '-1

    12-02 14: 46: 30.195: DEBUG / UDP (21290): Клиент: Отправка y-значение: '0

    12-02 14: 46: 30.195: DEBUG / UDP (21290): Клиент: Отправка z-значения: '-1

    12-02 14: 46: 30.195: DEBUG / UDP (21290): Клиент: Отправка байтовых значений: '[B @ 40576b80

    12-02 14: 46: 30.205: DEBUG / UDP (21290): Клиент: Отправка строковых значений: '????

    12-02 14: 46: 30.205: DEBUG / UDP (21290): Клиент: Отправка пакета:'java.net.DatagramPacket@40576c08

    12-02 14: 46: 30.205: DEBUG / UDP (21290): Клиент: Отправлено.

    12-02 14: 46: 30.205: ОТЛАДКА / UDP (21290): Клиент: Выполнено

Итак, я хочу, чтобы значения в открытом тексте не были указателями или вопросительными знаками (см. Строки «Отправка байтовых значений / строковых значений / пакетов»)

  • на стороне сервера я тоже получаю эти знаки вопроса. Я предполагаю, что это ASCII-перевод. Но, как уже упоминалось, мне нужны необработанные данные. Это код в C:

    while (1)
    {
    
          bytes_read = recvfrom(sock,recv_data,1024,0,
                        (struct sockaddr *)&client_addr, &addr_len);
    
          recv_data[bytes_read] = '\0';
    
          printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr),
                                       ntohs(client_addr.sin_port));
          printf("%s", recv_data);
          fflush(stdout);
    
        }
        return 0;
    

Я благодарен за каждое предложение.

1 Ответ

0 голосов
/ 02 декабря 2011

В этом коде есть несколько проблем.Эта строка кажется подозрительной:

byte[] g = {vts.getGxByte(),vts.getGyByte(),vts.getGzByte()};

Как вы берете значения G с плавающей запятой и помещаете их в один байт?

Во-вторых, проблема в том, что вы не можете преобразоватьЗначения байтов в строке, как вы пытаетесь сделать.

В этом коде:

        if (D) Log.d("UDP", "Client: Sending String-Values: '" + new String(g));

Буквально байт и интерпретировать их как символы.Вам нужно преобразовать их обратно в числа с плавающей запятой, а затем распечатать их, но это не поможет вам из-за проблемы № 1, описанной выше - вы преобразовали их в один байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...