# ADR-003: Аппаратная платформа постамата

**Дата:** 2026-03-26
**Статус:** Proposed
**Контекст:** Выбор аппаратной платформы и ПО постамата — ключевое решение, влияющее на стоимость, сроки, безопасность и масштабируемость проекта. Рассматриваются три варианта: готовое решение (ESI), кастомная сборка на ESP32/Arduino, кастомная сборка на промышленных контроллерах.

**Модель взаимодействия:** Постамат работает как **headless-устройство** (без экрана). Открытые полки с ремнями-фиксаторами (стрепами) вместо закрытых ячеек с замками. Весь пользовательский интерфейс — в мобильном приложении (Flutter). Взаимодействие:
1. Пользователь сканирует **QR-код** на корпусе постамата → приложение идентифицирует постамат
2. В приложении выбирает оборудование, оплачивает
3. Приложение показывает **на какой полке** размещён предмет (номер полки, фото)
4. Пользователь подходит к постамату, **отстёгивает ремень** и забирает предмет
5. Пользователь **фотографирует** взятый предмет через приложение (фото-верификация с камеры телефона)
6. При возврате — аналогично: размещает на полке, застёгивает ремень, фотографирует через приложение

---

## 1. Требования к постамату

### 1.1 Функциональные требования (HW-F)

| ID | Требование | Приоритет | Обоснование |
|----|-----------|-----------|-------------|
| HW-F01 | 8-24 открытых полки с ремнями-фиксаторами (стрепами) | P0 | Базовая функция. Нет замков — предметы фиксируются ремнями |
| HW-F02 | BLE для идентификации пользователя и постамата | P0 | Основной способ взаимодействия — через смартфон |
| HW-F03 | Фото-верификация с камеры телефона пользователя | P0 | ADR-001 §9: пользователь фотографирует предмет при взятии/возврате. Без весового контроля, без камер на ячейках |
| HW-F04 | Связь 4G/LTE с сервером (MQTT over TLS) | P0 | ADR-001 §11, управление и телеметрия |
| HW-F05 | Offline-режим: приём возвратов без связи | P0 | ADR-001 §13 |
| HW-F06 | QR-код на корпусе постамата (идентификация постамата) | P0 | Пользователь сканирует QR → открывает постамат в приложении |
| HW-F07 | Опционально: 1 обзорная IP-камера для безопасности | P2 | Общий обзор постамата, антивандальная фиксация. Верификация предметов — с телефона |
| HW-F08 | N/A (нет дверей) | — | Открытые полки, нет замков и дверей → герконы не нужны |
| HW-F09 | Датчик вскрытия корпуса (тампер) | P1 | Антивандальная защита |
| HW-F10 | Акселерометр (детекция ударов/вибрации) | P2 | Дополнительная защита |
| HW-F11 | OTA-обновление прошивки/ПО | P0 | Обслуживание парка без выезда |
| HW-F12 | Watchdog (аппаратный перезапуск при зависании) | P0 | Бесперебойная работа |
| HW-F13 | LED-индикация полок (опционально) | P2 | Подсветка нужной полки. Менее критично — приложение показывает номер полки |
| HW-F14 | USB ID Check (серийный номер оборудования) | P2 | Для электроники с USB |
| HW-F15 | ~~Тензодатчик~~ — убран | — | Нет весового контроля. Верификация — фото с телефона пользователя |
| HW-F16 | Звуковой сигнал (подтверждение действия) | P1 | Обратная связь пользователю без экрана |
| HW-F17 | NFC как альтернатива BLE | P2 | Fallback для устройств без BLE |
| HW-F18 | Тачскрин | P3 | Не требуется — весь UI на смартфоне |

### 1.2 Нефункциональные требования (HW-NF)

| ID | Требование | Приоритет | Значение |
|----|-----------|-----------|----------|
| HW-NF01 | Рабочая температура | P0 | +5...+40°C (для ТЦ), -25...+50°C (улица) |
| HW-NF02 | Электробезопасность | P0 | ТР ТС 004/2011 |
| HW-NF03 | Пожарная безопасность | P0 | ФЗ-123 |
| HW-NF04 | Корпус: сталь ≥1.5 мм | P0 | Антивандальная защита |
| HW-NF05 | ~~Замки: fail-secure~~ — убран (нет замков) | — | Открытые полки с ремнями |
| HW-NF06 | Энергопотребление ≤100 Вт | P1 | Экономичность, теплоотвод |
| HW-NF07 | ИБП (30+ мин автономной работы) | P1 | Защита от отключения питания |
| HW-NF08 | IP-защита ≥IP54 (помещение) | P1 | Пылевлагозащита |
| HW-NF09 | MTBF ≥50 000 часов | P1 | Надёжность |
| HW-NF10 | Масштабируемость: управление парком 100+ устройств | P1 | MDM/fleet management |
| HW-NF11 | Secure Boot / шифрование прошивки | P1 | Защита от реверса |
| HW-NF12 | Per-device credentials (не общий ключ) | P0 | Компрометация одного не даёт доступ к другим |
| HW-NF13 | ~~Время открытия ячейки ≤3 сек~~ — убран (нет замков) | — | Пользователь сам отстёгивает ремень |
| HW-NF14 | Срок поставки ≤4 недели | P1 | Time-to-market |
| HW-NF15 | Стоимость BOM ≤100 000 руб./постамат | P1 | Юнит-экономика (значительно снижена за счёт отсутствия замков, камер, тензодатчиков) |

---

## 2. Варианты решений

### Вариант A: ESI PST Open + свой бэкенд (готовое решение)

