188 lines
5.5 KiB
Markdown
188 lines
5.5 KiB
Markdown
# Интеграция с весовым контроллером — шпаргалка для разработчиков
|
|
|
|
## Архитектура
|
|
|
|
```
|
|
Весы → 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 из события.
|