diff --git a/MQTT_INTEGRATION.md b/MQTT_INTEGRATION.md index e69de29..6d1a2f8 100644 --- a/MQTT_INTEGRATION.md +++ b/MQTT_INTEGRATION.md @@ -0,0 +1,187 @@ +# Интеграция с весовым контроллером — шпаргалка для разработчиков + +## Архитектура + +``` +Весы → ESP32 контроллер → MQTT брокер → Ваш сервер + ← MQTT брокер ← Ваш сервер (команда GO) +``` + +--- + +## Настройка локального MQTT брокера + +Установить Mosquitto (или любой другой MQTT брокер): + +```bash +# Ubuntu/Debian +sudo apt install mosquitto mosquitto-clients + +# Конфиг /etc/mosquitto/mosquitto.conf +listener 1883 0.0.0.0 +allow_anonymous true # или настроить авторизацию + +sudo systemctl restart mosquitto +``` + +IP вашего брокера, порт, логин и пароль сообщит администратор — +он настроит их в устройстве со своей стороны. + +--- + +## Топики MQTT + +### Получение данных с весов + +**Топик:** `scales/weighing/event` + +Контроллер публикует JSON когда вес стабилизировался: + +```json +{ + "weight_kg": 12500.0, + "timestamp": "2026-05-29T11:05:06", + "device_id": "scales_01" +} +``` + +Подписаться через консоль: +```bash +mosquitto_sub -h localhost -t "scales/weighing/event" +``` + +Python пример: +```python +import paho.mqtt.client as mqtt +import json + +def on_message(client, userdata, msg): + data = json.loads(msg.payload) + weight = data['weight_kg'] + timestamp = data['timestamp'] + device = data['device_id'] + print(f"Взвешивание: {weight} кг в {timestamp}") + + # Здесь ваша логика: + # - Сделать снимок с камеры + # - Распознать номер авто + # - Сохранить в БД + # - Отправить команду GO + +client = mqtt.Client() +client.on_message = on_message +client.connect("localhost", 1883) +client.subscribe("scales/weighing/event") +client.loop_forever() +``` + +--- + +## Отправка команды GO + +После того как ваша система обработала взвешивание (сделала фото, +распознала номер, сохранила в БД) — нужно отправить команду GO. + +Контроллер получит команду и переключит светофор на **зелёный**. + +**Топик:** `scales/weighing/go` + +### Формат команды GO + +```json +{ + "device_id": "scales_01", + "timestamp": "2026-05-29T11:05:11" +} +``` + +### Отправка через консоль: +```bash +mosquitto_pub -h localhost -t "scales/weighing/go" \ + -m '{"device_id":"scales_01","timestamp":"2026-05-29T11:05:11"}' +``` + +### Отправка через Python: +```python +import paho.mqtt.client as mqtt +import json +from datetime import datetime + +def send_go(client, device_id="scales_01"): + payload = json.dumps({ + "device_id": device_id, + "timestamp": datetime.now().isoformat() + }) + client.publish("scales/weighing/go", payload) + print(f"GO отправлен для {device_id}") + +# Полный пример — принять вес и отправить GO +def on_message(client, userdata, msg): + data = json.loads(msg.payload) + weight = data['weight_kg'] + print(f"Получен вес: {weight} кг") + + # Ваша логика здесь... + # make_photo() + # recognize_plate() + # save_to_db(weight) + + # Отправляем GO + send_go(client, data['device_id']) + +client = mqtt.Client() +client.on_message = on_message +client.connect("localhost", 1883) +client.subscribe("scales/weighing/event") +client.loop_forever() +``` + +--- + +## Полная схема взаимодействия + +``` +1. Машина заезжает на платформу +2. Контроллер видит вес → включает КРАСНЫЙ светофор +3. Вес стабилизируется +4. Контроллер публикует в scales/weighing/event: + {"weight_kg": 12500.0, "timestamp": "...", "device_id": "scales_01"} +5. Ваш сервер получает сообщение +6. Ваш сервер делает снимки с камер, распознаёт номер, сохраняет в БД +7. Ваш сервер публикует в scales/weighing/go: + {"device_id": "scales_01", "timestamp": "..."} +8. Контроллер получает GO → включает ЗЕЛЁНЫЙ светофор +9. Машина съезжает +``` + +--- + +## Параметры устройства + +| Параметр | Значение | +|----------|----------| +| Device ID | scales_01 | +| Топик данных | scales/weighing/event | +| Топик GO | scales/weighing/go | + +IP брокера, порт и авторизацию сообщит администратор. + +--- + +## Установка paho-mqtt + +```bash +pip install paho-mqtt +``` + +--- + +## Важные моменты + +1. **GO нужно отправлять на тот же брокер** где вы получили событие. + +2. **Таймаут ожидания GO не ограничен** — контроллер будет ждать + команду сколько угодно. Если машина уедет сама — контроллер + автоматически сбросит состояние и включит зелёный. + +3. **device_id в команде GO** должен совпадать с device_id из события.