Доменная петля обмена между весами и backend-ингестом:
up/event (устройство → бэкенд) → down/ack + item/state + item/info
(бэкенд → устройство, retained).
Документ написан с перспективы весов (send = весы публикуют,
receive = весы получают). Покрыта только живая петля; полный контракт
устройства (машина состояний, дисплей, boot, калибровка) —
docs/firmware/mqtt-contract.md, отличия живого бэкенда —
docs/firmware/backend-integration.md.
EMQX брокер (GCP Compute Engine).
Доменное событие весов (weight / register). QoS 1, не retained.
Весы публикуют доменное событие после стабилизации/регистрации.
Available only on servers:
scale_id — slug весов.
Accepts the following message:
Событие весов — weight или register.
Доменное событие весов. Топик kilo/scale/{S}/up/event, QoS 1, не retained. Незнакомые поля игнорируются (forward-compat).
{
"v": 1,
"seq": 4294967295,
"type": "weight",
"ts_ms": 0,
"nfc_id": "string",
"weight_mg": 0,
"tobacco_id": 0
}
Прикладной high-water mark подтверждённых seq. QoS 1, retained.
Весы получают HWM и чистят буфер неподтверждённых (seq ≤ last_seq).
Available only on servers:
scale_id — slug весов.
Accepts the following message:
Прикладное подтверждение high-water mark. Топик kilo/scale/{S}/down/ack, QoS 1, retained. Устройство чистит буфер неподтверждённых: удалить всё с seq <= last_seq.
{
"v": 1,
"last_seq": 4294967295
}
Карточка контейнера для дисплея. QoS 1, retained. Пустой payload — удаление из кеша.
Весы получают имя/тару для дисплея.
Available only on servers:
venue_id — slug заведения.
nfc_id — UID метки, hex lowercase.
Accepts the following message:
Карточка контейнера для дисплея. Топик kilo/venue/{V}/item/{N}/info, QoS 1, retained. Пустой payload => удалить запись из items_info[nfc_id].
{
"v": 1,
"name": "string",
"tare_mg": 0
}
Последний известный вес контейнера. QoS 1, retained. Пустой payload — удаление из кеша.
Весы получают последний известный вес контейнера.
Available only on servers:
venue_id — slug заведения.
nfc_id — UID метки, hex lowercase.
Accepts the following message:
Последний известный вес контейнера. Топик kilo/venue/{V}/item/{N}/state, QoS 1, retained. Пустой payload => удалить запись из items_state[nfc_id].
{
"v": 1,
"last_mg": 0
}
Событие весов — weight или register.
Доменное событие весов. Топик kilo/scale/{S}/up/event, QoS 1, не retained. Незнакомые поля игнорируются (forward-compat).
Прикладное подтверждение high-water mark. Топик kilo/scale/{S}/down/ack, QoS 1, retained. Устройство чистит буфер неподтверждённых: удалить всё с seq <= last_seq.
Карточка контейнера для дисплея. Топик kilo/venue/{V}/item/{N}/info, QoS 1, retained. Пустой payload => удалить запись из items_info[nfc_id].
Последний известный вес контейнера. Топик kilo/venue/{V}/item/{N}/state, QoS 1, retained. Пустой payload => удалить запись из items_state[nfc_id].