**Архитектура:**
```
┌──────────────────────────────────────────┐
│          ESI PST Open (постамат)         │
│  ┌────────────┐  ┌────────────────────┐  │
│  │ ESI OS     │  │ Плата управления   │  │
│  │ (проприет.)│──│ замками (проприет.)│  │
│  └─────┬──────┘  └────────────────────┘  │
│        │ (тачскрин опционален)           │
└────────┼─────────────────────────────────┘
         │ ESI API (REST, Bearer Token)
┌────────▼─────────────────────────────────┐
│         Наш бэкенд (Go)                 │
│  Бизнес-логика аренды, оплата, RFID     │
│  ← Flutter-приложение (весь UI)         │
└──────────────────────────────────────────┘
```

**Покрытие требований:**

| ID | Требование | Статус | Комментарий |
|----|-----------|--------|-------------|
| HW-F01 | Открытые полки с ремнями | ❌ | ESI — закрытые ячейки с замками, не подходит для новой концепции |
| HW-F02 | BLE | ❌ | **ESI не поддерживает BLE** — только PIN/QR через ESI OS |
| HW-F03 | Фото-верификация с телефона | ⚠️ | Не зависит от постамата — делается в приложении |
| HW-F04 | 4G/LTE + MQTT | ❌ | Только ESI API (REST), нет MQTT |
| HW-F05 | Offline-режим | ✅ | Встроен в ESI OS |
| HW-F06 | QR на корпусе | ✅ | Статический QR, тривиально |
| HW-F07 | Обзорная IP-камера | ⚠️ | Опция ESI, но 1 камера достаточно |
| HW-F08 | N/A (нет дверей) | — | Не требуется |
| HW-F09 | Тампер | ⚠️ | Нет данных |
| HW-F10 | Акселерометр | ❌ | Нет |
| HW-F11 | OTA | ✅ | Обновления ESI OS |
| HW-F12 | Watchdog | ✅ | Аппаратный |
| HW-F13 | LED-индикация полок | ⚠️ | Нет данных о программируемых LED |
| HW-F14 | USB ID Check | ✅ | Уникальная технология ESI |
| HW-F15 | ~~Весовой датчик~~ | — | Убран из требований |
| HW-NF11 | Secure Boot | ⚠️ | Закрытая система, нет данных |
| HW-NF12 | Per-device cred | ⚠️ | Управляется ESI |

**Стоимость:**
| Компонент | Цена |
|-----------|------|
| ESI PST CM A (7 ячеек) | 85 000 руб. |
| ESI PST CM B (14-23 ячейки) | 120 000-180 000 руб. |
| ESI LK Open (мониторинг) | 450 руб./мес./устройство |
| Кастомизация ПО (опция) | от 300 000 руб. (единоразово) |
| **Итого (14 ячеек, 1 год)** | **~125 400 руб.** |

**Плюсы:**
- Быстрый запуск: 1-2 недели от заказа до работы
- Готовое железо с сертификацией
- Offline-режим из коробки
- USB ID Check для аренды электроники
- Российский производитель (нет санкционных рисков)

**Минусы:**
- **Концепция не совпадает**: ESI — закрытые ячейки с замками, наш постамат — открытые полки с ремнями
- **Vendor lock-in**: нельзя поставить своё ПО, только API
- **API ограничен**: нет MQTT
- **Нет BLE** — критическое ограничение для headless-модели
- Зависимость от облака ESI (LK)
- Переплата за ненужные замки и механизмы

**Риски:**
- Банкротство ESI → потеря доступа к API и обновлениям
- Изменение тарифов ESI
- Невозможность реализовать уникальные фичи (cross-return через BLE, RFID-инвентаризация)

---

### Вариант B: ESP32 headless (Arduino-подход)

**Архитектура:**
```
┌──────────────────────────────────────────┐
│      Постамат (ESP32 headless)           │
│      Открытые полки с ремнями            │
│  ┌────────────┐  ┌────────────────────┐  │
│  │ ESP32-S3   │  │ SIM7600 (4G)      │  │
│  │ (FreeRTOS) │  │ MQTT over TLS     │  │
│  │ - BLE 5.0  │  └────────────────────┘  │
│  │ - MQTT/TLS │                          │
│  └─────┬──────┘  [QR-код на корпусе]     │
│        │                                 │
│  ┌─────▼──────┐                          │
│  │ LED strip  │  (опционально)           │
│  │ (WS2812B)  │                          │
│  └────────────┘                          │
│  [Опц: 1 IP-камера обзорная]            │
└──────────────────────────────────────────┘
         ↕ BLE
┌──────────────────────────────────────────┐
│  Смартфон (Flutter) — весь UI            │
│  Фото-верификация с камеры телефона      │
└──────────────────────────────────────────┘
```

**Покрытие требований:**

| ID | Требование | Статус | Комментарий |
|----|-----------|--------|-------------|
| HW-F01 | Открытые полки с ремнями | ✅ | Нет электроники — просто полки и ремни. ESP32 не управляет замками |
| HW-F02 | BLE | ✅ | **BLE 5.0 встроен** — идентификация пользователя/постамата |
| HW-F03 | Фото-верификация с телефона | ✅ | Реализуется в Flutter-приложении, не на постамате |
| HW-F04 | 4G/LTE + MQTT | ✅ | SIM7600 + TinyGSM + PubSubClient |
| HW-F05 | Offline-режим | ⚠️ | Ограничен (SPIFFS/LittleFS, не полноценная СУБД) |
| HW-F06 | QR на корпусе | ✅ | Статическая наклейка |
| HW-F07 | Обзорная IP-камера (опц.) | ⚠️ | Отдельная IP-камера, не управляется ESP32 |
| HW-F08 | N/A (нет дверей) | — | Открытые полки |
| HW-F09 | Тампер | ✅ | GPIO |
| HW-F10 | Акселерометр | ✅ | I2C (ADXL345, LIS3DH) |
| HW-F11 | OTA | ✅ | ESP-IDF OTA с подписью |
| HW-F12 | Watchdog | ✅ | Встроен в ESP32 |
| HW-F13 | LED-индикация полок (опц.) | ✅ | WS2812B (адресные LED), GPIO |
| HW-F14 | USB ID Check | ❌ | ESP32-S3 — USB Host возможен (USB OTG), но нетривиально |
| HW-F15 | ~~Весовой датчик~~ | — | Убран из требований |
| HW-F16 | Звуковой сигнал | ✅ | Пьезозуммер, GPIO |
| HW-NF09 | MTBF ≥50K | ❌ | Нет данных, нет сертификации |
| HW-NF11 | Secure Boot | ⚠️ | Есть, но обходится EMFI (CVE-2023-35818) |
| HW-NF12 | Per-device cred | ✅ | Encrypted NVS |

