Приём и хранение телеметрии устройств: MQTT → шина SQS → PostgreSQL → REST API и консоль. Устройства изолированы по namespace, каждому namespace — отдельная база данных.
Платформа принимает телеметрию от устройств по протоколу MQTT (WebSocket с TLS) и доставляет её в базу данных по цепочке:
устройство → wss://…/mqtt (EMQX) → очередь
iot-telemetry (shared-sqs) → потребитель → PostgreSQL →
REST API / консоль.
Устройства регистрируются через REST API и получают собственный
пароль. Каждое устройство публикует только в свой топик
{namespace}/telemetry/{device_id} — чужие топики
отклоняются брокером.
Устройство создаётся через REST API с Bearer-JWT (структура
sub + exp). В ответе — mqtt_username;
пароль возвращается только запросом GET по имени устройства.
TOKEN="…jwt…"curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"dev1","device_id":"dev-001"}' \
https://iot.containerk8s.dev.nubes.ru/v1/namespaces/test/iot/devicescurl -H "Authorization: Bearer $TOKEN" \
https://iot.containerk8s.dev.nubes.ru/v1/namespaces/test/iot/devices/dev1
Endpoint wss://exqx.containerk8s.dev.nubes.ru/mqtt,
подпротокол WebSocket — mqtt; username
{namespace}_{device_id}, пароль из шага 1; публикация в
топик {namespace}/telemetry/{device_id}.
import paho.mqtt.client as mqttc = mqtt.Client(transport="websockets")c.ws_set_options(path="/mqtt")c.username_pw_set("test_dev-001", "<пароль>")c.connect("exqx.containerk8s.dev.nubes.ru", 443)c.publish("test/telemetry/dev-001", '{"temp":23.5}')
История сообщений — REST API (Bearer-JWT):
curl -H "Authorization: Bearer $TOKEN" \
"https://iot.containerk8s.dev.nubes.ru/v1/namespaces/test/iot/telemetry?limit=50"
mqtt), TLS{namespace}_{device_id} + пароль из APIsub, exp)
https://exqx.containerk8s.dev.nubes.ru — это MQTT-брокер
(EMQX), а не веб-страница. Точка подключения — только
/mqtt через WebSocket. Открытие этого адреса в браузере
или HTTP-запрос вернёт 400 — это штатное поведение
(нет WebSocket-подпротокола mqtt).
Ограничения: размер сообщения — до ~250 КБ (лимит SQS 256 КБ); платформа может разрывать внешние WebSocket-соединения примерно раз в 150 секунд — устройства должны автоматически переподключаться (для QoS 1 повторы выполняются клиентом).