Описание проекта
This commit is contained in:
235
README.md
235
README.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user