ГлавнаяАкадемияCOURSE-16: Основы Интернета Вещей и практическое применение → Введение в облачные технологии для IoT-систем

Введение в облачные технологии для IoT-систем

Урок 2 · COURSE-16: Основы Интернета Вещей и практическое применение · theory

COURSE-16-M03-L03 — Введение в облачные технологии для IoT-систем

Роль облачных технологий в системах автоматизации

Облачные технологии — это модель предоставления вычислительных ресурсов (серверов, баз данных, программного обеспечения) через интернет по запросу. В контексте систем автоматизации на платформе HI, облако не заменяет контроллер, а расширяет его возможности.

Контроллер HI является граничным устройством (Edge Device). Он выполняет критически важные задачи локально:

Облако, в свою очередь, используется для решения задач верхнего уровня:

💡 Ключевая идея: Контроллер HI обеспечивает надежность и автономность на объекте, а облако — глобальную доступность и масштабируемость.

Модели облачных сервисов с точки зрения инженера HI

Для инженера автоматизации важно понимать, какой уровень ответственности предполагает та или иная модель облачного сервиса.

IaaS (Infrastructure as a Service — Инфраструктура как услуга)

Вы арендуете "голое железо": виртуальные серверы (VM), дисковое пространство, сетевые ресурсы.

PaaS (Platform as a Service — Платформа как услуга)

Вы получаете готовую к использованию платформу, например, управляемую базу данных или готовый IoT-сервис.

* Управляемый MQTT-брокер: HiveMQ Cloud, CloudMQTT.

* Управляемая база данных: Yandex Managed Service for PostgreSQL/MySQL.

* IoT-платформы: Yandex IoT Core, Azure IoT Hub.

SaaS (Software as a Service — Программное обеспечение как услуга)

Вы получаете полностью готовый к использованию продукт, доступный через веб-интерфейс или API.

Типы облаков: выбор для вашего объекта

* Локально на контроллере: Выполняются все критически важные сценарии, не требующие подключения к интернету (управление освещением по датчику движения, климат-контроль, системы безопасности). Данные хранятся локально в MySQL на контроллере.

* В облако отправляется: Телеметрия для анализа (температура, влажность, потребление энергии), события для уведомлений, данные для удаленного управления некритичными функциями.

⚠️ Золотое правило инженера HI: Система должна сохранять базовую функциональность (свет, безопасность, климат) даже при полном отсутствии интернет-соединения. Облако — это расширение, а не фундамент.

Практика: подключение контроллера HI к облаку через MQTT

MQTT — это легковесный протокол обмена сообщениями, ставший стандартом для IoT. Он идеально подходит для отправки данных с контроллера в облако.

Задача: Отправлять показания датчика температуры в облачную PaaS-платформу (например, HiveMQ Cloud). Архитектура:

`[Датчик 1-Wire] -> [Контроллер HI (Node-RED)] --(MQTT через TCP/IP)--> [Интернет] --(TLS)--> [Облачный MQTT-брокер]`

Flow Diagram (ASCII):
           +---------------------+    +--------------------------+    +----------------------+

[Inject] -> | ds18b20 (1-Wire In) | -> | Function: Validate/Format| -> | mqtt out |

+---------------------+ +--------------------------+ +----------------------+

| | (status)

| (on error) v

v +----------------+

+---------------------+ | Status Node |

| Catch Node | -> [To Error Logger] +----------------+

+---------------------+

