Untitled
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(); } } }
Leave a Comment