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

7.6 KiB
Raw Blame History

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, test
  • serialization: json, bin
  • generator: 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, tcp
  • serialization: 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: классы для сериализации

Разработка и тестирование

Добавление новых генераторов

  1. Реализовать интерфейс IDataGenerator
  2. Добавить case в Server/Program.cs

Добавление новых протоколов

  1. Реализовать интерфейс IServer или IClient
  2. Добавить case в соответствующий Program.cs