Files
NetworkTest/README.md
2025-09-20 00:11:06 +03:00

237 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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