nubes Nubes · IoT {{VERSION}}
nubes

IoT тестирование

Это база телеметрии. Устройства шлют сюда показания по MQTT — показания сохраняются и доступны через API и консоль. Ниже — как отправить первое показание за 2 минуты.

Как это работает

Устройство (датчик, бойлер, счётчик) отправляет показания по протоколу MQTT. Дальше показания проходят по цепочке и попадают в базу данных:

Схема пайплайна IoT
Между брокером и базой работают бридж и потребитель (части iot-service): бридж кладёт показания в очередь, потребитель пишет их в базу.

Очередь 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.

Быстрый старт — 4 шага
1
Получить токен доступа к API

Все команды 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')")
2
Зарегистрировать устройство

Одна команда — и устройство 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
3
Отправить показание

Подключение к MQTT — по адресу wss://exqx.containerk8s.dev.nubes.ru/mqtt. Логин — myhome_boiler-1, пароль — из шага 2. Показание отправляется в топик myhome/telemetry/boiler-1.

import paho.mqtt.client as mqtt, json
c = 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}))
4
Увидеть результат

Показание доходит в базу за ~1 секунду. Посмотреть — запросом или в консоли:

curl -H "Authorization: Bearer $TOKEN" \
"https://iot.containerk8s.dev.nubes.ru/v1/namespaces/myhome/iot/telemetry?limit=50"
Открыть консоль →
Подключение
MQTT endpoint
wss://exqx.containerk8s.dev.nubes.ru/mqtt
Протокол
MQTT 3.1.1 / 5.0 over WebSocket (subprotocol mqtt), TLS
REST API
https://iot.containerk8s.dev.nubes.ru
Аутентификация MQTT
username {namespace}_{device_id} + пароль из API
Аутентификация REST
Bearer JWT (sub, exp)
Топик устройства
{namespace}/telemetry/{device_id}
Консоль
/console — устройства, эмулятор, телеметрия
Админ-статистика
/iot-admin (токен ADMIN_STATS_TOKEN)
Health
MQTT endpoint (exqx)

exqx.containerk8s.dev.nubes.ru — это MQTT-брокер, а не веб-страница. Точка подключения — только /mqtt через WebSocket. Если открыть этот адрес в браузере, вернётся 400 — так и должно быть: браузер не использует WebSocket-подпротокол mqtt. Подключаться нужно MQTT- клиентом (paho-mqtt, mqtt.js и т.п.), как в шаге 3.

Ограничения: сообщение — до ~250 КБ; платформа может разрывать внешние WebSocket-соединения примерно раз в 150 секунд — клиент должен уметь переподключаться (в paho это делается автоматически).