# Протокол передачи данных с весов на сервер ## Топология ``` Zemic TITAN 9 (RS232/DB25) ↓ TXD + GND (3-4 провода) MAX3232 (RS232 ↔ 3.3V TTL) ↓ UART TTL ESP32 (GPIO16/RX2) ↓ SPI W5500 Ethernet модуль ↓ TCP/IP (LAN) Mosquitto MQTT Broker (порт 1884 plain / 8883 MQTTS — в планах) ↓ подписчик Node.js / server.js (порт 3016, PM2) ↓ WebSocket Web UI (https://scales.zeroday.su) ``` ## Формат сообщения (JSON-схема) Топик: `scales/weighing/event` ```json { "device_id": "scales_01", "timestamp": "2026-03-01T10:23:45Z", "weight_kg": 18450.5, "weight_raw": "ww018450.500kg", "stable": true, "plate": null } ``` | Поле | Тип | Описание | |-------------|---------|-------------------------------------------------------------| | device_id | string | Идентификатор контроллера (если весов несколько) | | timestamp | string | ISO 8601, UTC. Берётся с DS3231 RTC (синхронизируется NTP) | | weight_kg | float | Распарсенный вес в кг (удобно для БД) | | weight_raw | string | Сырая строка с весов (`ww000.000kg`) | | stable | bool | true = вес стабилизировался перед отправкой | | plate | null | Зарезервировано — номер авто добавляет внешняя АСУ | ### Формат строки с весов (Zemic A12E / TITAN 9) ``` ww000.000kg — вес брутто wn000.000kg — вес нетто wt000.000kg — вес тары ``` ASCII, 1 стартовый бит, 8 бит данных, 1 стоповый бит. Скорость — P3 (9600 по умолчанию). ## MQTT-топик и QoS | Параметр | Значение | |---------------|----------------------------| | Топик | `scales/weighing/event` | | QoS | 1 (at least once) | | Retain | false | | Брокер | Mosquitto на scales.zeroday.su | | Порт (plain) | 1884 (для тестовой фазы) | | Порт (TLS) | 8883 (планируется) | ## Аутентификация / TLS / credentials Анонимный доступ к брокеру **запрещён** (`allow_anonymous false`). | Пользователь | Пароль | Роль | |----------------|--------------------|-------------------------------| | esp32 | Esp32Scales#2026 | ESP32 контроллер (publisher) | | scales-server | ScalesServer#2026 | Node.js backend (subscriber) | Конфиг Mosquitto: `/etc/mosquitto/conf.d/acs.conf` Файл паролей: `/etc/mosquitto/passwd` TLS (MQTTS port 8883) — **запланировано** после подтверждения RS232-потока. ## Логика стабилизации и retry ### На стороне ESP32 (firmware) Весы настроены на P5=3 (передача только при стабильном весе) — т.е. строка приходит уже стабильная. Дополнительная логика на ESP32: 1. Читаем строку каждые ~500 мс с Serial2 2. Если последние 5–10 показаний отличаются не более чем на ±20–50 кг — считаем вес стабильным 3. Отправляем MQTT-событие **один раз** 4. Ждём пока вес упадёт ниже порога (машина уехала) → сбрасываем флаг 5. Готовы к следующему взвешиванию ### Retry при обрыве MQTT - При `rc=-2` (не удалось подключиться) — ESP32 делает повторную попытку каждые N секунд - Данные не буферизуются локально (TODO: добавить очередь на случай длительного обрыва) ## Текущие ограничения / TODO по протоколу - [ ] MQTTS (порт 8883) — включить после подтверждения RS232 - [ ] Локальная очередь на ESP32 при обрыве связи - [ ] Поле `plate` — заполняется внешней АСУ распознавания номеров - [ ] Подтвердить навигацию в меню TITAN 9 для выставления P5=3 (контакт: Zemic +7 (472) 277-71-19)