**Стоимость:**
| Компонент | Цена |
|-----------|------|
| ESP32-S3 DevKit | $10-15 |
| SIM7600 4G модем | $25-35 |
| LED-индикация (WS2812B, опц.) | $5-10 |
| Блок питания 5V | $10-15 |
| Ремни-фиксаторы (стрепы) ×16 | $30-85 (~3 000-8 000 руб.) |
| Корпус с полками (стальной, заказной) | $200-400 |
| Опционально: 1 IP-камера обзорная | $20-55 (~2 000-5 000 руб.) |
| Прочее (провода, PCB, монтаж) | $30-60 |
| **Итого** | **$330-675 (~30 000-62 000 руб.)** |

**Безопасность ESP32 — критические уязвимости:**

| CVE | Описание | Критичность |
|-----|---------|-------------|
| CVE-2023-35818 | EMFI обход Secure Boot + Flash Encryption (все ревизии ESP32) | **Критическая** — на уровне железа, не исправляется программно |
| CVE-2025-27840 | 29 скрытых HCI-команд в BLE стеке, запись в память | Средняя — требует физ. доступ |
| CVE-2025-55297 | RCE через BluFi (BLE-провижининг) | Средняя — если BluFi включён |
| CVE-2020-13629 | EM-глич обход на rev 0/1 | Низкая — исправлено в новых ревизиях |

**Плюсы:**
- **Минимальная стоимость** (~30-62K руб.) — самый дешёвый вариант, значительно дешевле с открытыми полками
- **BLE 5.0 встроен** — идеально для headless-модели
- **Радикально простая электроника** — нет реле, герконов, HX711, камер OV5640, USB Hub
- Полный контроль над железом и ПО
- Низкое энергопотребление (~3-5 Вт)
- Без экрана, без замков — минимум точек отказа и вандализма

**Минусы:**
- **Нет промышленной надёжности** (MTBF, сертификация)
- **Уязвимости на уровне железа** (EMFI) не исправляются программно
- **Нет TPM** — ключи хранятся в eFuse (менее защищено)
- Offline: SPIFFS/LittleFS ≠ полноценная СУБД (ограничение ~4 MB)
- Масштабирование на 100+ устройств — нужно строить fleet management с нуля
- Время разработки прошивки: 1.5-2 месяца (с ИИ-агентами)
- BLE-стек имеет CVE (CVE-2025-27840, CVE-2025-55297) — а BLE теперь критический путь

**Вердикт:** Открытые полки с ремнями радикально упрощают ESP32-вариант: нет реле, герконов, тензодатчиков, камер. ESP32 по сути — BLE-маяк + 4G-связь с сервером. BLE используется только для идентификации, не для управления замками (их нет). Рекомендуется для прототипа/MVP.

---

### Вариант C: Промышленный SBC headless (рекомендуемый)

Два подварианта (без экрана — не нужны панельные ПК):

#### C1: RPi CM4/CM5 + carrier board + BLE (через ESP32 или USB)

**Архитектура (рекомендуемая):**
```
┌──────────────────────────────────────────────────┐
│            Постамат (RPi headless)                │
│            Открытые полки с ремнями               │
│  ┌──────────────────────────────┐                │
│  │ RPi CM4/CM5 + carrier board  │                │
│  │ (EmbeddedPi / Pineboards)    │                │
│  │ - Linux (Raspberry Pi OS)    │                │
│  │ - Go Core Service            │                │
│  │ - MQTT клиент (TLS 1.3)     │                │
│  │ - SQLite WAL (offline)      │                │
│  │ - 4G LTE (mPCIe/USB)       │                │
│  └────────────┬─────────────────┘                │
│               │ UART / RS-485                    │
│  ┌────────────▼─────────────────┐                │
│  │ ESP32 (BLE + датчики)        │                │
│  │ - BLE 5.0 (связь с телефоном)│                │
│  │ - LED-индикация (WS2812B)   │                │
│  │ - Акселерометр / тампер     │                │
│  │ - Watchdog на RPi           │                │
│  └──────────────────────────────┘                │
│  [QR-код на корпусе]                             │
│  [Опц: 1 IP-камера обзорная]                    │
└──────────────────────────────────────────────────┘
         ↕ BLE
┌──────────────────────────────────────────────────┐
│  Смартфон (Flutter) — весь UI                    │
│  Фото-верификация с камеры телефона              │
└──────────────────────────────────────────────────┘
```

#### C2: RPi CM4/CM5 + Wiren Board Modbus реле (без ESP32)

**Архитектура:**
```
┌──────────────────────────────────────────────────┐
│            Постамат (RPi + Modbus)               │
│            Открытые полки с ремнями               │
│  ┌──────────────────────────────┐                │
│  │ RPi CM4/CM5 + carrier board  │                │
│  │ (RS-485 на carrier board)    │                │
│  │ - Linux + Go Core Service    │                │
│  │ - BLE через USB-донгл       │                │
│  │ - SQLite WAL                │                │
│  │ - 4G LTE (mPCIe)           │                │
│  └──────────────────────────────┘                │
│  [QR-код на корпусе]                             │
│  [Опц: 1 IP-камера обзорная]                    │
└──────────────────────────────────────────────────┘
         ↕ BLE (USB-донгл)
┌──────────────────────────────────────────────────┐
│  Смартфон (Flutter) — весь UI                    │
│  Фото-верификация с камеры телефона              │
└──────────────────────────────────────────────────┘
```

