35e5ffea1e
- PROTOCOL.md: topology, JSON schema, MQTT topic, auth, retry logic - HARDWARE.md: components, GPIO map, ASCII wiring, power, calibration - FIRMWARE_NOTES.md: stack (ESP32 core 3.x), libraries, main loop, known issues, TODO - INDEX.md: manifest + current status + blockers Current blocker: TITAN 9 P5 default = no RS232 output. Fix: call Zemic +7(472)277-71-19, set P5=3, then test on-site. Related server repo: admin/scales
4.8 KiB
4.8 KiB
Протокол передачи данных с весов на сервер
Топология
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
{
"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:
- Читаем строку каждые ~500 мс с Serial2
- Если последние 5–10 показаний отличаются не более чем на ±20–50 кг — считаем вес стабильным
- Отправляем MQTT-событие один раз
- Ждём пока вес упадёт ниже порога (машина уехала) → сбрасываем флаг
- Готовы к следующему взвешиванию
Retry при обрыве MQTT
- При
rc=-2(не удалось подключиться) — ESP32 делает повторную попытку каждые N секунд - Данные не буферизуются локально (TODO: добавить очередь на случай длительного обрыва)
Текущие ограничения / TODO по протоколу
- MQTTS (порт 8883) — включить после подтверждения RS232
- Локальная очередь на ESP32 при обрыве связи
- Поле
plate— заполняется внешней АСУ распознавания номеров - Подтвердить навигацию в меню TITAN 9 для выставления P5=3 (контакт: Zemic +7 (472) 277-71-19)