Skip to content

Подключение по MQTT ​

Open-source версия FastBee включает встроенный MQTT Broker, разработанный на Netty, — отдельное развёртывание EMQX не требуется. В этой статье описано, как устройства подключаются к платформе по протоколу MQTT.

Процесс подключения ​

  1. Создайте и опубликуйте MQTT-продукт в управлении продуктами, запишите ID продукта, номер устройства, MQTT-аккаунт и пароль
  2. Устройство или MQTTX подключается к MQTT-сервису с согласованными clientId, userName и password
  3. После успешного подключения сначала опубликуйте /info/post, затем /property/post или /event/post
  4. На стороне платформы подтвердите замкнутость канала через состояние работы, журнал событий и журнал команд на странице деталей устройства

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

ПараметрTCP-подключениеWebSocket-подключение
АдресIP сервераws://server-ip:8083/mqtt
Порт18838083
ПротоколMQTT 3.1.1MQTT over WebSocket

Аутентификация устройства ​

提示

  • Типы аутентификации: S = простая аутентификация, E = шифрованная аутентификация
  • Если для продукта включён код авторизации устройства, код авторизации не может быть пустым
  • ID пользователя — это ID вошедшего пользователя; при разных ID пользователя устройства принадлежат разным пользователям
  • Номер устройства может быть номером, созданным платформой, или уникальным кодом, например MAC/IMEI устройства (платформа автоматически зарегистрирует устройство)

Простая аутентификация (рекомендуется для тестирования) ​

clientId = S&deviceNumber&productId&userId
userName = MQTT-аккаунт
password = MQTT-пароль
password = MQTT-пароль&код-авторизации-устройства (если для продукта включена авторизация устройств)

Пример:

clientId = "S&D68329VL588&2&1"
userName = "fastbee"
password = "PHYFED93WSFF1DAS"

Шифрованная аутентификация (рекомендуется для производства) ​

clientId = E&deviceNumber&productId&userId
userName = MQTT-аккаунт
password = AES-шифрование(MQTT-пароль&метка-времени-истечения&код-авторизации(опционально))
  • Пароль шифруется AES-CBC с использованием секретного ключа продукта (вектор инициализации wumei-smart-open, вывод Base64)
  • Метка времени истечения задаётся с точностью до миллисекунд, рекомендуется не более 24 часов

Пример:

clientId = "E&D68329VL588&2&1"
userName = "fastbee"
password = "/W2A/4MK+9cEGBhyBDgr2K5c62DAjAK4m0b5pvwxX6FFMzI3h1pUmaDY3BH1P2mI"

Описание AES-шифрования ​

Используется режим AES-CBC; для тестирования можно воспользоваться онлайн-инструментом шифрования:

ПараметрЗначение
Режим шифрованияCBC
Заполнениеpkcs5padding
Блок данных128 бит
Вектор инициализацииwumei-smart-open
ВыводBase64
ПарольСекретный ключ продукта
Шифруемое содержимоеMQTT-пароль&expireTime&код-авторизации(опционально)

Топики подписки (платформа → устройство) ​

ТопикОписание
/{productId}/{deviceNum}/function/getПодписка на команды платформы (установка свойств, вызов функций)
/{productId}/{deviceNum}/info/getПодписка на запрос информации об устройстве (после получения публикуется информация об устройстве)
/{productId}/{deviceNum}/monitor/getПодписка на запрос мониторинга в реальном времени (возвращает количество и интервал)
/{productId}/{deviceNum}/ntp/getПодписка на синхронизацию времени (опционально)
/{deviceNum}/http/upgrade/setПодписка на OTA-обновление по HTTPS
/{deviceNum}/fetch/upgrade/setПодписка на OTA-обновление бинарным пакетом

Топики публикации (устройство → платформа) ​

ТопикОписание
/{productId}/{deviceNum}/property/postПубликация данных свойств/функций (отображаются в реальном времени и сохраняются)
/{productId}/{deviceNum}/event/postПубликация событий
/{productId}/{deviceNum}/info/postПубликация информации об устройстве
/{productId}/{deviceNum}/monitor/postПубликация данных мониторинга в реальном времени (только графики реального времени, без сохранения)
/{productId}/{deviceNum}/ntp/postПубликация синхронизации времени (опционально)
/{deviceNum}/http/upgrade/replyОтвет на OTA-обновление по HTTPS
/{deviceNum}/fetch/upgrade/replyОтвет на OTA-обновление бинарным пакетом

提示

  • {productId} — это ID продукта (не номер продукта), его можно найти в деталях продукта на платформе
  • {deviceNum} — номер устройства, должен точно совпадать с устройством на платформе

Формат данных ​

Взаимодействие устройства и платформы использует формат JSON.

Публикация свойств/функций/событий — /property/post, /event/post ​

json
[{
    "id": "temperature",
    "value": "27.43",
    "remark": "температура в норме"
}, {
    "id": "switch",
    "value": "1",
    "remark": "переключатель включён"
}]
  • id: идентификатор модели вещи, смотрите в деталях продукта, уникален в пределах продукта
  • value: значение передаётся строкой; для булева типа используются "0"/"1"; для перечисления — ключ значения перечисления; для массива — значения через запятую
  • remark: примечание, отображается в журнале устройства

Подписка на команды платформы — /function/get ​

json
[{
    "id": "gear",
    "value": "1",
    "remark": "сработала сценарная автоматизация"
}, {
    "id": "switch",
    "value": "0",
    "remark": "выключение по таймеру"
}]

Публикация информации об устройстве — /info/post ​

