# Подключите ваше устройство к Интернету ![Скетчноут с обзором урока](../../../../../translated_images/lesson-4.7344e074ea68fa545fd320b12dce36d72dd62d28c3b4596cb26cf315f434b98f.ru.jpg) > Скетчноут от [Nitya Narasimhan](https://github.com/nitya). Нажмите на изображение, чтобы увидеть его в большем размере. Этот урок был проведен в рамках серии [Hello IoT](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) от [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). Урок состоял из двух видео: часового занятия и часового офисного часа, где более подробно рассматривались части урока и отвечались вопросы. [![Урок 4: Подключите ваше устройство к Интернету](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs) [![Урок 4: Подключите ваше устройство к Интернету - Офисные часы](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q) > 🎥 Нажмите на изображения выше, чтобы посмотреть видео ## Тест перед лекцией [Тест перед лекцией](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7) ## Введение **I** в IoT означает **Internet** — облачное подключение и сервисы, которые обеспечивают множество функций IoT-устройств, от сбора данных с датчиков, подключенных к устройству, до отправки сообщений для управления исполнительными механизмами. IoT-устройства обычно подключаются к одному облачному IoT-сервису, используя стандартный протокол связи, а этот сервис подключается к остальной части вашего IoT-приложения, включая AI-сервисы для принятия умных решений на основе данных, а также веб-приложения для управления или отчетности. > 🎓 Данные, собранные с датчиков и отправленные в облако, называются телеметрией. IoT-устройства могут получать сообщения из облака. Часто эти сообщения содержат команды — инструкции для выполнения действия либо внутри устройства (например, перезагрузка или обновление прошивки), либо с использованием исполнительного механизма (например, включение света). Этот урок знакомит с некоторыми протоколами связи, которые IoT-устройства могут использовать для подключения к облаку, а также с типами данных, которые они могут отправлять или получать. Вы также получите практический опыт работы с ними, добавив управление через Интернет к вашему ночнику, переместив логику управления светодиодом в код "сервера", работающего локально. В этом уроке мы рассмотрим: * [Протоколы связи](../../../../../1-getting-started/lessons/4-connect-internet) * [Message Queueing Telemetry Transport (MQTT)](../../../../../1-getting-started/lessons/4-connect-internet) * [Телеметрия](../../../../../1-getting-started/lessons/4-connect-internet) * [Команды](../../../../../1-getting-started/lessons/4-connect-internet) ## Протоколы связи Существует множество популярных протоколов связи, которые IoT-устройства используют для взаимодействия с Интернетом. Наиболее популярные из них основаны на обмене сообщениями по принципу публикации/подписки через брокер. IoT-устройства подключаются к брокеру, публикуют телеметрию и подписываются на команды. Облачные сервисы также подключаются к брокеру, подписываются на все сообщения телеметрии и публикуют команды либо для конкретных устройств, либо для групп устройств. ![IoT-устройства подключаются к брокеру, публикуют телеметрию и подписываются на команды. Облачные сервисы подключаются к брокеру, подписываются на всю телеметрию и отправляют команды конкретным устройствам.](../../../../../translated_images/pub-sub.7c7ed43fe9fd15d4e1f81a3fd95440413c457acd9bcbe9a43341e30e88db5264.ru.png) MQTT — самый популярный протокол связи для IoT-устройств, и он рассматривается в этом уроке. Другие протоколы включают AMQP и HTTP/HTTPS. ## Message Queueing Telemetry Transport (MQTT) [MQTT](http://mqtt.org) — это легковесный, открытый стандарт протокола обмена сообщениями, который позволяет отправлять сообщения между устройствами. Он был разработан в 1999 году для мониторинга нефтепроводов, а спустя 15 лет был выпущен как открытый стандарт компанией IBM. MQTT использует одного брокера и множество клиентов. Все клиенты подключаются к брокеру, а брокер маршрутизирует сообщения к соответствующим клиентам. Сообщения маршрутизируются с использованием именованных тем, а не отправляются напрямую отдельному клиенту. Клиент может публиковать сообщения в тему, и все клиенты, подписанные на эту тему, получат сообщение. ![IoT-устройство публикует телеметрию в теме /telemetry, а облачный сервис подписывается на эту тему](../../../../../translated_images/mqtt.cbf7f21d9adc3e17548b359444cc11bb4bf2010543e32ece9a47becf54438c23.ru.png) ✅ Проведите исследование. Если у вас много IoT-устройств, как можно убедиться, что ваш MQTT-брокер справится с обработкой всех сообщений? ### Подключите ваше IoT-устройство к MQTT Первый шаг в добавлении управления через Интернет к вашему ночнику — подключение его к MQTT-брокеру. #### Задание Подключите ваше устройство к MQTT-брокеру. На этом этапе урока вы подключите ваш IoT-ночник к Интернету, чтобы его можно было управлять удаленно. Позже в этом уроке ваше IoT-устройство отправит телеметрическое сообщение через MQTT на публичный MQTT-брокер с уровнем освещенности, где оно будет обработано серверным кодом, который вы напишете. Этот код проверит уровень освещенности и отправит командное сообщение обратно на устройство, чтобы включить или выключить светодиод. Реальный пример использования такой системы может быть связан с сбором данных с нескольких датчиков освещенности перед принятием решения о включении света в месте с большим количеством ламп, например, на стадионе. Это может предотвратить включение света, если только один датчик оказался в тени облаков или птицы, а остальные датчики фиксируют достаточный уровень освещенности. ✅ Какие еще ситуации могут требовать оценки данных с нескольких датчиков перед отправкой команд? Вместо того чтобы разбираться с настройкой MQTT-брокера в рамках этого задания, вы можете использовать публичный тестовый сервер, который работает на [Eclipse Mosquitto](https://www.mosquitto.org), открытом MQTT-брокере. Этот тестовый брокер доступен по адресу [test.mosquitto.org](https://test.mosquitto.org) и не требует создания учетной записи, что делает его отличным инструментом для тестирования MQTT-клиентов и серверов. > 💁 Этот тестовый брокер является публичным и небезопасным. Любой может слушать то, что вы публикуете, поэтому его не следует использовать для данных, которые нужно сохранить в тайне. ![Диаграмма задания, показывающая чтение и проверку уровня освещенности, а также управление светодиодом](../../../../../translated_images/assignment-1-internet-flow.3256feab5f052fd273bf4e331157c574c2c3fa42e479836fc9c3586f41db35a5.ru.png) Следуйте соответствующему шагу ниже, чтобы подключить ваше устройство к MQTT-брокеру: * [Arduino - Wio Terminal](wio-terminal-mqtt.md) * [Одноплатный компьютер - Raspberry Pi/Виртуальное IoT-устройство](single-board-computer-mqtt.md) ### Более глубокое изучение MQTT Темы могут иметь иерархию, и клиенты могут подписываться на разные уровни иерархии, используя подстановочные знаки. Например, вы можете отправлять сообщения телеметрии температуры в тему `/telemetry/temperature` и сообщения влажности в тему `/telemetry/humidity`, а затем в вашем облачном приложении подписаться на тему `/telemetry/*`, чтобы получать сообщения телеметрии температуры и влажности. Сообщения могут отправляться с уровнем качества обслуживания (QoS), который определяет гарантию получения сообщения. * Максимум один раз — сообщение отправляется только один раз, и клиент и брокер не предпринимают дополнительных шагов для подтверждения доставки (отправить и забыть). * Минимум один раз — сообщение повторно отправляется отправителем несколько раз, пока не будет получено подтверждение (подтвержденная доставка). * Ровно один раз — отправитель и получатель выполняют двухуровневое рукопожатие, чтобы гарантировать получение только одной копии сообщения (гарантированная доставка). ✅ Какие ситуации могут требовать гарантированной доставки сообщения вместо отправки и забывания? Несмотря на название Message Queueing (MQTT), протокол фактически не поддерживает очереди сообщений. Это означает, что если клиент отключится, а затем подключится снова, он не получит сообщения, отправленные во время отключения, за исключением тех, которые он уже начал обрабатывать с использованием процесса QoS. Сообщения могут иметь установленный флаг сохранения. Если этот флаг установлен, MQTT-брокер сохранит последнее сообщение, отправленное в тему с этим флагом, и отправит его любым клиентам, которые позже подпишутся на эту тему. Таким образом, клиенты всегда будут получать последнее сообщение. MQTT также поддерживает функцию keep alive, которая проверяет, активное ли соединение во время длительных пауз между сообщениями. > 🦟 [Mosquitto от Eclipse Foundation](https://mosquitto.org) предоставляет бесплатный MQTT-брокер, который вы можете запустить самостоятельно для экспериментов с MQTT, а также публичный MQTT-брокер для тестирования вашего кода, доступный по адресу [test.mosquitto.org](https://test.mosquitto.org). Соединения MQTT могут быть публичными и открытыми или зашифрованными и защищенными с использованием имен пользователей и паролей или сертификатов. > 💁 MQTT работает через TCP/IP, тот же сетевой протокол, что и HTTP, но на другом порту. Вы также можете использовать MQTT через веб-сокеты для взаимодействия с веб-приложениями, работающими в браузере, или в ситуациях, когда брандмауэры или другие сетевые правила блокируют стандартные соединения MQTT. ## Телеметрия Слово "телеметрия" происходит от греческих корней, означающих "измерять удаленно". Телеметрия — это процесс сбора данных с датчиков и отправки их в облако. > 💁 Одно из первых устройств телеметрии было изобретено во Франции в 1874 году и отправляло данные о погоде и глубине снега в реальном времени с Монблана в Париж. Оно использовало физические провода, так как беспроводные технологии в то время были недоступны. Давайте вернемся к примеру умного термостата из Урока 1. ![Термостат, подключенный к Интернету, использующий несколько датчиков температуры](../../../../../translated_images/telemetry.21e5d8b97649d2ebeb0f68d4b9691ab2d1f7bd629338e131465aff8a614e4d4a.ru.png) Термостат имеет датчики температуры для сбора телеметрии. Скорее всего, у него будет один встроенный датчик температуры, и он может подключаться к нескольким внешним датчикам температуры через беспроводной протокол, такой как [Bluetooth Low Energy](https://wikipedia.org/wiki/Bluetooth_Low_Energy) (BLE). Пример данных телеметрии, которые он может отправлять: | Имя | Значение | Описание | | ---- | ----- | ----------- | | `thermostat_temperature` | 18°C | Температура, измеренная встроенным датчиком температуры термостата | | `livingroom_temperature` | 19°C | Температура, измеренная удаленным датчиком температуры, который был назван `livingroom` для идентификации комнаты, в которой он находится | | `bedroom_temperature` | 21°C | Температура, измеренная удаленным датчиком температуры, который был назван `bedroom` для идентификации комнаты, в которой он находится | Облачный сервис затем может использовать эти данные телеметрии для принятия решений о том, какие команды отправить для управления отоплением. ### Отправка телеметрии с вашего IoT-устройства Следующий шаг в добавлении управления через Интернет к вашему ночнику — отправка телеметрии уровня освещенности на MQTT-брокер в тему телеметрии. #### Задание — отправка телеметрии с вашего IoT-устройства Отправьте телеметрию уровня освещенности на MQTT-брокер. Данные отправляются в формате JSON — сокращение от JavaScript Object Notation, стандарта для кодирования данных в текстовом виде с использованием пар ключ/значение. ✅ Если вы ранее не сталкивались с JSON, вы можете узнать больше о нем в [документации JSON.org](https://www.json.org/). Следуйте соответствующему шагу ниже, чтобы отправить телеметрию с вашего устройства на MQTT-брокер: * [Arduino - Wio Terminal](wio-terminal-telemetry.md) * [Одноплатный компьютер - Raspberry Pi/Виртуальное IoT-устройство](single-board-computer-telemetry.md) ### Получение телеметрии от MQTT-брокера Нет смысла отправлять телеметрию, если на другом конце никто ее не слушает. Телеметрия уровня освещенности нуждается в чем-то, что будет ее слушать и обрабатывать данные. Этот "серверный" код — это тот тип кода, который вы будете разворачивать в облачном сервисе как часть более крупного IoT-приложения, но здесь вы будете запускать этот код локально на вашем компьютере (или на вашем Raspberry Pi, если вы работаете непосредственно на нем). Серверный код состоит из Python-приложения, которое слушает сообщения телеметрии через MQTT с уровнями освещенности. Позже в этом уроке вы заставите его отвечать командным сообщением с инструкциями включить или выключить светодиод. ✅ Проведите исследование: Что происходит с сообщениями MQTT, если нет слушателя? #### Установите Python и VS Code Если у вас не установлен Python и VS Code локально, вам нужно будет установить их оба, чтобы написать серверный код. Если вы используете виртуальное IoT-устройство или работаете на вашем Raspberry Pi, вы можете пропустить этот шаг, так как они уже должны быть установлены и настроены. ##### Задание — установка Python и VS Code Установите Python и VS Code. 1. Установите Python. Обратитесь к [странице загрузки Python](https://www.python.org/downloads/) для инструкций по установке последней версии Python. 1. Установите Visual Studio Code (VS Code). Это редактор, который вы будете использовать для написания кода виртуального устройства на Python. Обратитесь к [документации VS Code](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn) для инструкций по установке VS Code. 💁 Вы можете использовать любой Python IDE или редактор для этих уроков, если у вас есть предпочтительный инструмент, но инструкции в уроках будут основаны на использовании VS Code. 1. Установите расширение Pylance для VS Code. Это расширение для VS Code, которое предоставляет поддержку языка Python. Ознакомьтесь с [документацией по расширению Pylance](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance), чтобы узнать, как установить это расширение в VS Code. #### Настройка виртуального окружения Python Одной из мощных возможностей Python является возможность устанавливать [pip-пакеты](https://pypi.org) — это пакеты кода, написанные другими людьми и опубликованные в Интернете. Вы можете установить pip-пакет на свой компьютер одной командой, а затем использовать этот пакет в своем коде. Вы будете использовать pip для установки пакета для работы с MQTT. По умолчанию, когда вы устанавливаете пакет, он становится доступным везде на вашем компьютере, что может привести к проблемам с версиями пакетов — например, одно приложение зависит от одной версии пакета, которая перестает работать, если вы устанавливаете новую версию для другого приложения. Чтобы избежать этой проблемы, вы можете использовать [виртуальное окружение Python](https://docs.python.org/3/library/venv.html) — по сути, это копия Python в выделенной папке, и при установке pip-пакетов они устанавливаются только в эту папку. ##### Задача — настройка виртуального окружения Python Настройте виртуальное окружение Python и установите pip-пакеты для MQTT. 1. В терминале или командной строке выполните следующую команду в выбранной вами директории, чтобы создать и перейти в новую папку: ```sh mkdir nightlight-server cd nightlight-server ``` 1. Теперь выполните следующую команду, чтобы создать виртуальное окружение в папке `.venv`: ```sh python3 -m venv .venv ``` > 💁 Вам нужно явно вызвать `python3`, чтобы создать виртуальное окружение, на случай если у вас установлены Python 2 и Python 3 (последняя версия). Если у вас установлен Python 2, то вызов `python` будет использовать Python 2 вместо Python 3. 1. Активируйте виртуальное окружение: * На Windows: * Если вы используете Command Prompt или Command Prompt через Windows Terminal, выполните: ```cmd .venv\Scripts\activate.bat ``` * Если вы используете PowerShell, выполните: ```powershell .\.venv\Scripts\Activate.ps1 ``` * На macOS или Linux выполните: ```cmd source ./.venv/bin/activate ``` > 💁 Эти команды нужно выполнять из той же директории, где вы создавали виртуальное окружение. Вам никогда не нужно заходить в папку `.venv`, вы всегда должны запускать команду активации и любые команды для установки пакетов или выполнения кода из папки, в которой вы находились при создании виртуального окружения. 1. После активации виртуального окружения команда `python` по умолчанию будет запускать версию Python, которая использовалась для создания виртуального окружения. Выполните следующую команду, чтобы узнать версию: ```sh python --version ``` Вывод будет похож на следующий: ```output (.venv) ➜ nightlight-server python --version Python 3.9.1 ``` > 💁 Ваша версия Python может отличаться — главное, чтобы это была версия 3.6 или выше. Если нет, удалите эту папку, установите более новую версию Python и попробуйте снова. 1. Выполните следующие команды, чтобы установить pip-пакет [Paho-MQTT](https://pypi.org/project/paho-mqtt/), популярную библиотеку для работы с MQTT: ```sh pip install paho-mqtt ``` Этот pip-пакет будет установлен только в виртуальном окружении и не будет доступен за его пределами. #### Написание серверного кода Теперь можно написать серверный код на Python. ##### Задача — написать серверный код Напишите серверный код. 1. В терминале или командной строке выполните следующую команду внутри виртуального окружения, чтобы создать файл Python с именем `app.py`: * На Windows выполните: ```cmd type nul > app.py ``` * На macOS или Linux выполните: ```cmd touch app.py ``` 1. Откройте текущую папку в VS Code: ```sh code . ``` 1. Когда VS Code запустится, он активирует виртуальное окружение Python. Это будет отображено в нижней строке состояния: ![VS Code показывает выбранное виртуальное окружение](../../../../../translated_images/vscode-virtual-env.8ba42e04c3d533cf677e16cbe5ed9a3b80f62c6964472dc84b6f940800f0909f.ru.png) 1. Если терминал VS Code уже запущен при старте VS Code, виртуальное окружение в нем не будет активировано. Самое простое решение — завершить работу терминала, нажав кнопку **Kill the active terminal instance**: ![Кнопка завершения работы терминала в VS Code](../../../../../translated_images/vscode-kill-terminal.1cc4de7c6f25ee08f423f0ead714e61d069fac1eb2089e97b8a7bbcb3d45fe5e.ru.png) 1. Запустите новый терминал VS Code, выбрав *Terminal -> New Terminal* или нажав `` CTRL+` ``. Новый терминал загрузит виртуальное окружение, и вызов команды активации будет отображен в терминале. Имя виртуального окружения (`.venv`) также будет отображено в приглашении: ```output ➜ nightlight-server source .venv/bin/activate (.venv) ➜ nightlight ``` 1. Откройте файл `app.py` в проводнике VS Code и добавьте следующий код: ```python import json import time import paho.mqtt.client as mqtt id = '' client_telemetry_topic = id + '/telemetry' client_name = id + 'nightlight_server' mqtt_client = mqtt.Client(client_name) mqtt_client.connect('test.mosquitto.org') mqtt_client.loop_start() def handle_telemetry(client, userdata, message): payload = json.loads(message.payload.decode()) print("Message received:", payload) mqtt_client.subscribe(client_telemetry_topic) mqtt_client.on_message = handle_telemetry while True: time.sleep(2) ``` Замените `` на строке 6 уникальным идентификатором, который вы использовали при создании кода устройства. ⚠️ Этот идентификатор **обязательно** должен совпадать с тем, который вы использовали на устройстве, иначе серверный код не сможет подписаться или публиковать сообщения в нужную тему. Этот код создает MQTT-клиент с уникальным именем и подключается к брокеру *test.mosquitto.org*. Затем он запускает цикл обработки, который работает в фоновом потоке, слушая сообщения по подписанным темам. Клиент подписывается на сообщения по теме телеметрии и определяет функцию, которая вызывается при получении сообщения. Когда получено сообщение телеметрии, вызывается функция `handle_telemetry`, которая выводит полученное сообщение в консоль. Наконец, бесконечный цикл поддерживает работу приложения. MQTT-клиент слушает сообщения в фоновом потоке и работает все время, пока основное приложение запущено. 1. В терминале VS Code выполните следующую команду, чтобы запустить ваше Python-приложение: ```sh python app.py ``` Приложение начнет слушать сообщения от IoT-устройства. 1. Убедитесь, что ваше устройство работает и отправляет телеметрические сообщения. Изменяйте уровни освещения, которые фиксирует ваше физическое или виртуальное устройство. Полученные сообщения будут выводиться в терминал. ```output (.venv) ➜ nightlight-server python app.py Message received: {'light': 0} Message received: {'light': 400} ``` Файл `app.py` в виртуальном окружении nightlight должен быть запущен, чтобы файл `app.py` в виртуальном окружении nightlight-server мог получать отправляемые сообщения. > 💁 Вы можете найти этот код в папке [code-server/server](../../../../../1-getting-started/lessons/4-connect-internet/code-server/server). ### Как часто следует отправлять телеметрию? Один из важных вопросов при работе с телеметрией — как часто измерять и отправлять данные? Ответ — это зависит от ситуации. Если вы измеряете часто, вы можете быстрее реагировать на изменения, но при этом используете больше энергии, больше пропускной способности, генерируете больше данных и требуете больше облачных ресурсов для их обработки. Нужно измерять достаточно часто, но не слишком часто. Для термостата измерение каждые несколько минут, вероятно, более чем достаточно, так как температура не меняется так быстро. Если измерять только раз в день, вы можете случайно нагревать дом для ночной температуры в середине солнечного дня. Если измерять каждую секунду, вы получите тысячи ненужных дублирующих измерений температуры, которые будут расходовать интернет-канал и пропускную способность пользователя (что может быть проблемой для людей с ограниченными тарифными планами), использовать больше энергии, что может быть проблемой для устройств с батарейным питанием, и увеличивать стоимость облачных вычислительных ресурсов для их обработки и хранения. Если вы отслеживаете данные о работе оборудования на заводе, где сбой может привести к катастрофическим повреждениям и миллионным убыткам, то измерение несколько раз в секунду может быть необходимым. Лучше потратить лишнюю пропускную способность, чем пропустить телеметрию, указывающую на необходимость остановить и починить оборудование до его поломки. > 💁 В такой ситуации вы можете рассмотреть возможность использования edge-устройства для предварительной обработки телеметрии, чтобы снизить зависимость от Интернета. ### Потеря соединения Интернет-соединения могут быть ненадежными, и перебои случаются часто. Что должно делать IoT-устройство в таких обстоятельствах — терять данные или сохранять их до восстановления соединения? Ответ снова зависит от ситуации. Для термостата данные, вероятно, можно терять, как только получено новое измерение температуры. Системе отопления не важно, что 20 минут назад температура была 20.5°C, если сейчас она 19°C — именно текущая температура определяет, включать ли отопление. Для оборудования вы, возможно, захотите сохранить данные, особенно если они используются для анализа трендов. Существуют модели машинного обучения, которые могут обнаруживать аномалии в потоках данных, анализируя данные за определенный период времени (например, за последний час) и выявляя аномальные значения. Это часто используется для предиктивного обслуживания, чтобы выявить признаки возможной поломки и починить или заменить оборудование до того, как это произойдет. Вы можете захотеть отправить всю телеметрию оборудования для обработки аномалий, поэтому, как только IoT-устройство восстановит соединение, оно отправит всю телеметрию, сгенерированную во время перебоя. Дизайнеры IoT-устройств также должны учитывать, может ли устройство работать во время перебоя в Интернете или потери сигнала из-за местоположения. Умный термостат должен быть способен принимать ограниченные решения для управления отоплением, если он не может отправить телеметрию в облако из-за перебоя. [![Этот Ferrari перестал работать, потому что кто-то попытался обновить его под землей, где нет сигнала](../../../../../translated_images/bricked-car.dc38f8efadc6c59d76211f981a521efb300939283dee468f79503aae3ec67615.ru.png)](https://twitter.com/internetofshit/status/1315736960082808832) Для MQTT, чтобы справляться с потерей соединения, код устройства и сервера должен быть ответственным за обеспечение доставки сообщений, если это необходимо, например, требуя, чтобы на все отправленные сообщения отвечали дополнительные сообщения в теме ответа, и если этого не происходит, они вручную ставятся в очередь для повторной отправки позже. ## Команды Команды — это сообщения, отправляемые из облака на устройство, чтобы дать ему указание что-то сделать. Чаще всего это связано с выдачей какого-либо результата через исполнительное устройство, но это может быть и инструкция для самого устройства, например, перезагрузиться или собрать дополнительную телеметрию и вернуть ее в ответ на команду. ![Интернет-подключенный термостат получает команду включить отопление](../../../../../translated_images/commands.d6c06bbbb3a02cce95f2831a1c331daf6dedd4e470c4aa2b0ae54f332016e504.ru.png) Термостат может получить команду из облака включить отопление. На основе данных телеметрии от всех датчиков облачный сервис принимает решение, что отопление должно быть включено, и отправляет соответствующую команду. ### Отправка команд на MQTT-брокер Следующий шаг для нашего ночника с управлением через Интернет — это серверный код, отправляющий команду обратно на IoT-устройство для управления светом в зависимости от уровня освещенности. 1. Откройте серверный код в VS Code. 1. Добавьте следующую строку после объявления `client_telemetry_topic`, чтобы определить, в какую тему отправлять команды: ```python server_command_topic = id + '/commands' ``` 1. Добавьте следующий код в конец функции `handle_telemetry`: ```python command = { 'led_on' : payload['light'] < 300 } print("Sending message:", command) client.publish(server_command_topic, json.dumps(command)) ``` Этот код отправляет JSON-сообщение в тему команд с параметром `led_on`, установленным в true или false в зависимости от того, меньше ли освещенность 300. Если освещенность меньше 300, отправляется true, чтобы указать устройству включить светодиод. 1. Запустите код, как и раньше. 1. Изменяйте уровни освещенности, которые фиксирует ваше физическое или виртуальное устройство. Полученные сообщения и отправленные команды будут отображаться в терминале: ```output (.venv) ➜ nightlight-server python app.py Message received: {'light': 0} Sending message: {'led_on': True} Message received: {'light': 400} Sending message: {'led_on': False} ``` > 💁 Телеметрия и команды отправляются в одну тему каждая. Это означает, что телеметрия от нескольких устройств будет появляться в одной теме телеметрии, а команды для нескольких устройств — в одной теме команд. Если вы хотите отправить команду конкретному устройству, вы можете использовать несколько тем, названных с уникальным идентификатором устройства, например, `/commands/device1`, `/commands/device2`. Таким образом, устройство может слушать сообщения, предназначенные только для него. > 💁 Вы можете найти этот код в папке [code-commands/server](../../../../../1-getting-started/lessons/4-connect-internet/code-commands/server). ### Обработка команд на IoT-устройстве Теперь, когда команды отправляются с сервера, вы можете добавить код на IoT-устройство для их обработки и управления светодиодом. Следуйте соответствующему шагу ниже, чтобы слушать команды от MQTT-брокера: * [Arduino - Wio Terminal](wio-terminal-commands.md) * [Одноплатный компьютер - Raspberry Pi/Виртуальное IoT-устройство](single-board-computer-commands.md) После написания и запуска этого кода экспериментируйте с изменением уровней освещенности. Наблюдайте за выводом сервера и устройства, а также за светодиодом при изменении уровней освещенности. ### Потеря соединения Что должен делать облачный сервис, если ему нужно отправить команду IoT-устройству, которое находится в оффлайне? Ответ снова зависит от ситуации. Если последняя команда отменяет предыдущую, то предыдущие команды, вероятно, можно игнорировать. Если облачный сервис отправляет команду включить отопление, а затем команду выключить его, то команду включения можно игнорировать и не отправлять повторно. Если команды должны обрабатываться последовательно, например, поднять роботизированную руку, а затем закрыть захват, то их нужно отправлять в порядке после восстановления соединения. ✅ Как устройство или серверный код могут гарантировать, что команды всегда отправляются и обрабатываются в порядке, если это необходимо, через MQTT? --- ## 🚀 Задание Вызов в последних трех уроках заключался в том, чтобы перечислить как можно больше IoT-устройств, которые есть у вас дома, в школе или на работе, и определить, построены ли они на микроконтроллерах или одноплатных компьютерах, или даже на их сочетании, а также подумать, какие датчики и исполнительные устройства они используют. Для этих устройств подумайте, какие сообщения они могут отправлять или получать. Какую телеметрию они отправляют? Какие сообщения или команды они могут получать? Считаете ли вы, что они безопасны? ## Викторина после лекции [Викторина после лекции](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8) ## Обзор и самостоятельное изучение Прочитайте больше о MQTT на [странице Wikipedia о MQTT](https://wikipedia.org/wiki/MQTT). Попробуйте запустить MQTT-брокер самостоятельно, используя [Mosquitto](https://www.mosquitto.org), и подключитесь к нему с вашего IoT-устройства и серверного кода. > 💁 Совет - по умолчанию Mosquitto не позволяет анонимные подключения (то есть подключения без имени пользователя и пароля) и не позволяет подключения извне компьютера, на котором он запущен. > Вы можете исправить это с помощью [конфигурационного файла `mosquitto.conf`](https://www.mosquitto.org/man/mosquitto-conf-5.html) с следующим содержимым: > > ```sh > listener 1883 0.0.0.0 > allow_anonymous true > ``` ## Задание [Сравните и сопоставьте MQTT с другими протоколами связи](assignment.md) --- **Отказ от ответственности**: Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.