Files
weighing-controller/PROTOCOL.md
T
admin 35e5ffea1e Initial: backup from Claude Project 'Весовое оборудование'
- 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
2026-04-30 12:26:31 +03:00

104 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Протокол передачи данных с весов на сервер
## Топология
```
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)