Это база телеметрии. Устройства шлют сюда показания по MQTT — показания сохраняются и доступны через API и консоль. Ниже — как отправить первое показание за 2 минуты.
Устройство (датчик, бойлер, счётчик) отправляет показания по протоколу MQTT. Дальше показания проходят по цепочке и попадают в базу данных:
Очередь iot-telemetry — внутренний буфер сервиса: она
защищает показания от потерь при всплесках и сбоях базы. Пользователю
креды очереди НЕ нужны — сервис ходит в неё сам. Если требуется
посмотреть сообщения вручную — консоль очереди:
sqs.containerk8s.dev.nubes.ru/ui
(вход по API-токену Nubes; описание — на
sqs.containerk8s.dev.nubes.ru).
У каждого устройства — свои логин и пароль, поэтому чужое устройство не сможет писать в ваш топик. Данные разных проектов (namespace) лежат в разных базах и не смешиваются.
Три понятия:
namespace — имя вашего проекта/группы устройств (например
myhome);
device_id — идентификатор конкретного устройства (например
boiler-1);
топик — адрес, в который устройство отправляет показания:
namespace/telemetry/device_id.
Все команды API требуют заголовок Authorization: Bearer
<токен>. Для тестов подойдёт самодельный токен: сервис
проверяет только два поля (кто и до какого времени), подпись не
проверяется. Одна команда — токен готов:
TOKEN=$(python3 -c "import base64,json,time;h=base64.urlsafe_b64encode(b'{\"alg\":\"none\",\"typ\":\"JWT\"}').rstrip(b'=').decode();p=base64.urlsafe_b64encode(json.dumps({'sub':'admin','exp':int(time.time())+86400}).encode()).rstrip(b'=').decode();print(h+'.'+p+'.sig')")
Одна команда — и устройство boiler-1 появляется в
проекте myhome. В ответе будет логин для MQTT
(myhome_boiler-1). Пароль в ответе НЕ показывается —
его отдаёт второй запрос.
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"boiler","device_id":"boiler-1"}' \
https://iot.containerk8s.dev.nubes.ru/v1/namespaces/myhome/iot/devices# пароль — во втором запросе (поле mqtt_password):curl -H "Authorization: Bearer $TOKEN" \
https://iot.containerk8s.dev.nubes.ru/v1/namespaces/myhome/iot/devices/boiler
Подключение к MQTT — по адресу
wss://exqx.containerk8s.dev.nubes.ru/mqtt. Логин —
myhome_boiler-1, пароль — из шага 2. Показание
отправляется в топик myhome/telemetry/boiler-1.
import paho.mqtt.client as mqtt, jsonc = mqtt.Client(transport="websockets")c.ws_set_options(path="/mqtt")c.username_pw_set("myhome_boiler-1", "<пароль из шага 2>")c.connect("exqx.containerk8s.dev.nubes.ru", 443)c.publish("myhome/telemetry/boiler-1", json.dumps({"temp": 58.3}))
Показание доходит в базу за ~1 секунду. Посмотреть — запросом или в консоли:
curl -H "Authorization: Bearer $TOKEN" \
"https://iot.containerk8s.dev.nubes.ru/v1/namespaces/myhome/iot/telemetry?limit=50"
mqtt), TLS{namespace}_{device_id} + пароль из APIsub, exp)
exqx.containerk8s.dev.nubes.ru — это MQTT-брокер, а не
веб-страница. Точка подключения — только /mqtt через
WebSocket. Если открыть этот адрес в браузере, вернётся
400 — так и должно быть: браузер не использует
WebSocket-подпротокол mqtt. Подключаться нужно MQTT-
клиентом (paho-mqtt, mqtt.js и т.п.), как в шаге 3.
Ограничения: сообщение — до ~250 КБ; платформа может разрывать внешние WebSocket-соединения примерно раз в 150 секунд — клиент должен уметь переподключаться (в paho это делается автоматически).