- Установка и запуск MQTT брокера, Mosquitto
- Для чего нужен MQTT?
- Как работает MQTT?
- Как установить сервер MQTT?
- Что такое MQTT
- История возникновения MQTT
- Программа MQTT Explorer
- MQTT брокер
- Клиенты
- Топики и отправка сообщений
- Символ решетка
- Retain Флаг
- Last will
- esp8266 — Сообщество разработчиков
- Свой собственный облачный MQTT брокер с поддержкой WebSockets, сертификатами LetsEncrypt, мониторингом и визуализацией в Grafana и сохранением данных в Influx. Бесплатно и навсегда
- Получаем VPS сервер бесплатно и навсегда
- Получаем домен второго уровня бесплатно
Установка и запуск MQTT брокера, Mosquitto
• 21-11-2018 •
Для чего нужен MQTT?
Если на примере, то предположим, что у вас есть устройство, которое считывает температуру в комнате. И вы хотите передавать данные с этого контроллера к себе на сервер, чтобы потом можно было удаленно проверять температуру. Для этого как раз идеально подойдет протокол MQTT.
Как работает MQTT?
У Mqtt есть понятие сервер или брокер, это главный объект, который получает и передает данные дальше. А все остальные, к примеру устройство которое считывает температуру и сервер, на который вы хотите эту температуру сохранять, это клиенты.
Клиент с температурой будет отправлять данные, брокер MQTT будет их ловить и передавать клиенту серверу, который будет их получать.
Все это в рамках локальной сети!
Как установить сервер MQTT?
Для того чтобы установить брокер MQTT , переходим по ссылке и скачиваем инсталлятор для вышей операционной системы и устанавливаем .
Как запустить брокер MQTT?
Для того, чтобы запустить брокер, запустите консоль (На Windows это Win+R, пишем cmd и нажимаем Enter).
После того, как открылась консоль, переходим в консоле в директорию, где вы установили Mosquitto. Если вы не знаете как пользоваться командной строкой, то вот небольшие подсказки:
- Перейти (к примеру) в папку Games — cd Games
- Вернуться обратно cd ..
- Поменять раздел диска D: или C:
- Посмотреть содержимое папки dir
Этого должно хватить, чтобы добраться до нужного раздела. После того как вы зашли в раздел mosquitto, напишите:
Если вы все правильно сделали, то увидите следующее:
Теперь у вас запущен брокер MQTT. Успехов!
Что такое MQTT
После того как я стал стал строить умный дом я очень быстро столкнулся с вещью под названием MQTT. Оказывается, некоторые устройства могут «разговаривать с MQTT», а система умного дома может «забирать из MQTT» данные. Происходит «отправка сообщений в топики». Изначально мне было совершенно непонятно что как это все работает и зачем это. Как оказалось, это все не очень сложно.
Я написал этот текст специально для людей кто никогда раньше не сталкивались с MQTT.
История возникновения MQTT
MQTT — это такой специальный протокол по которому умеют общаться программы и устройства. Есть русский язык и люди которые умеют разговаривать на этом языке могут понять друг друга. Точно так же есть «язык» MQTT — программы и устройства которые умеют разговаривать на этом языке могут общаться друг с другом.
MQTT был создан в 1999 году. Была задача — в пустыне установлено много нефтедобывающих вышек. Со всех этих вышек нужно получать кучу разных технических параметров (давление, температура, скорость потока, . ) и передавать все эти данные в единый центр.
Для передачи данных использовалась спутниковые телефоны, которые и сейчас очень дорогие, а 20 лет назад были очень-очень дорогие. Поэтому технология передачи должна была быть как можно более экономной — передавать как можно меньше данных.
Протокол MQTT смог успешно решить эта задачу и стал применяться и в других отраслях. Постепенно компьютеры и микропроцессоры становились все дешевле и это привело к тому что стала появляться куча разных устройств в которые добавили «ума» (для этого придумали красивый термин IoT — Internet of Things — Интернет Вещей). Умный чайник, умный обогреватель — эти устройства могут отправлять данные про себя (какая сейчас температура, сколько устройство работает), а так же удаленно получать команды на управление.
Есть множество устройств разных производителей — как им общаться друг с другом и с серверами умного дома? Можно взять и придумать новый язык (протокол) и многие производители так и делают. Но есть протокол MQTT которые отлично подходит для общения разных устройств и программ. Некоторые производители используют MQTT в своих устройствах. MQTT популярен в мире бесплатных и открытых программ (Open Source).
Программа MQTT Explorer
Если вы работаете с MQTT, то вам нужно обязательно скачать и поставить программу MQTT Explorer.
Программа бесплатная. Программа работает на Windows, на macOS и на Linux.
С помощью этой программы можно подключиться к MQTT серверу и увидеть все то что там происходит.
MQTT брокер
MQTT — это протокол который работает по модели клиент-сервер.
Центральная часть — это MQTT сервер. Обычно сервер MQTT называют MQTT брокер.
Есть очень популярная программа Mosquitto — если запустить эту программу, то у вас появится работающий MQTT сервер.
Далеко не всегда нужно самому запускать MQTT сервер. Многие системы сами поднимают MQTT сервер с которыми работают.
Клиенты
К серверу MQTT подключаются клиенты. Клиенты могут отправлять сообщения и читать сообщения. Некоторые клиенты только отправляют, некоторые только читают, но достаточно часто клиент делает и то и другое: и отправляет сообщения и слушает другие сообщения.
Чтобы клиент мог подключиться к MQTT серверу нужно указать:
- адрес сервера (это часто ip адрес, что-то вроде 192.168.31.103)
- порт на котором работает MQTT сервер (обычно это 1883)
- имя пользователя
- пароль
Топики и отправка сообщений
Итак, есть MQTT брокер — центр системы. Есть клиенты которые подключаются к этому центру.
Давайте разберем задачу. Есть датчик температуры и есть система умного дома. Как с помощью MQTT датчик может передать температуру в систему умного дома?
Датчик температуры подключается к серверу MQTT. Раз в 5 минут датчик производит замер температуры и отправляет результат замера в сервер MQTT. Например, температура 23.8 °C
Для того чтобы отправить температуру в MQTT датчик должен знать две вещи. Во-первых, саму температуру, она есть — 23.8. А во-вторых датчик должен указать адрес топика в который будет отправлено это значение. Что же такое топик? Чуть-чуть отойдем в сторону. Представим что нужно сохранить число 23.8 на компьютер. Можно сохранить в файл. Для этого нужно знать полный путь к файлу. Например, c:\temperature\sensor.txt — в этом файл мы можем записать число 23.8
Топик очень похож на файл — это расположение какого-то кусочка информации в MQTT сервере. Датчик температуру может отправить сообщение 23.8 в топик temperature/sensor — теперь MQTT сервер знает про это число.
Половину задачи решели — датчик температуру отправил значение температуру в MQTT сервер.
Как же система умного дома узнает о том что датчик прислал новую температуру? При подключении к серверу MQTT система умного дома говорит — я хочу получить все данные которые приходят в топик temperature/sensor MQTT сервер запоминает это желание клиента и как только в топик temperature/sensor приходит какое-то значение сервер пересылает это сообщение всем клиентам кто выразил желание получать сообщение из этого топика (это называется кто «подписался» на эти топики»)
Символ решетка
Клиент при подключении к MQTT серверу может указать список топиков которые он хочет «слушать» (т.е. получать все сообщения которые поступают в эти топики)
При подписке можно указать символ решетка. Например, если клиент говорит что он хочет подписать на temperature/# то этот клиент получит все сообщения которые будут отправлены вот в такие топики:
- temperature/sensor
- temperature/sensor2
- temperature/some/other/sensor
Так же клиент может подписать на топик # — это ознчает что он будет получать вообще все сообщения которые прилетают в MQTT сервер.
Retain Флаг
MQTT сервер — это всего лишь посредник между разными клиентами. Клиент отправил сообщение в MQTT сервер, сервер переслал это сообщение всем клиентам, которым интересно это сообщение и сервер тут же забыл про это сообщение. Новые клиенты которые подключаются к MQTT серверу уже не получат это сообщение.
Пример. Есть датчик температуры и есть система умного дома. Штатный режим работы. Система умного дома подключилась к MQTT серверу и слушает все сообщения. Датчик температуры подключился к MQTT серверу и каждые 5 минут отправляет данные про температуру. Все работает прекрасно — датчик отправл температуру, MQTT сервер переслал эту температуру в систему умного дома и умный дом отобразил эту температуру в интерфейсе.
Но тут происходит ситуация что нужно перезагрузить систему умного дома. Умный дом перезапустился, и заново подключился к MQTT серверу, но никакой информации о температуре в MQTT сервере нет (те сообщения которые были раньше уже переданы всем клиентам и никуда на MQTT сервере не сохранились). Пока датчик не отправит новое значение система умного дома не получит температуру из MQTT сервера.
Решение такой ситуации — это флаг retain. При отправке сообщения клиент может сказать что это сообщение нужно отправить с флагом retain, т.е. сервер должен сохранить сообщение. В этом случае сервер получит сообщение, переправит его всем клиентам, но не забывает про это сообщение, а оставляет его у себя и будет отправлять это же сообщением всем новым клиентам которые подключились к MQTT серверу.
Last will
Одна из интересных фишек протокола MQTT — это штука под названием Last will — завещание. Еще используют аббревиатуру «LWT» — Last Will and Testament.
Стандартная работа — клиент подключается к MQTT серверу и все время остается подключенным к серверу (сервер «видит» момент подключения и может понять когда клиент отключился).
Задача. Есть клиент — компьютер — он должен быть всегда подключен к MQTT серверу. Если этот компьютер не подключен к MQTT серверу — это авария, что-то случилось либо с этим компьютером, либо с каналом связи. Как об этой аварии могут узнать другие клиенты?
Решение следующее: клиент при подключении говорит серверу: «слушай, когда я отключусь, ты, пожалуйста, вот в этот топик положи вот такое сообщение». Сервер принимает такое «завещание» от клиента и когда этот клиент отключается, MQTT сервер выполняет «последнюю волю» клиента.
Например, клиент может попросить сервер отправить сообщение «offline» в топик «computers/my-desktop/status». И когда этот клиент отвалится MQTT сервер отправит сообщение «offline» в нужный топик. Клиент подключился, сказал MQTT серверу что при отключении нужно отправить в топик значение «offline» и тут же отправляет в этот же топик значение «online». Тогда все другие клиенты которым интересен статус этого клиента могут следить за этим топиком — если там «online» значит с компьютером все нормально, если «offline», то есть проблема.
esp8266 — Сообщество разработчиков
Свой собственный облачный MQTT брокер с поддержкой WebSockets, сертификатами LetsEncrypt, мониторингом и визуализацией в Grafana и сохранением данных в Influx. Бесплатно и навсегда
Уровень сложности для продвинутого пользователя ПК: средний. Потребуются навыки работы с командной строкой linux через SSH, возможно понадобится изучение технической документации на английском языке. Хочу предупредить, что эта статья не туториал для начинающих, в котором достаточно скопировать все команды из статьи в консоль и все заработает. То, что мы будем делать, потянет на тестовое задание для начинающего DevOps инженера. Может быть я упустил что-то очевидное для меня и Вам придется немного поработать напильником. Ориентировочное время: от 1 часа до бесконечности, в зависимости от Ваших навыков и желания учиться.
TLDR; Получаем бесплатный VPS сервер, бесплатный домен 2 уровня и запускаем docker контейнеры: portainer, nginx, certbot, RabbitMQ, Grafana, Prometheus, Telegraf, InfluxDB с помощью docker-compose файла, который я заботливо приготовил для Вас.
Для домашней автоматизации часто необходим MQTT брокер, который должен быть доступен из интернета. Поднимать брокер на RaspberryPi и пробрасывать порты во внешний мир через домашний роутер — можно, но это далеко не идеальное решение (еще и валидные сертификаты при этой схеме непросто получить), а вот построить bridge (мост) между домашним брокером и облачным, чтобы иметь доступ и из дома и из любой точки мира и не оказаться в «умершем умном доме» при отсутствии интернета — неплохое решение.
Раньше в качестве облачного бесплатного брокера использовали CloudMQTT.com, но недавно эта компания прекратила регистрацию новых бесплатных инстансов и оставила возможность только платной регистрации.
Чаще всего, в качестве MQTT брокера разворачивают mosquitto — это отличный быстрый брокер, не требующий излишних вычислительных ресурсов. Но есть у него и недостатки — список пользователей и их права доступа необходимо прописывать в текстовых файлах. Я предлагаю Вам пострелять из пушки по воробьям и использовать в качестве MQTT сервера брокер сообщений RabbitMQ, который имеет плагин MQTT в базовой поставке и простой WEB интерфейс для настройки и управления пользователями.
Также мы будем использовать Prometheus плагин для RabbitMQ, для мониторинга состоянии брокера и ресурсов, которые он использует.
RabbitMQ написан на языке erlang, позволяет объединять брокеры в кластер, успешно используется во многих коммерческих проектах.
RabbitMQ имеет и другие замечательные возможности (очереди, например), но описание этих возможностей выходит за рамки данной статьи и я предлагаю Вам самостоятельно их изучить, если будет интересно.
Для полноценного использования MQTT мы настроим автоматическое получение бесплатных SSL(TLS) сертификатов LetsEncrypt, подключение WebSockets (MQTT over WebSockets), настроим WEB сервер nginx, так что сделать еще и собственный сайт — дело пяти дополнительных минут.
Современные DevOps инженеры не представляют свою работу без контейнеров, поэтому и мы будем использовать best practices — развернем весь необходимый софт в контейнерах. Я не фанатичный линуксоид, который признает исключительно командную строку в терминале, поэтому для обычных людей установим Portainer — удобный WEB интерфейс для управления docker контейнерами.
Раз уж мы используем Prometheus для мониторинга брокера, то установим и node-exporter для мониторинга нашего VPS сервера.
Также мы, легким движением руки, реализуем задачу сохранения MQTT сообщений в базе данных InfluxDB, используя для этого Telegraf.
Вишенкой на торте будет визуализация данных в одном из самых популярных современных продуктов — Grafana. Там мы увидим статистику и нашего VPS сервера и статистику RabbitMQ и сами данные, полученные по MQTT. По факту, мы сделаем собственный универсальный dashboard (точнее, можем сделать множество наборов панелей, в зависимости от задач), переплюнув популярные облачные сервисы.
Grafana: мониторинг VPS
Grafana: мониторинг RabbitMQ
Grafana: визуализация MQTT данных
Получаем VPS сервер бесплатно и навсегда
Здесь я не буду останавливаться подробно — Вы сможете без труда найти статьи как это сделать. Мне понравились VPS, которые предоставляет Oracle — они дают две виртуальных машины и у них 1Gb RAM в каждой, а для нашего проекта 512 может не хватить.
Активация аккаунта Oracle для получения бесплатной виртуальной машины требует международную карту Visa/MasterCard типа WORLD с балансом не менее 100 рублей (списанные средства будут возвращены, это необходимо для верификации карты и владельца). Проверить тип Вашей карты можно заранее на любом сервисе по BIN коду (первые 6 цифр карты), в строке Категория карты должно быть WORLD.
Могу сказать, что эта акция на бесплатные VPS действующая, я зарегистрировал такой аккаунт неделю назад (август 2020).
На этапе выбора образа для виртуалки выберите Ubuntu 20.04 или любой другой дистрибутив linux, если обоснованно считаете это необходимым.
На окончании этого шага Вы должны получить доступ по SSH к новой виртуалке и знать ее внешний (публичный) IP адрес (не пугайтесь, с настройками по умолчанию этот адрес не пингуется из интернета). Для новичков могу сообщить, что приватные (частные) IP адреса начинаются на 10. и выглядят, например, так 10.0.0.15 (есть и другие частные подсети, погуглите) Нам нужен не этот адрес, а другой, общедоступный IP-адрес.
Получаем домен второго уровня бесплатно
Если у Вас уже есть собственный домен и DNS, тогда вы должны создать DNS запись типа А и вписать туда общедоступный IP-адрес VPS. После этого можете переходить к следующему пункту.
Если у Вас еще нет собственного домена, то идем на Freenom.com (кредитная карта не понадобится) подбираем свободный домен и регистрируем его. Большинство доменов, даже 4-х буквенные бесплатны, кроме премиальных (по мнению авторов сервиса). Регистрация аккаунта происходит в момент регистрации домена, также пусть вас не смущает кнопка Оформить заказ — да, для регистрации бесплатного домена нужно оформить заказ. Еще не забудьте указать, что регистрируете домен на 12 месяцев (по умолчанию регистрируют только на 3).
Регистрация бесплатного домена
В момент регистрации домена (на большом мониторе, а не на маленьком как у меня на скриншоте) вы можете сразу указать общедоступный IP адрес вашей виртуалки для нового доменного имени. Указать его нужно два раза (обычно для каждого WEB сервера создается две DNS записи: первая только с именем домена и вторая www.+имя домена). Если у Вас нет поля для ввода IP адреса при регистрации, то ничего страшного, Вы сможете это сделать после регистрации.
После регистрации домена и аккаунта на freenom нужно залогиниться и перейти в меню Services — My Domains — напротив Вашего домена нажать Manage Domain, выбрать вкладку Manage Freenom DNS, ввести два раза общедоступный IP-адрес в поле Target и сохранить изменения.
Дальше можете подождать и попить кофе пока обновится кэш DNS.
Успешным результатом этого шага станет возможность подключаться по SSH к Вашей VPS не только по общедоступному IP-адресу, но и по доменному имени.