Untitled

 avatar
unknown
plain_text
2 months ago
5.4 kB
2
Indexable
package org.stupor.deviceInteractiion;

import org.stupor.model.FinishedMessageAboutObject;
import org.stupor.model.MessageAboutObject;
import org.stupor.model.SynchroMessage;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class MessageParser {

    /**
     * Предполагаем, что пакет имеет следующую структуру:
     * 
     * Byte idx |   Поле (Little Endian)
     *   0..3   : заголовок  (не участвует в парсинге)
     *   4      : typeMessage (1 байт)
     *   5..8   : numberOfMessages (int, 4 байта)
     *   9..12  : numberObject (int, 4 байта) -- если нужно
     *   13..20 : latitude (double, 8 байт)
     *   21..28 : longitude (double, 8 байт)
     *   29..32 : altitude (int, 4 байта)
     *   33..36 : speed (float, 4 байта)
     *   37..40 : course (float, 4 байта)
     *   41     : typeTarget (1 байт)
     *   42..45 : epr (float, 4 байта)
     *   46     : updateTarget (1 байт)
     *   47..54 : time (double, 8 байт)
     *   ...    : (если есть хвостовые байты)
     *
     * Точные смещения надо подгонять под ваш реальный формат.
     */
    public static MessageAboutObject parseMessageAboutObject(byte[] data) {
        // Обязательно Little Endian:
        ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);

        // Начинаем читать поля, пропустив первые 4 байта «заголовка»
        int offset = 4;

        // 1) typeMessage (1 байт)
        int typeMsg = Byte.toUnsignedInt(buffer.get(offset));
        offset += 1;

        // 2) numberOfMessages (4 байта, int)
        int numberOfMessages = buffer.getInt(offset);
        offset += 4;

        // 3) numberObject (4 байта, int) — если нужно
        int numberObject = buffer.getInt(offset);
        offset += 4;

        // 4) latitude (8 байт, double)
        double latitude = buffer.getDouble(offset);
        offset += 8;

        // 5) longitude (8 байт, double)
        double longitude = buffer.getDouble(offset);
        offset += 8;

        // 6) altitude (4 байта, int)
        int altitude = buffer.getInt(offset);
        offset += 4;

        // 7) speed (4 байта, float)
        float speed = buffer.getFloat(offset);
        offset += 4;

        // 8) course (4 байта, float)
        float course = buffer.getFloat(offset);
        offset += 4;

        // 9) typeTarget (1 байт)
        int typeTarget = Byte.toUnsignedInt(buffer.get(offset));
        offset += 1;

        // 10) epr (4 байта, float)
        float epr = buffer.getFloat(offset);
        offset += 4;

        // 11) updateTarget (1 байт)
        int updateTarget = Byte.toUnsignedInt(buffer.get(offset));
        offset += 1;

        // 12) time (8 байт, double)
        double time = buffer.getDouble(offset);
        offset += 8;

        System.out.println("message parsed");

        // Заполняем объект
        MessageAboutObject message = new MessageAboutObject();
        message.setTypeMessage(typeMsg);
        message.setNumberOfMessages(numberOfMessages);
        message.setNumberObject(numberObject);
        message.setLatitude(latitude);
        message.setLongitude(longitude);
        message.setAltitude(altitude);
        message.setSpeed(speed);
        message.setCourse(course);
        message.setTypeTarget(typeTarget);
        message.setEpr(epr);
        message.setUpdateTarget(updateTarget);
        message.setTime(time);

        return message;
    }

    public static FinishedMessageAboutObject parseFinishedMessage(byte[] data) {
        ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);

        // Аналогично, пропускаем заголовок
        int offset = 4;

        // typeMessage (1 байт)
        int typeMsg = Byte.toUnsignedInt(buffer.get(offset));
        offset += 1;

        // numberOfMessages (int, 4 байта)
        int numberOfMessages = buffer.getInt(offset);
        offset += 4;

        // Время (double, 8 байт)
        double time = buffer.getDouble(offset);
        offset += 8;

        FinishedMessageAboutObject message = new FinishedMessageAboutObject();
        message.setTypeMessage(typeMsg);
        message.setNumberOfMessages(numberOfMessages);
        message.setTime(time);

        return message;
    }

    public static SynchroMessage parseSynchroMessage(byte[] data) {
        ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);

        // Пропускаем заголовок
        int offset = 4;

        // typeMessage (1 байт)
        int typeMsg = Byte.toUnsignedInt(buffer.get(offset));
        offset += 1;

        // Признак перезапуска (1 байт)
        int updateTarget = Byte.toUnsignedInt(buffer.get(offset));
        offset += 1;

        // Время (double, 8 байт)
        double time = buffer.getDouble(offset);
        offset += 8;

        SynchroMessage message = new SynchroMessage();
        message.setTypeMessage(typeMsg);
        message.setUpdateTarget(updateTarget);
        message.setTime(time);

        return message;
    }
}
Editor is loading...
Leave a Comment