Untitled

 avatar
unknown
plain_text
2 months ago
4.6 kB
2
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();
        }
    }
}
Leave a Comment