Untitled
unknown
plain_text
10 months ago
5.4 kB
5
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