Надежный протокол для передачи JSON-файлов по BLE с двойной CRC32 валидацией. ESP32 работает как BLE-сервер и поддерживает безопасную передачу файлов до 64KB с контролем целостности данных.
- Двойная CRC32 валидация: проверка каждого чанка + глобальная проверка всего файла
- Chunked transfer: автоматическое разбиение больших файлов на чанки по 172 байта
- Безопасность: лимиты размера данных (64KB) и количества чанков (365)
- Надежность: настраиваемые тайм-ауты и обработка ошибок
- Производительность: оптимизирован для MTU=185 байт
┌─────────────┬──────────────┬───────────┬──────────────┬───────────────┐
│ 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 байта)
- Chunk CRC32: Проверка целостности каждого отдельного чанка
- Global CRC32: Проверка целостности всего файла после сборки
- Максимальный размер данных: 65,536 байт (64KB)
- Максимальное количество чанков: 365
- Тайм-аут на чанк: 5 секунд (настраиваемый)
- Защита от DoS-атак и переполнения памяти
- Вычисление глобального CRC32 для всего файла
- Разбиение файла на чанки по 172 байта
- Для каждого чанка:
- Вычисление CRC32 чанка
- Создание заголовка с chunk_crc32 и global_crc32
- Отправка чанка (заголовок + данные)
- Ожидание подтверждения
- Парсинг заголовка чанка
- Валидация CRC32 чанка
- Для первого чанка: сохранение ожидаемого global_crc32
- Для остальных чанков: проверка согласованности global_crc32
- Сборка всех чанков в один файл
- Финальная валидация global_crc32 собранного файла
- ESP32C3 или совместимый микроконтроллер
- PlatformIO для сборки firmware
- Python 3.7+ с пакетом
bleakдля клиента
# Клонирование репозитория
git clone <repository-url>
cd ESP32C3-BLE-Transfer
# Сборка и загрузка в ESP32
pio run --target upload
# Мониторинг логов (опционально)
pio device monitor# Создание виртуального окружения (рекомендуется)
python3 -m venv myenv
source myenv/bin/activate # Linux/macOS
# Установка зависимостей
pip install bleak# Основная команда
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 данные}
#include "ChunkedBLEProtocol.h"
ChunkedBLEProtocol protocol(bleServer);
// Установка колбэков
protocol.setDataReceivedCallback([](const std::string& data) {
// Обработка полученных данных
});
protocol.setProgressCallback([](int current, int total, bool isReceiving) {
// Отслеживание прогресса
});
// Отправка данных
protocol.sendData(jsonString);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 секунд на чанк- Service UUID:
5b18eb9b-747f-47da-b7b0-a4e503f9a00f - Characteristic UUID:
8f8b49a2-9117-4e9f-acfc-fda4d0db7408
- Устройство не найдено: Убедитесь, что ESP32 запущен и рекламирует
BLE-Chunked - CRC32 ошибки: Проверьте стабильность BLE-подключения
- Тайм-аут чанков: Увеличьте тайм-аут или проверьте расстояние между устройствами
# Включение подробных логов в 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 для деталей.