Шаг 1: Настройка узла `mqtt out`
  • Перетащите узел `mqtt out` на холст.
  • В свойствах узла, в поле "Server", выберите "Add new mqtt-broker..." и нажмите на иконку редактирования.
  • Вкладка "Connection":
  • * `Server`: Адрес брокера (например, `abcdef123.s1.eu.hivemq.cloud`).

    * `Port`: Порт, который поддерживает TLS (обычно `8883`).

    * `Enable secure (TLS) connection`: Обязательно включить! Создайте новую конфигурацию TLS, оставив поля пустыми (если не используются клиентские сертификаты).

  • Вкладка "Security":
  • * `Username`: Ваш логин от MQTT-брокера.

    * `Password`: Ваш пароль.

  • Нажмите "Add", чтобы сохранить конфигурацию.
  • Шаг 2: Формирование сообщения (Паттерн "Контракт сообщения")

    Используйте узел `Function` перед узлом `mqtt out` для приведения данных к стандартному формату.

    // Входящее сообщение от узла датчика: msg.payload = 24.7
    

    let temp = parseFloat(msg.payload);

    // 1. Валидация

    if (isNaN(temp) || temp < -55 || temp > 125) {

    node.status({fill:"red", shape:"dot", text:"Invalid reading"});

    node.error("Некорректное значение температуры: " + msg.payload, msg);

    return null; // Останавливаем поток

    }

    // 2. Формирование топика для маршрутизации в облаке

    // Формат: project/object/controller_id/data_type

    msg.topic = "myhome/livingroom/ctrl01/temperature";

    // 3. Формирование полезной нагрузки (payload) по контракту

    // Это гарантирует, что облачная платформа получит структурированные данные

    msg.payload = {

    "value": temp,

    "source": "28-01234567abcd", // Уникальный ID датчика 1-Wire

    "ts": Date.now(), // Временная метка в миллисекундах

    "unit": "°C"

    };

    // 4. Преобразование объекта JSON в строку для отправки

    msg.payload = JSON.stringify(msg.payload);

    node.status({fill:"green", shape:"dot", text:"OK: " + temp + " °C"});

    return msg;

    Шаг 3: Обработка ошибок и мониторинг статуса

    💡 Практический сценарий: Если узел `Status` сообщает о `disconnected`, можно запустить сценарий, который временно сохраняет данные в локальную базу MySQL на контроллере, чтобы отправить их позже, когда соединение восстановится.

    Безопасность при работе с облаком

    Безопасность — это не опция, а требование.

    ---

    Лабораторные работы

    COURSE-16-M03-LAB05: Подключение к публичному MQTT-брокеру

    Цель: Научиться настраивать MQTT-соединение в Node-RED и отправлять тестовые данные. Оборудование: Контроллер HI, доступ в интернет. Задание:
  • Создайте аккаунт на публичном MQTT-брокере (например, `HiveMQ Cloud Free`).
  • В Node-RED на контроллере HI создайте поток: `[Inject]` -> `[Function]` -> `[mqtt out]`.
  • Настройте узел `mqtt out` для подключения к вашему брокеру с использованием TLS (порт 8883) и ваших учетных данных.
  • В узле `Function` сформируйте тестовое JSON-сообщение согласно контракту.
  • Настройте узел `Inject` на отправку сообщения каждые 10 секунд.
  • С помощью стороннего MQTT-клиента (например, MQTT Explorer) подпишитесь на ваш топик и убедитесь, что сообщения приходят.
  • Рубрика оценивания:

    COURSE-16-M03-LAB06: Отправка реальных данных с локальной обработкой ошибок

    Цель: Создать отказоустойчивый поток для отправки данных с физического датчика в облако. Оборудование: Контроллер HI, датчик температуры DS18B20, доступ в интернет. Задание:
  • Подключите датчик DS18B20 к универсальному входу контроллера.
  • Создайте поток, который считывает данные с датчика каждые 30 секунд.
  • Добавьте логику из урока для валидации, форматирования по контракту и отправки данных через `mqtt out`.
  • Добавьте узел `Status`, отслеживающий узел `mqtt out`.
  • Добавьте узел `Switch`, который проверяет статус. Если статус `disconnected`, сообщение должно перенаправляться в локальный файл (`file out` node) или в `Debug` с пометкой "OFFLINE".
  • Рубрика оценивания:

    ---

    Тест для самопроверки (COURSE-16-M03-QUIZ)

  • Какая модель облачных сервисов предоставляет вам "голый" виртуальный сервер, на который вы сами устанавливаете ОС и ПО?
  • a) SaaS

    b) PaaS

    c) IaaS

    d) FaaS

  • Вы хотите использовать облачный MQTT-брокер, не заботясь о его администрировании. Какую модель вы выберете?
  • a) SaaS

    b) PaaS

    c) IaaS

    d) On-Premise

  • Что такое "гибридная" модель облака в контексте платформы HI?
  • a) Использование двух облачных провайдеров одновременно.

    b) Выполнение критичной логики на контроллере, а отправка телеметрии в публичное облако.

    c) Хранение данных частично на SD-карте, частично в EEPROM.

    d) Использование и Wi-Fi, и GSM для подключения к облаку.

  • Какой протокол является стандартом де-факто для связи IoT-устройств с облаком?
  • a) Modbus TCP

    b) HTTP

    c) MQTT

    d) CAN

  • Для безопасного подключения к MQTT-брокеру следует использовать порт...
  • a) 1883 без шифрования.

    b) 8883 с TLS-шифрованием.

    c) 502.

    d) 80.

  • Что определяет "контракт сообщения" при отправке данных в облако?
  • a) Скорость интернет-соединения.

    b) Стандартная структура и формат данных (JSON) в `msg.payload`.

    c) Физический способ подключения контроллера.

    d) Юридический договор с облачным провайдером.

  • Что произойдет с системой автоматизации на контроллере HI, если пропадет интернет?
  • a) Все сценарии перестанут работать.

    b) Контроллер перезагрузится.

    c) Критически важные локальные сценарии продолжат работать автономно.

    d) Данные за последний час будут безвозвратно утеряны.

  • Зачем в Node-RED использовать узел `Status` для узла `mqtt out`?
  • a) Чтобы измерять скорость отправки сообщений.

    b) Чтобы менять топик на лету.

    c) Чтобы отслеживать состояние соединения (connected/disconnected) и реагировать на его изменение.

    d) Чтобы видеть payload сообщения без узла `Debug`.

  • Что такое ACL в контексте безопасности MQTT?
  • a) Advanced Connection Logic.

    b) Access Control List — списки, определяющие, в какие топики клиент может публиковать и подписываться.

    c) Asynchronous Communication Layer.

    d) Audit and Control Log.

  • Какое действие является неправильным с точки зрения безопасности?
  • a) Использовать TLS-шифрование.

    b) Настраивать ACL для каждого устройства.

    c) Использовать один и тот же логин/пароль для всех контроллеров на всех объектах.

    d) Генерировать уникальные учетные данные для каждого контроллера.

    ---

    📋 Мини-runbook "Если не работает": MQTT-соединение с облаком

    Если данные с контроллера не поступают в облако, последовательно проверьте следующие пункты:

  • Проверка на контроллере (Node-RED):
  • * Статус узла `mqtt out`: Посмотрите на статус под узлом. Он `connected` (зеленый), `connecting` (желтый) или `disconnected` (красный)?

    * Если `disconnected`:

    * Проверьте правильность адреса сервера, порта (`8883` для TLS), логина и пароля. Одна опечатка — и ничего не заработает.

    * Убедитесь, что в настройках включен TLS.

    * Проверьте интернет-соединение на самом контроллере. Зайдите в терминал Linux и выполните команду `ping 8.8.8.8`. Если пинга нет — проблема в сети. Затем попробуйте `ping your-broker-address.com`. Если первый есть, а второго нет — проблема в DNS или файрволе.

    * Если `connected`:

    * Проверьте узел `Debug`, подключенный к выходу узла `Function`. Убедитесь, что `msg.payload` является строкой в формате JSON, а `msg.topic` задан корректно.

    * Убедитесь, что узел `Inject` действительно отправляет сообщения.

  • Проверка на стороне облака (MQTT-клиент):
  • * Подписка на правильный топик: Используйте MQTT Explorer или другой клиент для подписки на тот же топик, в который публикует контроллер. Убедитесь в отсутствии опечаток.

    * Подписка на "wildcard" топик: Попробуйте подписаться на `project/object/controller_id/#` или даже на `#`, чтобы увидеть, приходят ли вообще какие-либо сообщения от вашего клиента. Возможно, вы ошиблись в названии конечного топика.

    * Проверка ACL: Зайдите в панель управления вашего облачного брокера и проверьте правила ACL для пользователя, под которым подключается контроллер. Убедитесь, что у него есть права на `PUBLISH` в нужный топик.

  • Проверка сети:
  • * Блокировка портов: Убедитесь, что сетевой файрвол на объекте (в роутере) не блокирует исходящие соединения на порт `8883`. Это частая проблема в корпоративных сетях.