Описание проекта

This commit is contained in:
Пытков Роман
2025-09-20 00:11:06 +03:00
parent 0ee87320a6
commit 6a057d26da

235
README.md
View File

@@ -1 +1,236 @@
# NetworkTest # 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=<path>`: директория для сохранения полученных кадров (опционально)
## Примеры использования
### 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