Skip to content

dimaby/ESP32C3-BLE-Transfer

Repository files navigation

ESP32C3 BLE Chunked Transfer Protocol

Надежный протокол для передачи JSON-файлов по BLE с двойной CRC32 валидацией. ESP32 работает как BLE-сервер и поддерживает безопасную передачу файлов до 64KB с контролем целостности данных.

🛡️ Особенности протокола

  • Двойная CRC32 валидация: проверка каждого чанка + глобальная проверка всего файла
  • Chunked transfer: автоматическое разбиение больших файлов на чанки по 172 байта
  • Безопасность: лимиты размера данных (64KB) и количества чанков (365)
  • Надежность: настраиваемые тайм-ауты и обработка ошибок
  • Производительность: оптимизирован для MTU=185 байт

📦 Архитектура протокола

Структура заголовка чанка (13 байт)

┌─────────────┬──────────────┬───────────┬──────────────┬───────────────┐
│ chunk_num   │ total_chunks │ data_size │ chunk_crc32  │ global_crc32  │
│   (2 байт)  │   (2 байт)   │ (1 байт)  │  (4 байта)   │  (4 байта)    │
└─────────────┴──────────────┴───────────┴──────────────┴───────────────┘

Размеры пакетов

  • MTU размер: 185 байт (максимальный размер BLE пакета)
  • Заголовок: 13 байт (метаданные чанка)
  • Данные чанка: 172 байта (185 - 13)
  • Максимальный файл: 64KB (365 чанков × 172 байта)

🔒 Система безопасности

Двойная CRC32 валидация

  1. Chunk CRC32: Проверка целостности каждого отдельного чанка
  2. Global CRC32: Проверка целостности всего файла после сборки

Ограничения безопасности

  • Максимальный размер данных: 65,536 байт (64KB)
  • Максимальное количество чанков: 365
  • Тайм-аут на чанк: 5 секунд (настраиваемый)
  • Защита от DoS-атак и переполнения памяти

🔄 Алгоритм работы

Отправка данных

  1. Вычисление глобального CRC32 для всего файла
  2. Разбиение файла на чанки по 172 байта
  3. Для каждого чанка:
    • Вычисление CRC32 чанка
    • Создание заголовка с chunk_crc32 и global_crc32
    • Отправка чанка (заголовок + данные)
    • Ожидание подтверждения

Получение данных

  1. Парсинг заголовка чанка
  2. Валидация CRC32 чанка
  3. Для первого чанка: сохранение ожидаемого global_crc32
  4. Для остальных чанков: проверка согласованности global_crc32
  5. Сборка всех чанков в один файл
  6. Финальная валидация global_crc32 собранного файла

🚀 Сборка и установка

Требования

  • ESP32C3 или совместимый микроконтроллер
  • PlatformIO для сборки firmware
  • Python 3.7+ с пакетом bleak для клиента

Сборка firmware

# Клонирование репозитория
git clone <repository-url>
cd ESP32C3-BLE-Transfer

# Сборка и загрузка в ESP32
pio run --target upload

# Мониторинг логов (опционально)
pio device monitor

Установка Python-клиента

# Создание виртуального окружения (рекомендуется)
python3 -m venv myenv
source myenv/bin/activate  # Linux/macOS

# Установка зависимостей
pip install bleak

💻 Использование

Отправка JSON-файла на ESP32

# Основная команда
python3 simple_ble_client.py path/to/file.json

# Пример
python3 simple_ble_client.py test.json

Пример логов успешной передачи

[CHUNK] Sending data in 7 chunks, total size: 1087 bytes
[CRC] Global CRC32 for entire file: 0x17D12168
[CHUNK] Sent chunk 1/7 (172 bytes data, CRC32: 0xC8FBCFCB)
...
[CHUNK] All chunks sent successfully in 5.651s
[CRC] Global CRC32 validation passed
[SUCCESS] Response received: {JSON данные}

🔧 API и интеграция

C++ (ESP32) API

#include "ChunkedBLEProtocol.h"

ChunkedBLEProtocol protocol(bleServer);

// Установка колбэков
protocol.setDataReceivedCallback([](const std::string& data) {
    // Обработка полученных данных
});

protocol.setProgressCallback([](int current, int total, bool isReceiving) {
    // Отслеживание прогресса
});

// Отправка данных
protocol.sendData(jsonString);

Python API

from chunked_ble_protocol import ChunkedBLEProtocol

protocol = ChunkedBLEProtocol(ble_client)
await protocol.initialize()

# Отправка данных
success = await protocol.send_data(json_string)

# Получение ответа
response = await protocol.wait_for_data(timeout=30.0)

📊 Конфигурация

Настраиваемые параметры

// C++ (ESP32)
protocol.setChunkTimeout(10000);  // 10 секунд на чанк
# Python (клиент)  
protocol.set_chunk_timeout(10.0)  # 10 секунд на чанк

UUID сервиса и характеристики

  • Service UUID: 5b18eb9b-747f-47da-b7b0-a4e503f9a00f
  • Characteristic UUID: 8f8b49a2-9117-4e9f-acfc-fda4d0db7408

🛠️ Диагностика и отладка

Типичные проблемы

  1. Устройство не найдено: Убедитесь, что ESP32 запущен и рекламирует BLE-Chunked
  2. CRC32 ошибки: Проверьте стабильность BLE-подключения
  3. Тайм-аут чанков: Увеличьте тайм-аут или проверьте расстояние между устройствами

Логи отладки

# Включение подробных логов в Python
export BLEAK_LOGGING=1
python3 simple_ble_client.py test.json

📈 Производительность

Бенчмарки

  • Скорость передачи: ~190 байт/сек (зависит от BLE-окружения)
  • Размер тестового файла: 1087 байт (7 чанков)
  • Время передачи: ~5.6 секунд
  • Успешность: 100% при стабильном соединении

Оптимизация

  • Минимизируйте расстояние между устройствами
  • Избегайте помех от других BLE/WiFi устройств
  • Используйте кабель USB для питания ESP32 (стабильное питание)

🤝 Вклад в проект

Этот протокол разработан для надежной передачи данных по BLE с максимальной защитой от ошибок и простотой интеграции. Для расширения функциональности или исправления багов создавайте issues и pull requests.

📄 Лицензия

MIT License - см. файл LICENSE для деталей.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published