Untitled
unknown
plain_text
a year ago
4.6 kB
11
Indexable
package org.stupor.deviceInteractiion;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.stereotype.Service;
import org.stupor.model.FinishedMessageAboutObject;
import org.stupor.model.MessageAboutObject;
import org.stupor.model.SynchroMessage;
import org.stupor.service.UDPMessageProcessor;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
@Service
public class UDPServer {
private static final int PORT = 9098;
private final UDPMessageProcessor messageProcessor;
public UDPServer(UDPMessageProcessor messageProcessor) {
this.messageProcessor = messageProcessor;
new Thread(this::start).start();
}
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X ", b));
}
return sb.toString().trim();
}
public void start() {
try (DatagramSocket socket = new DatagramSocket(PORT)) {
System.out.println("UDP сервер запущен на порту " + PORT);
while (true) {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
// Получаем "сырые" данные и обрезаем до фактической длины
int length = packet.getLength();
byte[] data = Arrays.copyOf(buffer, length);
// Выводим для отладки
System.out.println("Получены данные: " + Arrays.toString(data));
System.out.println("Полученные данные (Hex): " + bytesToHex(data));
System.out.println("Полный пакет: " + Arrays.toString(data));
/*
* Предполагаем, что первые 4 байта (0..3) — это служебный заголовок (10 02 3A 04).
* А байт типа сообщения находится в [4].
* Если у вас по протоколу иначе, то смещения нужно подкорректировать.
*/
if (data.length < 5) {
System.out.println("Слишком короткий пакет, пропускаем...");
continue;
}
// Тип сообщения лежит в data[4]
int typeMessage = data[4] & 0xFF;
System.out.println("Определённый тип сообщения: " + typeMessage);
System.out.println("Ожидаемые типы: 1 (объект), 2 (окончание), 3 (синхро)");
switch (typeMessage) {
case 1: {
// Парсим сообщение об объекте
MessageAboutObject objectMessage = MessageParser.parseMessageAboutObject(data);
// Логируем и отправляем дальше
System.out.println("Сообщение об объекте: " + objectMessage);
messageProcessor.processMessage(objectMessage);
break;
}
case 2: {
// Сообщение об окончании передачи
FinishedMessageAboutObject finishedMessage = MessageParser.parseFinishedMessage(data);
System.out.println("Сообщение об окончании: " + finishedMessage);
messageProcessor.processMessage(finishedMessage);
break;
}
case 3: {
// Синхросообщение
SynchroMessage syncMessage = MessageParser.parseSynchroMessage(data);
System.out.println("Синхросообщение: " + syncMessage);
messageProcessor.processMessage(syncMessage);
break;
}
default:
System.out.println("Неизвестный тип сообщения: " + typeMessage);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Editor is loading...
Leave a Comment