**Покрытие требований (подварианты C):**

| ID | Требование | C1 (RPi+ESP32) | C2 (RPi+Modbus) |
|----|-----------|:---:|:---:|
| HW-F01 | Открытые полки с ремнями | ✅ | ✅ |
| HW-F02 | BLE | ✅ ESP32 нативный | ⚠️ USB-донгл (менее надёжно) |
| HW-F03 | Фото-верификация с телефона | ✅ В приложении | ✅ В приложении |
| HW-F04 | 4G/LTE + MQTT | ✅ mPCIe/USB | ✅ mPCIe/USB |
| HW-F05 | Offline SQLite | ✅ полноценно | ✅ полноценно |
| HW-F06 | QR на корпусе | ✅ | ✅ |
| HW-F07 | Обзорная IP-камера (опц.) | ✅ USB/IP | ✅ USB/IP |
| HW-F08 | N/A (нет дверей) | — | — |
| HW-F09 | Тампер | ✅ (ESP32 GPIO) | ✅ (RPi GPIO) |
| HW-F10 | Акселерометр | ✅ (ESP32 I2C) | ✅ (RPi I2C) |
| HW-F11 | OTA | ✅ SSH/Ansible | ✅ SSH/Ansible |
| HW-F12 | Watchdog | ✅ (ESP32→RPi) | ✅ (RPi встроен) |
| HW-F13 | LED-индикация полок (опц.) | ✅ (ESP32 WS2812B) | ⚠️ через GPIO expander |
| HW-F14 | USB ID Check | ✅ USB Host | ✅ USB Host |
| HW-F15 | ~~Весовой датчик~~ | — | — |
| HW-F16 | Звуковой сигнал | ✅ (ESP32 GPIO) | ✅ (RPi GPIO) |
| HW-NF09 | MTBF ≥50K | ~50K ч | ~50K ч |
| HW-NF11 | Secure Boot | ✅ | ✅ |
| HW-NF12 | Per-device cred | ✅ | ✅ |

**Стоимость:**

| Компонент | C1 (RPi+ESP32) | C2 (RPi+Modbus) |
|-----------|:---:|:---:|
| RPi CM4 (4GB/32GB) + carrier | $100-200 | $100-200 |
| ESP32 (датчики, LED) | $10-15 | — |
| BLE | встроен в ESP32 | USB-донгл $10-15 |
| 4G модем (mPCIe/USB) | $30-50 | $30-50 |
| LED-индикация (опц.) | $5-10 | $10-20 |
| Ремни-фиксаторы (стрепы) ×16 | $30-85 | $30-85 |
| Корпус с полками (сталь) | $200-400 | $200-400 |
| БП + ИБП | $50-100 | $50-100 |
| Опционально: 1 IP-камера обзорная | $20-55 | $20-55 |
| Прочее | $30-60 | $30-60 |
| **Итого** | **$475-975** | **$480-985** |
| **В рублях (~92 руб./$)** | **~44-90K** | **~44-91K** |

**Время разработки (с ИИ-агентами):**
| Подвариант | Срок | Основная задача |
|-----------|------|-----------------|
| C1 (RPi+nRF+ESP32) | 1-1.5 мес. | Go Core Service + ESP32 firmware (замки/датчики) + BlueZ BLE + UART протокол |
| C2 (RPi+Modbus) | 1-1.5 мес. | Go Core Service + Modbus драйвер + BLE (bluez) |

---

## 3. Сравнительная матрица

| Критерий | A (ESI) | B (ESP32, MVP) | C1 (RPi+nRF+ESP32, продакшен) |
|----------|:---:|:---:|:---:|
| **Цена (16 полок)** | 120-180K | 30-62K | 44-90K |
| **Время запуска** | 1-2 нед. | 1.5-2 мес. | 1-1.5 мес. |
| **BLE** | ❌ | ✅ нативный ESP32-S3 | ✅ nRF52840 dongle + BlueZ |
| **BLE безопасность** | — | Средняя (ESP32 CVE не удалённые) | **Высокая** (CryptoCell CC310, 0 удалённых CVE) |
| **Верификация (фото с телефона)** | ⚠️ не зависит от постамата | ✅ в приложении | ✅ в приложении |
| **Offline SQLite** | ✅ (ESI OS) | ⚠️ ограничен 4MB | ✅ полноценно |
| **MQTT over TLS** | ❌ | ✅ | ✅ |
| **LED-индикация** | ⚠️ | ✅ WS2812B | ✅ WS2812B (ESP32 slave) |
| **Vendor lock-in** | **Высокий** | Нет | Нет |
| **Масштабирование 100+** | ✅ (ESI LK) | ❌ самостоятельно | ✅ Ansible/SSH |
| **Надёжность (MTBF)** | Нет данных | Нет данных | ~50K ч |
| **Энергопотребление** | ~30-50 Вт | ~5-15 Вт | ~10-20 Вт |
| **Сертификация** | ✅ готова | ❌ нужна | ⚠️ нужна |
| **Challenge-response** | ❌ | ✅ Ed25519 | ✅ Ed25519 |

---

## 4. Анализ безопасности BLE

### 4.1 CVE ESP32 — реальная угроза для постамата?

