diff --git a/README.md b/README.md index 7ee432f..226e147 100644 --- a/README.md +++ b/README.md @@ -1 +1,236 @@ # 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 +