Как читать данные сетевого потока в Java (протокол пакетов) - PullRequest
0 голосов
/ 12 июля 2011

Я работаю над декодированием протокола, используемого определенным устройством GPS для связи. Прямо сейчас я анализирую первый пакет данных, который он отправляет. Я могу читать, но думаю, что не читаю правильно.

Вот что я получил до сих пор:

    public static String toHex(byte[] bytes) {
    BigInteger bi = new BigInteger(1, bytes);
    return String.format("%0" + (bytes.length << 1) + "X", bi);
}

private void ProcessInitialPacket(){
            int port = 1954;
    System.out.println("Listening on port :"+port);
    byte[] data =  new byte[17];
    byte[] ackPacket = new byte[2];
    byte[] dataPacket= new byte[15];
    try {
        ServerSocket sSocket = new ServerSocket(port);
        Socket cSocket = sSocket.accept();          
        DataInputStream dataIN = new DataInputStream(cSocket.getInputStream());
        int packetSize=dataIN.read(data,0,data.length);         
        System.arraycopy(data, 0, ackPacket, 0, 2);
        System.arraycopy(data,2,dataPacket,0,15);

        System.out.println("Total packet size: "+ packetSize);
        System.out.println("ACK PACKET : "+ toHex(ackPacket));
        System.out.println("DATA PACKET: "+ toHex(dataPacket));
        System.out.println("FULL PACKET: "+ toHex(data));
    } catch (IOException e) { 
        e.printStackTrace();
    }
}

выход:

-PARSER()--

-INITSESSION-- Прослушивание через порт: 1954

Общий размер пакета: 17

ACK ПАКЕТ: 000F

ПАКЕТ ДАННЫХ: 333532383438303236323631393534

ПОЛНЫЙ ПАКЕТ: 000F333532383438303236323631393534

------ CLOSESESSION ------------

Теперь моя проблема:

здесь происходит то, что устройство отправляет [0x00] [0x0F] xxxxxxxxxxxxxxx где xxxxxxx - это его imei (пакет данных). Моя проблема в том, что в пакете данных слишком много 3-х, поэтому реальный действительный результат -

352848026261954

, который вы получите, удалив 3. мой вопрос: может ли это поведение происходить из моего кода или его части протокола? я могу исправить это программно, но я хочу знать, что есть способ, которым код может вызвать эти дополнительные 3.

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Вы смотрите на гекс значений ascii, который нужно декодировать как числа.Символ «0» в виде десятичного числа равен 48 или в шестнадцатеричном формате 0x30, до «9» - это 57 в качестве десятичного числа или 0x39 в виде шестнадцатеричного.

Итак, последовательность байтов

33 35 32 38 34 38 30 32 36 32 36 31 39 35 34

"352848026261954"

как символы ASCII.

Я бы изменил ваш код следующим образом

dataIN.readFully(data); // always read 17 bytes, not less
String text = new String(data, 0, 2, 13); // decodes 8-bit bytes as a String
long number = Long.parseLong(text);
2 голосов
/ 12 июля 2011

Это цифровая кодировка ASCII. 0 передается как «0», что составляет 0x30. 1 передается как 0x31. И т.д. Итак, ваше понимание формата данных неверно.

...