2fe5bf351cc3bfba7722004936a0542427fafd0b
NetworkTest
Прототип системы передачи данных ЭЭГ сигнала для VR-приложения Balancity. Проект демонстрирует различные подходы к сетевой коммуникации между сервером (ПО ЭЭГ) и клиентом (VR-игра) с использованием HTTP и TCP протоколов, а также различных форматов сериализации данных.
Особенности
- Протоколы: HTTP и TCP
- Сериализация: JSON и MessagePack (бинарная)
- Генераторы данных: Случайный и предсказуемый
- Производительность: Тестирование максимальной пропускной способности
- Модульная архитектура: Разделение на Domain, Server и Client
Установка
Требования
- .NET 8.0 или выше
- NuGet пакеты:
- MessagePack
- System.Text.Json (включен в .NET)
Клонирование репозитория
git clone https://git.nullptr.top/nullptr/NetworkTest.git
cd NetworkTest
Сборка
Сборка всего решения
dotnet build NetworkTest.sln --configuration Release
Сборка отдельных проектов
# Сервер
dotnet build Server/Server.csproj --configuration Release
# Клиент
dotnet build Client/Client.csproj --configuration Release
# Domain
dotnet build Domain/Domain.csproj --configuration Release
Запуск
Сервер
Запуск сервера с различными конфигурациями:
# 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,testserialization:json,bingenerator:random,predictable[delay]: задержка в мс для предсказуемого генератора
Клиент
Запуск клиента для подключения к серверу:
# TCP с MessagePack
./Client tcp bin
# HTTP с JSON и сохранением кадров
./Client http json --save-dir=./frames
# TCP с MessagePack и сохранением
./Client tcp bin --save-dir=./saved_frames
Аргументы клиента:
protocol:http,tcpserialization:json,bin--save-dir=<path>: директория для сохранения полученных кадров (опционально)
Примеры использования
1. Тестирование производительности TCP/BIN
# Терминал 1: Запуск сервера
./Server tcp bin random
# Терминал 2: Запуск клиента
./Client tcp bin
2. Сохранение предсказуемых кадров
# Терминал 1: Сервер с предсказуемыми данными
./Server tcp bin predictable 100
# Терминал 2: Клиент с сохранением
./Client tcp bin --save-dir=./test_frames
3. Тестирование сериализации
# Только тест производительности сериализации
./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: классы для сериализации
Разработка и тестирование
Добавление новых генераторов
- Реализовать интерфейс
IDataGenerator - Добавить case в
Server/Program.cs
Добавление новых протоколов
- Реализовать интерфейс
IServerилиIClient - Добавить case в соответствующий Program.cs
Description
Languages
C#
100%