| CVE | Суть | Удалённо через BLE? | Условия эксплуатации | Угроза для постамата |
|-----|------|:---:|-----|:---:|
| **CVE-2025-27840** | 29 скрытых HCI-команд (запись в память, смена MAC) | **Нет** | Физический доступ к UART/USB. Espressif подтвердили: HCI-команды не вызываются через BLE-радиоканал | **Низкая** |
| **CVE-2025-55297** | RCE через BluFi (BLE Wi-Fi provisioning) | Да, но только если BluFi включён | BluFi — опциональный компонент ESP-IDF. Если не компилируется в прошивку — уязвимость отсутствует | **Нулевая** (не используем BluFi) |
| **CVE-2023-35818** | EMFI обход Secure Boot + Flash Encryption | **Нет** | Спецоборудование (~$2.5K), EM-зонд с точностью до микрометров, часы калибровки, success rate ~1% | **Минимальная** (нереалистично в ТЦ) |
| **CVE-2020-13629** | EM-глич обход Secure Boot на rev 0/1 | **Нет** | Физический доступ, старые ревизии | **Нулевая** (используем ESP32-S3) |

**Вывод: ни одна CVE ESP32 не эксплуатируется удалённо через BLE-радиоканал.** Все требуют физического доступа к плате или используют неактивные компоненты.

### 4.2 Реальные угрозы BLE (для любого чипа)

Протокольные атаки, одинаковые для ESP32, nRF52840, STM32WB, любого BLE-чипа:

| Атака | Описание | Опасность без защиты | Решение | Опасность с защитой |
|-------|---------|:---:|---------|:---:|
| **Replay** | Перехват и повтор BLE-команды открытия | Высокая | Серверный nonce + TTL 30 сек + Ed25519 подпись | **Нулевая** |
| **MitM** | Перехват и модификация BLE-трафика | Средняя | BLE LE Secure Connections (ECDH P-256) + challenge-response | **Низкая** |
| **Relay** | Ретрансляция BLE на расстоянии (два устройства) | Средняя для авто-ключей | GPS-проверка + явное действие пользователя в приложении | **Минимальная** |
| **Brute-force PIN** | Перебор 6-цифрового PIN при BLE pairing | Средняя | Rate limiting + lockout после N попыток | **Низкая** |

**Relay attack неактуален для постамата** — в отличие от автомобильных ключей (passive entry), пользователь должен сам нажать «Открыть» в приложении. Зачем ему это делать, если он не у постамата?

### 4.3 Решение: Challenge-Response поверх BLE (Ed25519)

BLE используется **только как транспорт**. Безопасность — на прикладном уровне:

```
Сервер                    Приложение                 Постамат
  │                          │                          │
  │◄── «взять с полки 5» ────┤                          │
  │    + GPS координаты      │                          │
  │                          │                          │
  │── проверка GPS ──────────│                          │
  │── challenge ────────────►│                          │
  │   {nonce, timestamp,     │                          │
  │    locker_id, shelf_id}  │                          │
  │                          │                          │
  │── signed_token ─────────►│                          │
  │   Ed25519(server_key,    │── signed_token ─────────►│
  │     nonce+ts+locker+cell)│      через BLE GATT      │
  │                          │                          │
  │                          │   верифицирует подпись    │
  │                          │   (публичный ключ сервера)│
  │                          │   проверяет nonce (не был │
  │                          │   использован) + TTL      │
  │                          │                          │
  │                          │◄── OK, доступ подтверждён ┤
```

**Почему это надёжно:**
- **Replay невозможен**: nonce одноразовый, постамат хранит последние N использованных nonce
- **Подделка невозможна**: без приватного ключа сервера нельзя создать валидную подпись
- **Компрометация постамата бесполезна**: в нём только публичный ключ сервера — подделать токены нельзя
- **TTL 30 сек**: перехваченный токен истекает быстрее, чем атакующий может его использовать
- **GPS-привязка**: сервер проверяет, что телефон в радиусе 50 м от постамата

**Индустриальный стандарт:** Nuki, August, Yale — все используют аналогичный challenge-response поверх BLE. Никто не полагается на BLE security level как основную защиту.

### 4.4 Альтернативные BLE-чипы

| Чип | BLE | HW Crypto | TrustZone | PSA | Публичные CVE | Цена модуля | Подключение к RPi |
|-----|:---:|-----------|:---------:|:---:|:---:|:-----------:|:-----------------:|
| **ESP32-S3** | 5.0 | AES акселератор | Нет | Нет | 3 (не удалённые) | $2-3 | встроен |
| **Nordic nRF52840** | 5.4 | CryptoCell CC310 | Нет | Нет | 1 (физический) | $5-9 | UART / USB dongle |
| **Nordic nRF5340** | 5.4 | CryptoCell CC312 | **Да** | **Level 2** | минимальные | $8-12 | UART / USB |
| **STM32WB55** | 5.0 | AES-256, PKA | **Да** | Нет | 1 (ATT deadlock) | $6-10 | UART |
| **TI CC2652** | 5.1 | AES-128/256 | Нет | Нет | 0 (для CC2652) | $5-8 | UART |

**nRF52840** — лучший по соотношению цена/безопасность. Используется в Yale, August. CryptoCell CC310 — аппаратный AES, SHA, ECDSA, ECDH, RNG.

### 4.5 USB BLE Dongle как альтернатива ESP32 для BLE

| Донгл | Чип | Цена | Как работает с RPi |
|-------|-----|:----:|-------------------|
| **Nordic nRF52840 Dongle** (PCA10059) | nRF52840 | $10-12 | Прошивается Zephyr `hci_usb` → стандартный HCI USB → BlueZ на RPi |
| Makerdiary nRF52840 MDK | nRF52840 | ~$15 | Open-source, хорошая документация |
| Стандартные USB BLE адаптеры | Realtek RTL8761B / CSR8510 | $5-15 | Работают с BlueZ, но менее стабильны 24/7 |

**BlueZ (Linux, 20+ лет) vs NimBLE (ESP32):**

