# NetworkTest Прототип системы передачи данных ЭЭГ сигнала для VR-приложения Balancity. Проект демонстрирует различные подходы к сетевой коммуникации между сервером (ПО ЭЭГ) и клиентом (VR-игра) с использованием HTTP и TCP протоколов, а также различных форматов сериализации данных. ## Особенности - **Протоколы**: HTTP и TCP - **Сериализация**: JSON и MessagePack (бинарная) - **Генераторы данных**: Случайный и предсказуемый - **Производительность**: Тестирование максимальной пропускной способности - **Модульная архитектура**: Разделение на Domain, Server и Client ## Установка ### Требования - .NET 8.0 или выше - NuGet пакеты: - MessagePack - System.Text.Json (включен в .NET) ### Клонирование репозитория ```bash git clone https://git.nullptr.top/nullptr/NetworkTest.git cd NetworkTest ``` ## Сборка ### Сборка всего решения ```bash dotnet build NetworkTest.sln --configuration Release ``` ### Сборка отдельных проектов ```bash # Сервер dotnet build Server/Server.csproj --configuration Release # Клиент dotnet build Client/Client.csproj --configuration Release # Domain dotnet build Domain/Domain.csproj --configuration Release ``` ## Запуск ### Сервер Запуск сервера с различными конфигурациями: ```bash # TCP с MessagePack и случайными данными ./Server tcp bin random # TCP с JSON и предсказуемыми данными ./Server tcp json predictable # HTTP с MessagePack и предсказуемыми данными с задержкой 1000мс ./Server http bin predictable 1000 # Тест сериализации (без сети) ./Server test json random ``` **Аргументы сервера:** - `protocol`: `http`, `tcp`, `test` - `serialization`: `json`, `bin` - `generator`: `random`, `predictable` - `[delay]`: задержка в мс для предсказуемого генератора ### Клиент Запуск клиента для подключения к серверу: ```bash # TCP с MessagePack ./Client tcp bin # HTTP с JSON и сохранением кадров ./Client http json --save-dir=./frames # TCP с MessagePack и сохранением ./Client tcp bin --save-dir=./saved_frames ``` **Аргументы клиента:** - `protocol`: `http`, `tcp` - `serialization`: `json`, `bin` - `--save-dir=`: директория для сохранения полученных кадров (опционально) ## Примеры использования ### 1. Тестирование производительности TCP/BIN ```bash # Терминал 1: Запуск сервера ./Server tcp bin random # Терминал 2: Запуск клиента ./Client tcp bin ``` ### 2. Сохранение предсказуемых кадров ```bash # Терминал 1: Сервер с предсказуемыми данными ./Server tcp bin predictable 100 # Терминал 2: Клиент с сохранением ./Client tcp bin --save-dir=./test_frames ``` ### 3. Тестирование сериализации ```bash # Только тест производительности сериализации ./Server test bin random ``` ## Протокол передачи данных ### Структура пакета данных Каждый пакет содержит следующие поля: | Поле | Тип | Описание | |------|-----|----------| | concentrationIndex | double? | Индекс внимания | | relaxationIndex | double? | Индекс релаксации | | cognitiveControl | double? | Когнитивный контроль | | cognitiveLoad | double? | Когнитивная нагрузка | | alpha | double? | Альфа ритм | | beta | double? | Бета ритм | | theta | double? | Тета ритм | | smr | double? | Сенсомоторный ритм | | muWave | double? | Мю-ритм | | overlayPoint | string | Точка наложения электрода | | artifact | bool? | Наличие артефактов | | signalQuality | double? | Качество сигнала | | frameIndex | long | Индекс кадра | | timeOfDataGenerate | DateTime? | Время генерации данных | ### TCP протокол - **Magic header**: 4 байта (0xDEADBEEF) - **Длина тела**: 4 байта - **Тело**: сериализованные данные (JSON или MessagePack) ### Кадр данных Один кадр состоит из 9 пакетов: - 8 пакетов для отдельных каналов (F3, F4, C3, CZ, C4, PZ, O1, O2) - 1 пакет с overlayPoint = "ALL" ## Предсказуемый генератор Для тестирования используется предсказуемый генератор данных: - **Значения**: `1000 * (index + 1) + frameIndex` для каналов, `frameIndex` для ALL - **Артефакты**: чередуются между кадрами - **Время**: увеличивается на 1 секунду между кадрами - **Цикл**: повторяется после 1000 кадров Пример кадра: см. `Predictable Example Result/frame_0.json` ## Результаты производительности Тестирование на localhost (один сервер, один клиент): | Протокол | Сериализация | Пакетов/сек | |----------|--------------|-------------| | HTTP | JSON | 6,000 | | HTTP | BIN | 10,000 | | TCP | JSON | 160,000 | | TCP | BIN | 330,000 | По Wi-Fi: - TCP/BIN: ~150,000 пакетов/сек ## Структура проекта ``` NetworkTest/ ├── NetworkTest.sln ├── README.md ├── Server/ │ ├── Program.cs │ ├── TcpServer.cs │ ├── HttpServer.cs │ ├── IServer.cs │ └── DataGenerator/ │ ├── IDataGenerator.cs │ ├── RandomDataGenerator.cs │ └── PredictableDataGenerator.cs ├── Client/ │ ├── Program.cs │ ├── TcpClient.cs │ ├── HttpClient.cs │ ├── IClient.cs │ └── FrameAssembler.cs ├── Domain/ │ ├── Data.cs │ ├── OverlayPoints.cs │ └── Dto/ │ ├── JsonData.cs │ └── MessagePackData.cs └── Predictable Example Result/ ├── frame_0.json ├── frame_1.json └── ... ``` ## Архитектура - **Domain**: бизнес-логика и модели данных - **Server**: реализация серверной части - **Client**: реализация клиентской части - **Dto**: классы для сериализации ## Разработка и тестирование ### Добавление новых генераторов 1. Реализовать интерфейс `IDataGenerator` 2. Добавить case в `Server/Program.cs` ### Добавление новых протоколов 1. Реализовать интерфейс `IServer` или `IClient` 2. Добавить case в соответствующий Program.cs