Скачать инструкцию в виде PDF файла
1. Введение
Настоящая инструкция показывает, как обеспечить взаимодействие логического контроллера LogicMachine и других устройств (например, датчиков) по протоколу MQTT. В роли MQTT брокера выступает сервис компании Яндекс “IoT Core” (IoT – Internet of Things – с английского: интернет вещей). В тексте также приводятся выдержки из документации на сервисы Яндекс.
1.1 Взаимосвязь ресурсов сервиса
Основными элементами сервиса являются устройство и реестр, которые могут обмениваться различными данными и командами с помощью MQTT-брокера .
Обмен данными происходит по протоколу MQTT версии 3.1.1. Это упрощенный сетевой протокол для взаимодействия между устройствами по принципу издатель-подписчик.
Чтобы начать обмен данными и командами между устройствами и реестрами, необходимо авторизоваться. Это можно сделать с помощью X.509-сертификатов или по логину и паролю.
Внутри сервиса устройства и реестры обмениваются данными и командами, представленными в виде сообщений c определенными топиками .
1.2 Начало работы
Устройство и реестр взаимодействуют с помощью X.509-сертификатов. Если у Вас есть сертификат, просто добавьте его к устройству в реестре. Если у Вас нет сертификата, его можно создать, например, с помощью программы OpenSSL:
$ openssl req -x509 \
-newkey rsa:4096 \
-keyout key.pem \
-out cert.pem \
-nodes \
-days 365 \
-subj ‘/CN=localhost’
Где:
• -x509 — X.509-сертификат.
• newkey — алгоритм шифрования.
• -keyout — файл, в который будет записан приватный ключ.
• -out — файл, в который будет сохранен сертификат.
• -nodes — флаг, который устанавливается, когда не надо шифровать публичный ключ.
• -days — срок действия сертификата в днях.
• -subj — объект запроса
Дальнейшие операции выполняются в веб-интерфейсе Яндекс. Для отправки и принятия сообщений нужно воспользоваться интерфейсом командной строки Яндекс.Облака.
2. Реестры.
2.1 Создание реестра
После перехода в сервис IoT Core будет доступен первый раздел: Реестры. Необходимо перейти к созданию реестра, нажав на кнопку «Создать реестр» (рисунок 1).
Рисунок 1 – Первый шаг – создание реестра
На странице создания реестра нужно ввести имя реестра и пароль (рисунок 2). Поля «Описание» и «Метки» созданы для удобства, их можно оставить пустыми.
Рисунок 2 – Создание реестра в консоли (веб-интерфейс)
Далее необходимо добавить сертификат, сделанный в OpenSSL (рисунок 3).
Рисунок 3 – Сообщение о необходимости добавить сертификат
После нажатия на кнопку «Добавить сертификат» станет доступна форма для его добавления (рисунок 4).
Рисунок 4 – Форма для выбора файла существующего сертификата (2 варианта добавления)
После создания реестра он появится в списке (рисунок 5):
Рисунок 5 – Список реестров
2.2 Работа с реестром.
При нажатии на реестр в списке, Вы попадете в него. Во вкладке «Обзор» (рисунок 6) можно узнать ID реестра, который понадобится в скриптах, добавить новые пароли и сертификаты, а также удалить старые.
Рисунок 6 – Вкладка «Обзор» для работы с реестром
Во вкладке «Устройства» (рисунок 7) происходит добавление и изменение устройств.
Рисунок 7 – Вкладка «Устройства»
Во вкладке «Логи» находятся сообщения о подключении к реестру с помощью MQTT (рисунок 8).
Рисунок 8 – Вкладка «Логи» для просмотра сообщений о подключении к реестру
Во вкладке «Операции» (рисунок 9) находятся сообщения о действиях с реестром: добавление сертификатов, устройств и т.п.
Рисунок 9 – Вкладка «Операции» о действиях с реестром
3. Создание устройства.
3.1 Создание устройства
Вернёмся к вкладке «Устройства», показанной на рисунке 7. После нажатия кнопки «Добавить устройство» Вам предлагается заполнить форму, представленную на рисунке 10. Здесь нужно ввести имя устройства и пароль. Поля «Описание» и список алиасов созданы для удобства, их можно оставить пустыми на данном этапе.
Для этого действия также необходимо добавить сертификат.
Рисунок 10 – Добавление устройства
3.2 Работа с устройством
При нажатии на устройство в списке устройств реестра (рисунок 7) откроется окно редактирования его параметров, в котором можно узнать ID устройства, добавить или удалить пароли и сертификаты для авторизации по MQTT (рисунок 11).
Рисунок 11 – Вкладка «Обзор» для работы с устройством
Во вкладке «Логи» находятся сообщения о подключении к реестру с помощью MQTT (рисунок 12).
Рисунок 12 – Вкладка «Логи» с сообщениями о подключении устройства
Во вкладке «Операции» (рисунок 13) находятся сообщения о действиях с реестром: добавление сертификатов, устройств и т.п.
Рисунок 13 – Вкладка «Операции» с сообщениями о действиях с устройством
4. Добавление скриптов для обмена сообщениями.
4.1 Отправка сообщения
В интерфейсе LogicMachine (рисунок 14) перейдите на вкладку «Scripting (Скрипты)», откройте Event-based (событийные). Нажмите на кнопку «Add new script».
Рисунок 14 – Список событийных скриптов в интерфейсе LogicMachine
В появившемся окне настроек (рисунок 15) в поле «Script name» введите любое удобное для Вас название скрипта для отправки сообщений в облако, в списке «Group address / tag)» выберите групповой адрес или тэг источника события.
Рисунок 15 – Настройки для событийного скрипта
Откройте скрипт в редакторе, скопируйте в основное поле текст, приведённый в листинге «MQTT Publish.lua» в конце инструкции. Отредактируйте значения переменных id_dev, id_reg, username, password в соответствии с данными, приведёнными на вкладках «Обзор» интерфейса Яндекс (рисунки 6, 11).
4.2 Подписка устройства или реестра на получение сообщений
В интерфейсе LogicMachine (рисунок 16) на вкладке «Scripting (Скрипты)», откройте Resident (резидентные). Нажмите на кнопку «Add new script».
Рисунок 16 – Список резидентных скриптов в интерфейсе LogicMachine
В появившемся окне настроек (рисунок 17) в поле «Script name» введите любое удобное для Вас название скрипта для получения сообщений из облака, в списке «Sleep interval (seconds)» выберите значение «0». Не забудьте активировать скрипты.
Рисунок 17 – Настройки для резидентного скрипта
Откройте скрипт в редакторе, скопируйте в основное поле текст, приведённый в листинге «MQTT Subscribe.lua» в конце инструкции. Отредактируйте значения переменных id_dev, id_reg, username, password в соответствии с данными, приведёнными на вкладках «Обзор» интерфейса Яндекс (рисунки 6, 11).
Скрипт MQTT Publish
log('start')
broker = "mqtt.cloud.yandex.net"
port = 8883
id_dev = '<id устройства>'
id_reg = '<id реестра>'
username = id_dev -- Логин — это идентификатор устройства или реестра.
password = "<пароль>" -- Пароль — это заданная вами комбинация символов.
-- Также пароль может быть сгенерирован с помощью YC CLI.
-- Минимальная длина пароля — 14 символов.
-- Пароль должен содержать 3 из 4 групп символов:
-- строчные латинские буквы, прописные латинские буквы, цифры, специальные символы.
dev_topic = "$devices/" .. id_dev .. "/events"
reg_topic = "$registries/" .. id_reg .. "/events"
-- $devices/<ID устройства>/commands
-- $registries/<ID реестра>/events
-- $registries/<ID реестра>/commands
--[[
events: устройство отправляет/реестр получает
commands: реестр отправляет/устройство получает
$devices: устройство известно
$registries: устройство неизвестно
--]]
payload = event.getvalue() --100 -- отправляемое
mqtt = require("mosquitto")
client = mqtt.new()
client.ON_CONNECT = function(status, rc, msg)
if status then
log("mqtt connected")
client:publish(dev_topic, tostring(payload))
else
log("mqtt connect failed " .. tostring(msg))
client:disconnect()
end
end
client.ON_PUBLISH = function()
client:disconnect()
end
client:login_set(username, password)
client:tls_set('/home/ftp/rootCA.crt')
-- rootCA.crt - сертификат Яндекса с https://storage.yandexcloud.net/mqtt/rootCA.crt
status, rc, msg = client:connect(broker, port)
if status then
client:loop_forever()
else
log("connect failed: " .. tostring(msg))
end
Скрипт MQTT Subscribe
if not broker then
broker = "mqtt.cloud.yandex.net"
port = 8883
id_dev = '<id устройства>'
id_reg = '<id регистра>'
username = id_dev -- Логин — это идентификатор устройства или реестра.
password = "<пароль устройства>" -- Пароль — это заданная вами комбинация символов.
-- Также пароль может быть сгенерирован с помощью YC CLI.
-- Минимальная длина пароля — 14 символов.
-- Пароль должен содержать 3 из 4 групп символов:
-- строчные латинские буквы, прописные латинские буквы, цифры, специальные символы.
dev_topic = "$devices/" .. id_dev .. "/commands"
reg_topic = "$registries/" .. id_reg .. "/commands"
-- $devices/<ID устройства>/commands
-- $registries/<ID реестра>/events
-- $registries/<ID реестра>/commands
--[[
events: устройство отправляет/реестр получает
commands: реестр отправляет/устройство получает
$devices: устройство известно
$registries: устройство неизвестно
--]]
mqtt = require("mosquitto")
client = mqtt.new()
client.ON_CONNECT = function(status, rc, msg)
if status then
log("mqtt connected")
client:subscribe(reg_topic)
client:subscribe(dev_topic)
else
log("mqtt connect failed " .. tostring(msg))
client:disconnect()
end
end
client.ON_PUBLISH = function()
client:disconnect()
end
client.ON_MESSAGE = function(mid, topic, payload)
log(mid, topic, payload)
end
client.ON_DISCONNECT = function(...)
log('mqtt disconnect', ...)
end
client.ON_SUBSCRIBE = function(...)
log('subcribe: ', ...)
end
client:login_set(username, password)
client:tls_set('/home/ftp/rootCA.crt')
status, rc, msg = client:connect(broker, port)
if status then
client:loop_forever()
else
log("connect failed: " .. tostring(msg))
end
end