| Аспект | BlueZ на RPi + nRF52840 dongle | NimBLE на ESP32 |
|--------|-------------------------------|-----------------|
| Зрелость | 20+ лет, аудит Google/Intel | Относительно молодой |
| Обновления | `apt upgrade` — без перепрошивки | Требует OTA перепрошивки ESP32 |
| Поверхность атаки | Шире (Classic BT + BLE), но патчится быстро | Уже, но патчинг через OTA |
| Стабильность 24/7 | Иногда нужен перезапуск `bluetoothd` (watchdog) | Стабильнее для dedicated BLE |
| Latency | ~2-5 мс | ~2-5 мс |
| Одновременных подключений | до 20 | до 9 (NimBLE) |

### 4.6 Безопасность по вариантам (итог)

#### Вариант A (ESI) — Средний уровень

| Угроза | Защита | Оценка |
|--------|--------|--------|
| Физический взлом | Открытые полки — физическая защита минимальна, сталь корпуса | ⚠️ |
| Реверс прошивки | Закрытая экосистема (security by obscurity) | ⚠️ |
| MITM на API | TLS, Bearer Token | ✅ |
| BLE | Не поддерживается | ❌ |
| Отключение питания | Ремни не зависят от питания | ✅ |

#### Вариант B (ESP32 headless) — Средний уровень (с challenge-response)

| Угроза | Защита | Оценка |
|--------|--------|--------|
| CVE-2025-27840 (HCI) | Не эксплуатируется через BLE-радио | ✅ |
| CVE-2025-55297 (BluFi) | BluFi не используется, не компилируется | ✅ |
| CVE-2023-35818 (EMFI) | Требует физ. доступ + спецоборудование | ⚠️ |
| BLE Replay | Challenge-response: серверный nonce + TTL 30 сек + Ed25519 | ✅ |
| BLE MitM | LESC (ECDH P-256) + challenge-response | ✅ |
| BLE Relay | GPS-проверка + явное действие пользователя | ✅ |
| Дамп прошивки | Secure Boot v2 + Flash Encryption + eFuse (JTAG/UART disable) | ⚠️ |
| Компрометация постамата | Только публичный ключ сервера → подделать токены нельзя | ✅ |
| Физический взлом | Открытые полки — физическая защита минимальна, зависит от размещения (ТЦ, камеры) | ⚠️ |

#### Вариант C1 (RPi + nRF52840 dongle) — Высокий уровень

| Угроза | Защита | Оценка |
|--------|--------|--------|
| Реверс прошивки RPi | LUKS, Secure Boot | ✅ |
| BLE CVE | nRF52840: минимум CVE, CryptoCell CC310 | ✅ |
| BLE Replay/MitM/Relay | Challenge-response + GPS + LESC | ✅ |
| MITM на MQTT | mTLS, VPN (WireGuard) | ✅ |
| Компрометация одного устройства | Per-device ключи, публичный ключ сервера | ✅ |
| Физический взлом | Открытые полки — физическая защита минимальна, тампер + акселерометр на корпусе | ⚠️ |
| OTA-подмена | Подписанные образы, A/B partition, rollback protection | ✅ |
| Отключение питания | Ремни не зависят от питания + ИБП 30 мин для электроники | ✅ |

---

## 5. Рекомендуемая стратегия

### Фаза 1: MVP (0-2 месяца) — Вариант B (ESP32 headless)

**Цель:** Быстрый и дешёвый прототип для валидации бизнес-гипотезы.

- Открытые полки с ремнями-фиксаторами (стрепами) — нет замков, реле, герконов
- ESP32-S3 headless контроллер (~30-62K руб.) — радикально упрощён
- BLE — идентификация пользователя/постамата (встроен в ESP32)
- QR-код на корпусе — идентификация постамата
- Фото-верификация с камеры телефона пользователя (в Flutter-приложении)
- 4G через SIM7600 → MQTT over TLS → бэкенд
- Flutter-приложение — весь пользовательский интерфейс
- Challenge-response (Ed25519) для BLE-команд — защита от replay/MitM
- Secure Boot v2 + Flash Encryption обязательны
- BluFi **не включать** в прошивку (CVE-2025-55297)
- Ограничения MVP: offline ограничен (SPIFFS)

**Почему не ESI для MVP:** ESI не поддерживает BLE — а BLE теперь основной канал взаимодействия (headless-модель). ESI работает через тачскрин + PIN/QR через собственное ПО, что противоречит концепции «весь UI на телефоне».

**Критерий перехода к Фазе 2:** >50 аренд/месяц, подтверждённый unit-economics, необходимость полноценного offline.

### Фаза 2: Продакшен (2-4 месяца) — Вариант C1 (RPi CM4 + nRF52840 + ESP32)

**Цель:** Промышленная надёжность, полный контроль, масштабирование.

- RPi CM4/CM5 на промышленном carrier board — мозг постамата
- Go Core Service: MQTT, SQLite WAL, BLE (через BlueZ), fleet management
- **nRF52840 USB Dongle** ($10-12) — BLE-радио (прошивка Zephyr `hci_usb` → BlueZ на RPi)
- ESP32 как slave: датчики (тампер, акселерометр) + LED (WS2812B) + watchdog на RPi. **Без BLE** — BLE вынесен на nRF52840. Нет реле/герконов (нет замков)
- Фото-верификация — с камеры телефона пользователя (в Flutter-приложении)
- Challenge-response (Ed25519) для BLE-команд — как в MVP
- Полноценный offline (SQLite WAL на Linux)
- Ansible/SSH для управления парком 100+ устройств
- Корпус: заказ на производстве (сталь 2 мм, открытые полки с ремнями)

