237 lines
7.6 KiB
Markdown
237 lines
7.6 KiB
Markdown
# 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
|
||
|