Документация

Как подключить устройства и программы к MQTT-брокеру сервиса.

Быстрый старт

1. Зарегистрируйтесь — /register.

2. Сохраните MQTT-логин и пароль (показываются один раз).

3. Подключите устройство по параметрам ниже и шлите сообщения в свой топик.

Параметры подключения

Параметр Значение
Хост IP машины с сервисом (в локальной сети) или localhost
Порт MQTT (TCP) 1883
Порт MQTTS (TLS) 8883
Порт WebSocket 8083
Порт WSS (TLS WebSocket) 8084
Логин mqtt_username из регистрации (вида u_XXXX)
Пароль mqtt_password из регистрации
Топики devices/<логин>/... — ваше пространство имён
Каждому пользователю доступен свой namespace devices/<логин>/# (чтение и запись). Внутри него можно использовать любые вложенные топики, например devices/<логин>/sensor1/temp.

Пример: Python (paho-mqtt)

Подходит для серверов, Raspberry Pi, настольных программ.

pip install paho-mqtt
import paho.mqtt.client as mqtt
import time

HOST = "192.168.0.105"     # IP машины с сервисом
PORT = 1883
USER = "u_XXXXXXXX"        # ваш mqtt_username
PASS = "XXXXXXXX"          # ваш mqtt_password
TOPIC = f"devices/{USER}/test"


def on_connect(client, userdata, flags, reason_code, properties=None):
    print("Подключено, код:", reason_code)
    client.subscribe(TOPIC)


def on_message(client, userdata, msg):
    print(f"{msg.topic}: {msg.payload.decode()}")


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(USER, PASS)
client.on_connect = on_connect
client.on_message = on_message

client.connect(HOST, PORT, keepalive=60)
client.loop_start()

client.publish(TOPIC, "hello from python", qos=1)
time.sleep(3)

client.loop_stop()

Пример: MicroPython (umqtt.simple)

Для ESP32/ESP8266/Raspberry Pi Pico с прошивкой MicroPython.

import network
import time
from umqtt.simple import MQTTClient

# Подключаемся к WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("ВАШ_WIFI", "ПАРОЛЬ_WIFI")
while not wlan.isconnected():
    time.sleep(0.5)
print("WiFi OK")

HOST = "192.168.0.105"
USER = "u_XXXXXXXX"
PASS = "XXXXXXXX"
TOPIC = "devices/{}/test".format(USER)

client = MQTTClient("my_device", HOST, port=1883, user=USER, password=PASS)
client.connect()
client.publish(TOPIC, "hello from micropython")
client.disconnect()

Пример: Arduino (PubSubClient + Ethernet)

Для Arduino Uno/Mega с Ethernet-шилдом (W5100/W5500).

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress server(192, 168, 0, 105);   // IP сервиса

EthernetClient eth;
PubSubClient client(eth);

const char* USER = "u_XXXXXXXX";
const char* PASS = "XXXXXXXX";
String topic = String("devices/") + USER + "/test";

void setup() {
  Ethernet.begin(mac);
  delay(1000);

  client.setServer(server, 1883);
  if (client.connect("arduino", USER, PASS)) {
    client.publish(topic.c_str(), "hello from arduino");
  }
}

void loop() {
  client.loop();
}

Пример: ESP32 (WiFi + PubSubClient)

Для ESP32 в Arduino IDE: установите библиотеку PubSubClient через менеджер библиотек.

#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "ВАШ_WIFI";
const char* WIFI_PASS = "ПАРОЛЬ_WIFI";
const char* HOST = "192.168.0.105";

const char* USER = "u_XXXXXXXX";
const char* PASS = "XXXXXXXX";
String TOPIC = String("devices/") + USER + "/test";

WiFiClient wifi;
PubSubClient client(wifi);