**Архитектура продакшена:**
```
┌──────────────────────────────────────────────────┐
│            Постамат (продакшен)                  │
│            Открытые полки с ремнями               │
│                                                  │
│  ┌──────────────────────────────┐                │
│  │ RPi CM4/CM5 + carrier board  │                │
│  │ - Go Core Service            │                │
│  │ - BlueZ (BLE через nRF dongle)│               │
│  │ - SQLite WAL (offline)       │                │
│  │ - MQTT over TLS (4G LTE)    │                │
│  └────────┬───────────┬─────────┘                │
│           │           │                          │
│    ┌──────▼──────┐  ┌─▼──────────────┐           │
│    │ nRF52840    │  │ ESP32 (slave)   │           │
│    │ USB Dongle  │  │ - LED WS2812B  │           │
│    │ - BLE 5.4   │  │ - Акселерометр │           │
│    │ - CC310     │  │ - Тампер       │           │
│    │   crypto    │  │ - Watchdog RPi │           │
│    └─────────────┘  └────────────────┘           │
│  [QR-код на корпусе]                             │
│  [Опц: 1 IP-камера обзорная]                    │
└──────────────────────────────────────────────────┘
         ↕ BLE (nRF52840)
┌──────────────────────────────────────────────────┐
│  Смартфон (Flutter) — весь UI                    │
│  Фото-верификация с камеры телефона              │
└──────────────────────────────────────────────────┘
```

**Почему nRF52840 dongle для BLE в продакшене (а не ESP32):**

| Критерий | nRF52840 dongle побеждает |
|----------|--------------------------|
| Безопасность | CryptoCell CC310, минимум CVE, используется в Yale/August |
| Обновления BLE | `apt upgrade` на RPi — без перепрошивки донгла |
| Изоляция | BLE полностью на RPi/BlueZ, ESP32 не участвует в BLE → CVE ESP32 BLE неактуальны |
| Цена | $10-12 за донгл |
| Зрелость стека | BlueZ — 20+ лет, аудит Google/Intel |

**Почему ESP32 остаётся (без BLE):**

| Критерий | Зачем ESP32 |
|----------|-------------|
| Датчики | Тампер, акселерометр — real-time мониторинг |
| LED | WS2812B — тривиально через GPIO |
| Watchdog | Мониторит RPi, перезагружает при зависании |
| Переиспользование | Прошивка датчиков из MVP → slave в продакшене |
| Изоляция | Нет MQTT credentials, нет ключей, нет BLE → компрометация ESP32 ≠ компрометация постамата |

---

## 6. Оценка сроков разработки с ИИ-агентами

Использование ИИ-агентов (Claude Code, Cursor, Copilot) сокращает сроки разработки в ~2-3 раза за счёт генерации boilerplate-кода, протоколов, драйверов и тестов.

### Фаза 1: ESP32 MVP — 1.5-2 месяца (вместо 3-4)

| Задача | Без ИИ | С ИИ | Что ИИ делает |
|--------|:------:|:----:|---------------|
| ESP32 прошивка: BLE GATT сервер | 2-3 нед. | 3-5 дн. | Генерация BLE-сервисов, характеристик, NimBLE конфиг |
| Challenge-response (Ed25519) | 1-2 нед. | 2-3 дн. | Реализация протокола, crypto-примитивы, парсинг токенов |
| ~~Управление реле (замки)~~ — убрано | — | — | Нет замков — открытые полки с ремнями |
| MQTT over TLS (SIM7600) | 2-3 нед. | 4-5 дн. | TinyGSM + PubSubClient конфиг, TLS, reconnect, QoS |
| LED-индикация (WS2812B) | 2-3 дн. | 0.5 дн. | FastLED / NeoPixel паттерны |
| OTA-обновление | 1 нед. | 2-3 дн. | ESP-IDF OTA с подписью, A/B partition |
| Датчики (акселерометр, тампер) | 1 нед. | 2-3 дн. | I2C драйверы, обработка событий |
| Secure Boot + Flash Encryption | 3-5 дн. | 1-2 дн. | Конфигурация eFuse, скрипты прошивки |
| Flutter: BLE-интеграция | 2-3 нед. | 4-5 дн. | flutter_blue_plus, UI сканирования, challenge-response |
| Flutter: UI аренды (каталог, оплата) | 3-4 нед. | 1-1.5 нед. | Экраны, state management, API-клиент |
| PocketBase + Go-хуки: API + MQTT bridge | 3-4 нед. | 1-1.5 нед. | REST API, MQTT обработчики (NanoMQ), Ed25519 подпись, SQLite |
| Интеграция + тестирование | 2-3 нед. | 1-1.5 нед. | ИИ помогает, но интеграцию нужно тестировать на железе |
| **Итого** | **3.5-5 мес.** | **1.5-2 мес.** | **Ускорение ~2.5x** |

### Фаза 2: Продакшен (RPi + nRF + ESP32) — 1-1.5 месяца (вместо 2-3)

| Задача | Без ИИ | С ИИ | Что ИИ делает |
|--------|:------:|:----:|---------------|
| Go Core Service на RPi | 2-3 нед. | 4-5 дн. | Портирование логики с бэкенда, SQLite WAL, MQTT клиент |
| BlueZ BLE интеграция (nRF52840) | 1-2 нед. | 3-4 дн. | D-Bus API, GATT server, сервисы |
| ESP32 slave (датчики, без BLE) | 1 нед. | 2-3 дн. | Упрощение MVP-прошивки: убрать BLE, добавить UART протокол |
| UART протокол RPi ↔ ESP32 | 1 нед. | 2-3 дн. | Протокол, CRC, framing, команды |
| Фото-верификация (приложение) | 3-5 дн. | 1-2 дн. | Фото с камеры телефона, отправка на сервер, сравнение (MVP: Telegram оператору) |
| Fleet management (Ansible) | 1 нед. | 2-3 дн. | Playbooks, OTA, мониторинг, provisioning |
| Интеграция + тестирование | 2-3 нед. | 1-1.5 нед. | Hardware-in-the-loop тестирование |
| **Итого** | **2.5-3.5 мес.** | **1-1.5 мес.** | **Ускорение ~2.5x** |

