Описание проекта
This commit is contained in:
235
README.md
235
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=<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