void reconnect() {
  while (!client.connected()) {
    if (client.connect("esp32", USER, PASS)) {
      client.subscribe(TOPIC.c_str());
    } else {
      delay(3000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("WiFi OK");

  client.setServer(HOST, 1883);
  if (client.connect("esp32", USER, PASS)) {
    client.publish(TOPIC.c_str(), "hello from esp32");
  }
}

void loop() {
  if (!client.connected()) reconnect();
  client.loop();
}

Проверка из командной строки

sudo apt install mosquitto-clients

# подписка
mosquitto_sub -h 192.168.0.105 -p 1883 -u u_XXXXXXXX -P XXXXXXXX \
  -t 'devices/u_XXXXXXXX/test' -v

# публикация
mosquitto_pub -h 192.168.0.105 -p 1883 -u u_XXXXXXXX -P XXXXXXXX \
  -t 'devices/u_XXXXXXXX/test' -m 'hello'

TLS (MQTTS и WSS)

Сертификаты выпущены и лежат в mosquitto/certs/: ca.crt, server.crt, server.key. Клиентам для защищённого подключения нужен CA-сертификат (ca.crt) — им проверяется подлинность брокера.

Проверка из командной строки (TLS)

# публикация по MQTTS (порт 8883)
mosquitto_pub -h 192.168.0.105 -p 8883 \
  --cafile /путь/до/ca.crt \
  -u u_XXXXXXXX -P XXXXXXXX \
  -t 'devices/u_XXXXXXXX/test' -m 'hello over tls'

Python (TLS)

import paho.mqtt.client as mqtt

HOST = "192.168.0.105"
PORT = 8883
USER = "u_XXXXXXXX"
PASS = "XXXXXXXX"
CA_CERT = "/путь/до/ca.crt"   # файл из mosquitto/certs/
TOPIC = f"devices/{USER}/test"

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(USER, PASS)
client.tls_set(ca_certs=CA_CERT)

client.connect(HOST, PORT, keepalive=60)
client.publish(TOPIC, "hello over tls", qos=1)
client.loop(2)

MicroPython (TLS)

from umqtt.simple import MQTTClient

HOST = "192.168.0.105"
USER = "u_XXXXXXXX"
PASS = "XXXXXXXX"
TOPIC = "devices/{}/test".format(USER)

# ssl=True включает TLS. Настройка проверки CA зависит от порта
# MicroPython (см. документацию вашей прошивки).
client = MQTTClient("my_device", HOST, port=8883,
                    user=USER, password=PASS, ssl=True)
client.connect()
client.publish(TOPIC, "hello over tls")
client.disconnect()

ESP32 / Arduino (WiFiClientSecure, TLS)

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "ВАШ_WIFI";
const char* WIFI_PASS = "ПАРОЛЬ_WIFI";
const char* HOST = "192.168.0.105";
const uint16_t PORT = 8883;

const char* USER = "u_XXXXXXXX";
const char* PASS = "XXXXXXXX";
String TOPIC = String("devices/") + USER + "/test";

// Вставьте сюда содержимое файла mosquitto/certs/ca.crt
const char* CA_CERT = R"EOF(
-----BEGIN CERTIFICATE-----
...сюда содержимое ca.crt...
-----END CERTIFICATE-----
)EOF";

WiFiClientSecure wifi;
PubSubClient client(wifi);

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  wifi.setCACert(CA_CERT);          // доверяем только нашему CA
  client.setServer(HOST, PORT);

  if (client.connect("esp32", USER, PASS)) {
    client.publish(TOPIC.c_str(), "hello over tls");
  }
}

void loop() {
  client.loop();
}

Тарифы и лимиты

Тариф Устройства Сообщений/день Хранение
Free 1 1 000 7 дней
Pro 10 100 000 90 дней
Business 100 1 000 000 365 дней

Ошибки и реакция системы

MQTT-подключение

Симптом Причина
Connection Refused: not authorised Неверный логин/пароль либо истёк тариф
Connection refused (нет ответа) Брокер недоступен: не запущен, неверный хост или порт

Истекла оплата (тариф)

Когда у тарифа задан срок действия (plan_expires_at) и он в прошлом, брокер отклоняет новые MQTT-подключения (not authorised). Устройства перестают подключаться до продления тарифа.

Превышен лимит устройств

При попытке добавить устройство сверх лимита тарифа API возвращает 403 с ошибкой device limit reached — новое устройство не создаётся, пока не освободится место или не повышен тариф.

Учёт сообщений и лимит

Счётчик опубликованных сообщений ведётся в таблице usage_daily и показывается в кабинете (расход). Жёсткая блокировка публикации сверх дневного лимита — на следующих этапах.

Ошибки HTTP API

Код Когда
400 Не переданы email/пароль
401 Неверные креды или нет токена
409 Email уже зарегистрирован
404 Пользователь не найден
500 Внутренняя ошибка сервера
Сейчас активно: проверка логина/пароля, блокировка MQTT при истёкшем тарифе, выдача namespace-топика, лимит устройств (403), учёт сообщений (счётчик в кабинете). Блокировка лимита сообщений — на следующих этапах.