### Суммарный таймлайн

| Фаза | Без ИИ | С ИИ-агентами |
|------|:------:|:-------------:|
| MVP (ESP32 headless) | 3.5-5 мес. | **1.5-2 мес.** |
| Продакшен (RPi + nRF + ESP32) | 2.5-3.5 мес. | **1-1.5 мес.** |
| **Общий срок до продакшена** | **6-8.5 мес.** | **2.5-3.5 мес.** |

### Где ИИ ускоряет максимально (>3x)

- **Протоколы и криптография**: BLE GATT, Ed25519 challenge-response, MQTT — хорошо документированные паттерны
- **Драйверы**: I2C (акселерометр), GPIO (реле, герконы), UART (RFID, SIM7600) — типовые задачи
- **Boilerplate**: REST API, Flutter UI, state management, тесты
- **Конфигурация**: Secure Boot, OTA, Ansible playbooks, Docker

### Где ИИ ускоряет минимально (~1.5x)

- **Интеграция с железом**: BLE + замки + датчики на реальном постамате — нужна отладка на физическом устройстве
- **Тестирование**: hardware-in-the-loop, edge cases при потере связи, ИБП, offline-возврат
- **Проектирование корпуса**: 3D-моделирование, заказ производства стали — ИИ не ускоряет

---

## 7. Решение

**Status:** Proposed

**Decision:** Двухфазная стратегия:
1. **MVP на ESP32-S3 headless** (1.5-2 мес.) — дешёвый прототип с открытыми полками и ремнями, нативный BLE, валидация гипотезы
2. **Продакшен на RPi CM4 + nRF52840 (BLE) + ESP32 (датчики)** (1-1.5 мес.) — промышленная надёжность, максимальная безопасность BLE

**Безопасность BLE:** Challenge-response с Ed25519 поверх BLE на обеих фазах. BLE — только транспорт, безопасность — на прикладном уровне. CVE ESP32 не эксплуатируются через BLE-радиоканал.

**Rationale:**
- Открытые полки с ремнями + headless-модель (без экрана) радикально упрощают железо постамата (нет замков, реле, герконов, тензодатчиков, камер на ячейках)
- CVE ESP32 BLE **не критичны**: ни одна не эксплуатируется удалённо через радиоканал (подтверждено Espressif)
- Challenge-response (Ed25519 + серверный nonce + TTL + GPS) закрывает все реальные BLE-угрозы (replay, MitM, relay) для любого чипа
- С ИИ-агентами общий срок до продакшена: **2.5-3.5 месяца** (вместо 6-8.5 без ИИ, ускорение ~2.5x)
- ESP32-S3 для MVP: самая низкая цена (~30-62K руб.), нативный BLE, Secure Boot v2 + Flash Encryption
- nRF52840 dongle для продакшена: CryptoCell CC310, минимум CVE, BlueZ обновляется через APT, используется в Yale/August
- ESP32 в продакшене сохраняется для датчиков/LED, но **без BLE** — полная изоляция
- Верификация: фото с камеры телефона пользователя при взятии/возврате — простое и надёжное решение без доп. оборудования на постамате
- ESI отвергнут: не поддерживает BLE, vendor lock-in, нет MQTT

**Consequences:**
- MVP: быстрая проверка рынка, минимальные потери при неудаче (~30-62K руб.)
- Прошивка ESP32 из MVP (датчики) → переиспользуется в продакшене
- Продакшен: BLE на nRF52840 + BlueZ (20+ лет, аудит Google/Intel) — максимальная безопасность BLE-канала
- ESP32 в продакшене не имеет BLE, MQTT credentials, ключей → компрометация ESP32 ≠ компрометация постамата
- Нет vendor lock-in — все компоненты заменяемы
- При росте: Ansible/SSH для 100+ устройств, A/B partition для OTA

---

## Источники

### Исследования проекта
- [docs/research/postamat-hardware-software-research.md](../research/postamat-hardware-software-research.md) — ESI, Violanta, Engy, промышленные контроллеры
- [docs/research/09-controllers-esp32-vs-industrial.md](../research/09-controllers-esp32-vs-industrial.md) — ESP32 vs ARM vs x86, модули реле, панели
- [docs/locker-security-research.md](../locker-security-research.md) — физическая и программная безопасность
- [docs/research/russian-postamat-solutions.md](../research/russian-postamat-solutions.md) — ESI, Violanta, ABIE, Engy
- [docs/adr/ADR-001-system-architecture.md](ADR-001-system-architecture.md) — системная архитектура (20 решений)

### BLE-безопасность
- [Espressif: ESP32 Bluetooth — Clearing the Air](https://developer.espressif.com/blog/2025/03/esp32-bluetooth-clearing-the-air/) — официальное опровержение «бэкдора»
- [NCC Group: BluFi Vulnerabilities (CVE-2025-55297)](https://www.nccgroup.com/research/technical-advisory-espressif-systems-esp32-blufi-reference-application-vulnerabilities/)
- [USENIX WOOT24: Breaking ESP32 V3 with EMFI (CVE-2023-35818)](https://www.usenix.org/conference/woot24/presentation/delvaux)
- [Nordic nRF5340 Security Features](https://www.nordicsemi.com/Products/Technologies/Security/Features)
- [Nordic nRF52840 Dongle — Zephyr](https://docs.zephyrproject.org/latest/boards/nordic/nrf52840dongle/doc/index.html)
- [BleedingTooth: Linux Bluetooth Zero-Click RCE (BlueZ)](https://google.github.io/security-research/pocs/linux/bleedingtooth/writeup.html)