json
{
    "rssi": -43,
    "firmwareVersion": 1.2,
    "status": 3,
    "userId": 1,
    "longitude": 0,
    "latitude": 0,
    "summary": {
        "name": "FastBee",
        "chip": "ESP32"
    }
}
ПолеОписание
rssiУровень сигнала (отличный [-55~0], хороший [-70~-55], средний [-85~-70], плохой [-100~-85])
firmwareVersionНомер версии прошивки
statusСостояние устройства, фиксировано 3 (в сети)
userIdID пользователя
longitude/latitudeОпционально, геопозиция устройства
summaryОпционально, сводная информация об устройстве

Мониторинг в реальном времени — /monitor/get, /monitor/post ​

Платформа отправляет запрос мониторинга:

json
{
    "count": 60,
    "interval": 1000
}

Устройство отправляет данные с указанным количеством и интервалом:

json
[{
    "id": "temperature",
    "value": "27.43",
    "remark": ""
}]

Синхронизация времени — /ntp/post, /ntp/get ​

Устройство публикует:

json
{
    "deviceSendTime": "1592361428000"
}

Платформа отвечает:

json
{
    "deviceSendTime": "1592361428000",
    "serverRecvTime": "1592366463548",
    "serverSendTime": "1592366463548"
}

Текущее время устройства = (serverRecvTime + serverSendTime + deviceRecvTime - deviceSendTime) / 2

Правила идентификаторов модели вещи ​

  • Все идентификаторы уникальны в пределах продукта; используйте преимущественно буквы и цифры, избегайте специальных символов
  • Формат ID подмодели объектного типа: parentId_childId
  • Идентификаторы типа массив начинаются с array_индекс (индекс — две цифры, например array_00_power_switch), длина массива не более 100

Настройка сети устройства через AP (опционально, только для WiFi-устройств) ​

Устройство поднимает точку доступа (адрес 192.168.4.1), мобильное приложение передаёт конфигурацию через Web-сервис устройства.

Обнаружение устройства ​

GET http://192.168.4.1/api/wifi/status

HTTP 200 означает, что устройство обнаружено; ответ содержит информацию об устройстве и текущее состояние сети.

Интерфейс конфигурации ​

POST http://192.168.4.1/api/wifi/config?SSID=имя-WiFi&password=пароль-WiFi&userId=ID-пользователя
ПараметрОписание
SSIDИмя WiFi (обязательный, совместим со строчным ssid)
passwordПароль WiFi (обязательный, совместим с псевдонимом pwd)
userIdID пользователя (обязательный)
deviceNumНомер устройства (опционально)
extraНомер продукта (опционально)

HTTP 200 означает успешную настройку сети (устройство затем автоматически переключается в режим STA), 400 — отсутствуют обязательные параметры, 500 — ошибка сохранения. Подробное описание интерфейса см. в документе «Настройка сети · AP-провижионинг API для телефона/мобильного приложения».

Тестирование с MQTTX ​

  1. Скачайте клиент MQTTX
  2. Создайте подключение:
    • Host: mqtt://server-ip, Port: 1883
    • Client ID: S&deviceNumber&productId&1
    • Username: MQTT-аккаунт
    • Password: MQTT-пароль
  3. Подпишитесь на /{productId}/{deviceNum}/function/get
  4. Опубликуйте информацию об устройстве в /{productId}/{deviceNum}/info/post
  5. Опубликуйте данные свойств в /{productId}/{deviceNum}/property/post
  6. Наблюдайте онлайн-статус устройства и рабочие данные в консоли платформы

Контрольный список приёмки интеграции ​

ШагПроверяемое содержимоеПризнак успеха
1Продукт опубликованСтатус продукта — «Опубликован»
2Подключение MQTTXВ деталях устройства отображается «В сети»
3/info/postОбновились поля информации об устройстве, сигнала, версии
4/property/postВ состоянии работы отображаются значения свойств модели вещи
5/event/postВ журнале событий появляются отправленные события
6/function/getУстройство получает команду после отправки платформой
7Возврат результатаУстройство возвращает результат выполнения, состояние на платформе обновляется
8Правила/сценарииСвязанные правила, сценарии и оповещения срабатывают

Типичные ошибки ​

Соединение отклонено ​

  1. Открыт ли порт 1883 на сервере
  2. Запущен ли встроенный MQTT Broker
  3. Верен ли формат clientId (S&deviceNumber&productId&userId)
  4. Включён ли для продукта код авторизации устройства
  5. Не заблокировано ли устройство

Устройство в сети, но свойства не обновляются ​

  1. Является ли топик публикации /{productId}/{deviceNum}/property/post
  2. Используется ли в productId ID продукта (а не номер продукта)
  3. Совпадает ли deviceNum точно с номером устройства
  4. Является ли тело сообщения JSON-массивом
  5. Совпадает ли id точно с идентификатором модели вещи
  6. Соответствует ли value типу данных

Платформа отправляет команду, но устройство её не получает ​

  1. Подписано ли устройство на /{productId}/{deviceNum}/function/get
  2. Находится ли устройство ещё в сети
  3. Является ли элемент модели вещи записываемой функцией или свойством, допускающим отправку
  4. Есть ли у пользователя права на просмотр деталей устройства и отправку команд

Правило или оповещение не срабатывает ​

  1. Попадают ли данные устройства в состояние работы платформы
  2. Верны ли продукт, устройство и переменные, привязанные к сценарию или правилу
  3. Совпадает ли тип выражения условия с типом отправляемого значения
  4. Включена ли конфигурация оповещений

Преобразование скриптами правил ​

Если устройство использует собственный формат данных, можно написать логику преобразования в скриптах правил, чтобы привести исходные данные к стандартному формату платформы. Подробнее см. Скрипты правил (на кит.).

Связанные документы ​