/
latin
/
WialonIPSServer
Обзор
Документация
Войти
/
latin
/
WialonIPSServer
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
PacketHandler.cs
256 строк
11 KB
latin
review
26 ноя 2025, 16:38
26 ноя 2025, 16:38
f5c08b9
Код
Авторство
О чём код?
using System.Text; using WialonIPSServer.Models; namespace WialonIPSServer; /// <summary> /// Обработчик пакетов протокола Wialon IPS /// </summary> public class PacketHandler { private readonly Dictionary<string, bool> _authenticatedDevices = new(); private readonly LogService? _logService; public PacketHandler(LogService? logService = null) { _logService = logService; } /// <summary> /// Обрабатывает входящий пакет и возвращает ответ /// </summary> public byte[]? HandlePacket(WialonPacket packet, string? deviceId = null) { if (!packet.IsValid) { var errorMsg = $"[ERROR] Получен невалидный пакет: {packet.Type}"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId, packet.Type.ToString()); return null; } var infoMsg = $"[INFO] Получен пакет типа: {packet.Type}"; Console.WriteLine(infoMsg); _logService?.AddLog("INFO", infoMsg, deviceId, packet.Type.ToString()); return packet.Type switch { PacketType.L => HandleLogin(packet), PacketType.SD => HandleShortData(packet, deviceId), PacketType.D => HandleData(packet, deviceId), PacketType.B => HandleBlackBox(packet, deviceId), PacketType.P => HandlePing(packet), PacketType.M => HandleMessage(packet, deviceId), PacketType.I => HandleImage(packet, deviceId), PacketType.IT => HandleTachographInfo(packet, deviceId), PacketType.T => HandleTachographData(packet, deviceId), _ => HandleUnknown(packet) }; } private byte[]? HandleLogin(WialonPacket packet) { var login = LoginPacket.Parse(packet.Message); if (login == null) { var errorMsg = "[ERROR] Не удалось распарсить пакет логина"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, null, "L"); return PacketParser.BuildResponse(PacketType.AL, "0"); // Ошибка авторизации } var loginMsg = $"[LOGIN] IMEI: {login.Imei}, Protocol: {login.ProtocolVersion}"; Console.WriteLine(loginMsg); _logService?.AddLog("LOGIN", loginMsg, login.Imei, "L"); // Простая проверка авторизации (в реальном приложении здесь должна быть проверка в БД) // Для демонстрации принимаем все устройства _authenticatedDevices[login.Imei] = true; // Ответ: 1 - успешная авторизация, 0 - ошибка return PacketParser.BuildResponse(PacketType.AL, "1"); } private byte[]? HandleShortData(WialonPacket packet, string? deviceId) { if (deviceId == null || !_authenticatedDevices.ContainsKey(deviceId)) { var errorMsg = "[ERROR] Устройство не авторизовано"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId); return null; } var data = DataPacket.Parse(packet.Message); if (data == null) { var errorMsg = "[ERROR] Не удалось распарсить пакет данных"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId, "SD"); return PacketParser.BuildResponse(PacketType.ASD, "0"); } var lat = data.GetLatitude(); var lon = data.GetLongitude(); var dataMsg = $"[DATA] Дата/Время: {data.Date} {data.Time}, Координаты: {(lat.HasValue ? lat.Value.ToString("F6") : "N/A")}, {(lon.HasValue ? lon.Value.ToString("F6") : "N/A")}, Скорость: {data.Speed} км/ч, Курс: {data.Course}°, Высота: {data.Altitude} м, Спутников: {data.Satellites}"; Console.WriteLine($"[DATA] Устройство: {deviceId}"); Console.WriteLine($" Дата/Время: {data.Date} {data.Time}"); Console.WriteLine($" Координаты: {(lat.HasValue ? lat.Value.ToString("F6") : "N/A")}, {(lon.HasValue ? lon.Value.ToString("F6") : "N/A")}"); Console.WriteLine($" Скорость: {data.Speed} км/ч, Курс: {data.Course}°, Высота: {data.Altitude} м"); Console.WriteLine($" Спутников: {data.Satellites}"); _logService?.AddLog("DATA", dataMsg, deviceId, "SD"); // Ответ: 1 - успешно, 0 - ошибка return PacketParser.BuildResponse(PacketType.ASD, "1"); } private byte[]? HandleData(WialonPacket packet, string? deviceId) { if (deviceId == null || !_authenticatedDevices.ContainsKey(deviceId)) { var errorMsg = "[ERROR] Устройство не авторизовано"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId); return null; } // Расширенный пакет может содержать дополнительные параметры var parts = packet.Message.Split('|'); if (parts.Length == 0) { var errorMsg = "[ERROR] Пустой расширенный пакет данных"; _logService?.AddLog("ERROR", errorMsg, deviceId, "D"); return PacketParser.BuildResponse(PacketType.AD, "0"); } var data = DataPacket.Parse(parts[0]); if (data == null) { var errorMsg = "[ERROR] Не удалось распарсить расширенный пакет данных"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId, "D"); return PacketParser.BuildResponse(PacketType.AD, "0"); } var lat = data.GetLatitude(); var lon = data.GetLongitude(); var dataMsg = $"[DATA EXTENDED] Дата/Время: {data.Date} {data.Time}, Координаты: {(lat.HasValue ? lat.Value.ToString("F6") : "N/A")}, {(lon.HasValue ? lon.Value.ToString("F6") : "N/A")}, Скорость: {data.Speed} км/ч, Курс: {data.Course}°, Высота: {data.Altitude} м, Спутников: {data.Satellites}"; Console.WriteLine($"[DATA EXTENDED] Устройство: {deviceId}"); Console.WriteLine($" Дата/Время: {data.Date} {data.Time}"); Console.WriteLine($" Координаты: {(lat.HasValue ? lat.Value.ToString("F6") : "N/A")}, {(lon.HasValue ? lon.Value.ToString("F6") : "N/A")}"); Console.WriteLine($" Скорость: {data.Speed} км/ч, Курс: {data.Course}°, Высота: {data.Altitude} м"); Console.WriteLine($" Спутников: {data.Satellites}"); // Дополнительные параметры if (parts.Length > 1) { Console.WriteLine($" Доп. параметры: {parts[1]}"); dataMsg += $", Доп. параметры: {parts[1]}"; } _logService?.AddLog("DATA", dataMsg, deviceId, "D"); return PacketParser.BuildResponse(PacketType.AD, "1"); } private byte[]? HandleBlackBox(WialonPacket packet, string? deviceId) { if (deviceId == null || !_authenticatedDevices.ContainsKey(deviceId)) { Console.WriteLine("[ERROR] Устройство не авторизовано"); return null; } var msg = $"[BLACKBOX] Устройство: {deviceId}, Данные: {packet.Message}"; Console.WriteLine(msg); _logService?.AddLog("INFO", msg, deviceId, "B"); return PacketParser.BuildResponse(PacketType.AB, "1"); } private byte[]? HandlePing(WialonPacket packet) { var msg = "[PING] Получен пинг-пакет"; Console.WriteLine(msg); _logService?.AddLog("INFO", msg, null, "P"); return PacketParser.BuildResponse(PacketType.AP, ""); } private byte[]? HandleMessage(WialonPacket packet, string? deviceId) { if (deviceId == null || !_authenticatedDevices.ContainsKey(deviceId)) { var errorMsg = "[ERROR] Устройство не авторизовано"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId); return null; } var msg = $"[MESSAGE] Устройство: {deviceId}, Сообщение: {packet.Message}"; Console.WriteLine(msg); _logService?.AddLog("INFO", msg, deviceId, "M"); return PacketParser.BuildResponse(PacketType.AM, "1"); } private byte[]? HandleImage(WialonPacket packet, string? deviceId) { if (deviceId == null || !_authenticatedDevices.ContainsKey(deviceId)) { var errorMsg = "[ERROR] Устройство не авторизовано"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId); return null; } var imageSize = packet.BinaryData?.Length ?? 0; var msg = $"[IMAGE] Устройство: {deviceId}, Размер изображения: {imageSize} байт"; Console.WriteLine(msg); _logService?.AddLog("INFO", msg, deviceId, "I"); // В реальном приложении здесь можно сохранить изображение return PacketParser.BuildResponse(PacketType.AI, "1"); } private byte[]? HandleTachographInfo(WialonPacket packet, string? deviceId) { if (deviceId == null || !_authenticatedDevices.ContainsKey(deviceId)) { var errorMsg = "[ERROR] Устройство не авторизовано"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId); return null; } var msg = $"[TACHOGRAPH INFO] Устройство: {deviceId}, Информация: {packet.Message}"; Console.WriteLine(msg); _logService?.AddLog("INFO", msg, deviceId, "IT"); return PacketParser.BuildResponse(PacketType.AIT, "1"); } private byte[]? HandleTachographData(WialonPacket packet, string? deviceId) { if (deviceId == null || !_authenticatedDevices.ContainsKey(deviceId)) { var errorMsg = "[ERROR] Устройство не авторизовано"; Console.WriteLine(errorMsg); _logService?.AddLog("ERROR", errorMsg, deviceId); return null; } var dataSize = packet.BinaryData?.Length ?? 0; var msg = $"[TACHOGRAPH DATA] Устройство: {deviceId}, Размер данных: {dataSize} байт"; Console.WriteLine(msg); _logService?.AddLog("INFO", msg, deviceId, "T"); return PacketParser.BuildResponse(PacketType.AT, "1"); } private byte[]? HandleUnknown(WialonPacket packet) { Console.WriteLine($"[UNKNOWN] Неизвестный тип пакета: {packet.Type}, Сообщение: {packet.Message}"); return null; } }