Найти тему
TehnoZet-2

MQTT что это такое, установка на роутер, настройка.

Оглавление

MQTT установка сервера и клиента на примере роутера TP-Link TL-MR3020 V3.2, проверка с помощью MQTTLens

Напомню в статье используются:

  • Роутер TP-Link TL-MR3020 V3.2 (продается в магазинах на сегодняшний момент) + SSD диск Apacer 128GB +адаптер USB 2.0- SATA
  • Прошивка последняя доступная на сегодняшний момент OpenWrt 19.07.6 (r11278-8055e38794)

Это VI часть которая является продолжением серии статей, начало, см. внизу статьи

Теоретическая часть

Общие данные

MQTT (Message Queue Telemetry Transport) - сетевой протокол, работающий как правило поверх TCP/IP, ориентированный для обмена сообщениями между устройствами по принципу издатель-подписчик.

Этот протокол не такой и старый появился он в 1999 году, в 2014 году стандартизирован, а в апреле 2019 года вышла MQTT v5.0


Основные особенности протокола MQTT:

  • Асинхронный протокол
  • Компактные сообщения
  • Работа в условиях нестабильной связи на линии передачи данных (так в официальном руководстве, но у меня к этому пункту больше вопросы)
  • Поддержка нескольких уровней качества обслуживания (QoS)
  • Легкая интеграция новых устройств

Устройства протокола MQTT

  • Клиент (client), который делится на:

- издателя (publisher)

- подписчика (subscriber)

  • Брокером (broker) или сервер

Кроме всего прочего используется понятие топик это сообщение

Вот схема как все это выглядит.

 MQTT
MQTT

Протокол MQTT работает на прикладном уровне поверх TCP/IP и использует порты:

  • 1883 по умолчанию
  • 8883 при подключении через SSL

Кроме этого существуют ещё некоторые термины, о которых необходимо знать:

QoS (Quality of Service – качество обслуживания)- этот показатель обозначает вероятность прохождения пакета между двумя точками сети.  

QoS бывает:

  • QoS 0 - не более одного раза, сервер отправляет и забывает. Сообщения могут быть потеряны или продублированы, этот уровень самый быстрый, но ненадёжный;
  • QoS 1 - по крайней мере один раз, получатель подтверждает доставку. Сообщения могут дублироваться, но доставка гарантирована. Этот уровень используется по умолчанию.
  • QoS 2 - ровно один раз, сервер обеспечивает доставку. Сообщения поступают точно один раз без потери или дублирования. Это самый надёжный уровень, но самый медленный.

Устройства MQTT используют определенные типы сообщений для взаимодействия с брокером, ниже представлены основные (в реальности их больше):

  • Connect – установить соединение с брокером
  • Disconnect – разорвать соединение с брокером
  • Publish – опубликовать данные в топик
  • Subscribe – подписаться на топик
  • Unsubscribe – отписаться от топика

Практическая реализация

Брокер (сервер) Mosquitto

Пожалуй это самый известный сервер (брокер)

Официальный сайт: http://mosquitto.org

Доступны два типа пакетов:

  • nossl (mosquitto-nossl) без шифрования
  • ssl (mosquitto-ssl) с шифрованием

Для создания пользователей и генерации паролей необходимо установить пакет mosquitto-client

Установим пакеты с шифрованием, конечно будем использовать командную\ю строку, терминал в данном случае PuTTY (официальный сайт):

opkg update
opkg install mosquitto-ssl mosquitto-client-ssl
  • SSL - ( Secure Sockets Layer, уровень защищённых сокетов) - протокол шифрования.
  • mosquitto - известный сервер Mosquitto программное обеспечение с открытым исходным кодом, который реализует протокол MQTT версии 3.1 и 3.1.1.
  • mosquitto-client-програмное обеспечение для публикации сообщений на серверах MQTT
  • lib mosquitto - библиотеки автоматически подтянутся при установке.
Установка mosquitto
Установка mosquitto

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

Появляется в автозагрузке
Появляется в автозагрузке

Но если что, то включаем в автозагрузке и стартуем

/etc/init.d/mosquitto enable
/etc/init.d/mosquitto start

Можно перезагрузить роутер

reboot
Автозагрузка, старт, перезагрузка
Автозагрузка, старт, перезагрузка

И все, мы все установили, но работать ничего не будет, дальше все это нужно настроить.

Настройка

Настройка пароля и пользователя

Настройку можно произвести двумя способами через WIndows или через роутер, через роутер легче и быстрее, но возможно кому то понадобится через Windows или привычнее, но еще раз так дольше

Через ОС Windows 10 (лучше делать через роутер так быстрее, см. ниже)

- Скачиваем с официального сайта Mosquitto (http://mosquitto.org ) под Windows

- Устанавливаем его

- Создаем файл с расширением . bat, например StartPWD.bat (имя может быть любое)

Отступление о запуске программы с параметрами командной строки

Запустить программу с определенными значениями в среде Windows можно двумя способами 
С помощью ярлыка
Создаем ярлык, Свойства. Откроется окно, в котором нас интересует поле Объект. Именно в нем, после кавычек, и следует дописать нужную нам команду. 

С помощью "bat" файла
start "" путь_к_программе
Если путь содержит пробелы, возьмите весь путь в двойные кавычки, например: start "" "C:\Program Files\program.exe"
После пути к программе можно также указать параметры, с которыми она должна запускаться, например (аналогично, если параметры запуска содержат пробелы, возьмите их в кавычки): start "" c:\windows\notepad.exe file.txt
start "" "C:\Program Files\mosquitto\mosquitto_passwd.exe" -c C:\user.list ИМЯ_Пользователя

Например создадим пользователя "test"

start "" "C:\Program Files\mosquitto\mosquitto_passwd.exe" -c C:\user.list  test

Где:

"C:\Program Files\mosquitto\mosquitto_passwd.exe" - путь в кавычках где установлен  mosquitto

-c C:\m user.list  ИМЯ_Пользователя - ключ и путь расположения файла пароля

Файл пароля можно открыть в текстовом редакторе он имеет вид

Имя_пользователя: Зашифрованный пароль

Выглядит вот так

test:$6$5Prq6fKi/BKhXVd+$SK2AYMVcMUKP94nzkZF3YIy6SXQhA5HBjDM/5n0X07YbIVPJP8Mnl4YGlRDkyWxSWs1mnxhP+CEzw9xvtV6F/Q==

- Запускаем наш bat файл от администратора.

- Возникает окно с запросом пароля для пользователя имя которого мы указали выше. Вводим пароль два раза (он не отображается), Формируется файл mosquitto.pwd

- Находим файл который находится в корневом каталоге С: C:\user.list

- Загружаем программу WinSCP и переносим созданный файл на роутер в /etc/mosquitto/ config/

Настройка через OpenWRT и командую строку

Сначала создадим файлы и папки

Мы это делаем для того, что бы все файлы с настройками и паролями хранились в одном месте и их можно было легко перенести и сохранить. Все будем хранится в папке "config". Создаем папку "config"  в  etc/mosquitto вот полный путь: /etc/mosquitto/config таким образом

mkdir /etc/mosquitto/config

Создаем файл "main.conf "  в /etc/mosquitto/config получается  вот так /etc/mosquitto/ config/main.conf

там же создаём файл /etc/mosquitto/ config/mosquitto.acl  все вместе вот так:

touch /etc/mosquitto/config/main.conf
touch /etc/mosquitto/config/mosquitto.acl

Открываем любой терминал (чаще всего это Putty), заходим и вводим

mosquitto_passwd -c /etc/mosquitto/ config/user.list  ИМЯ_ПОЛЬЗОВАТЕЛЯ

Ну например ИМЯ_ПОЛЬЗОВАТЕЛЯ будет test или dom

mosquitto_passwd -c /etc/mosquitto/config/user.list  test

или dom

mosquitto_passwd -c /etc/mosquitto/config/user.list dom
Запрос пароля.
Запрос пароля.

Возникает окно с запросом пароля для пользователя имя которого мы указали выше. Вводим пароль два раза (он не отображается), Формируется файл user.list

Теперь редактируем основной конфигурационный файл "mosquitto.conf"

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

Идем в mosquitto.conf это основной конфигурационный файл и открываем его, например с помощью nano

nano /etc/mosquitto/mosquitto.conf

или с помощью vi

vi /etc/mosquitto/mosquitto.conf 

или с помощью  SFTP и программы WinSCP и вносим единственную правку в секцию  External config files  добавляем (на самом деле пофиг куда добавлять, все равно там все закомментировано, но так по феншую, этот раздел находится в самом низу документа):

include_dir /etc/mosquitto/config

тем самым говорим где искать конфигурационные файлы

include_dir /etc/mosquitto/config
include_dir /etc/mosquitto/config

В файл  main.conf например с помощью nano

nano  /etc/mosquitto/config/main.conf

или vi

vi /etc/mosquitto/config/main.conf

или с помощью  SFTP и программы WinSCP

Добавляем единственные строки

allow_anonymous false
password_file /etc/mosquitto/config/user.list
acl_file /etc /mosquitto/ config/mosquitto.acl

Что делают эти строки?

Первая строка запрещает подключение без пароля т. е. анонимным пользователям

Вторая строка объясняет где расположен файл пароля

Третья строка объясняет где расположен файл с доступам к топикам (см. ниже)

Получаем вот так (это можно скопировать и добавить в файл) ссылка на текстовый файл

# За знаком решетки комментарии

-7

Настройка доступа пользователей к топикам

Идем в файл mosquitto.acl

nano /etc/mosquitto/config/mosquitto.acl

который  мы создали ранее и редактируем его, настраиваем нужный доступ по нужным пользователям, для тестирование даём доступ пользователю test или dom ко всем топикам это знак решетки
Вот так,
ссылка так как используется решетка

Пользователю dom доступны все топики.
Пользователю dom доступны все топики.

Символ решетки

Говорит о том что клиент подписан на все топики, а вот так temp/# только на топике о температуре, и этот клиент получит все сообщения которые будут отправлены вот в такие топики:

  • temp/2
  • tempe/sensor
  • temp/other/sensor
  • temp/comp

Символ плюса (+)

К примеру, нам необходимо получить данные о температуры во всех комнатах:

/home/living-space/+/temperature

В результате получаем данные с топиков:

  • /home/living-space/living-room1/temperature
  • /home/living-space/living-room2/temperature
  • /home/living-space/living-room3/temperature

LWT - Last Will and Testament

Еще есть одна фишка это LWT - Last Will and Testament или Последняя воля и завещание. Нормальная работа это подключение клиента к серверу MQTT и отсылка топиков, но если клиент непланово отключился, например сломался, пропала связь, села батарейка и так далее. Как тогда узнать что это произошло, вот для этого и служит LWT. Как она работает? При подключении клиент говорит серверу: "слушай, когда я отключусь, ты, пожалуйста, вот в этот топик положи вот такое сообщение". Сервер принимает такое "завещание" от клиента и когда этот клиент отключается, MQTT сервер выполняет "последнюю волю" клиента. А когда подключается обратно то появляется другое сообщение о подключении.

Таким образом можно точно знать что устройство ушло в offline или вернулось в online.

В ESP8266 есть такие настройки:

  • Controller LWT Topic - в какой топик писать LWT
  • LWT Connect Message - (Сообщение о подключении)
  • LWT Disconnect Message - (Сообщение о отключении)

Настройка завершена, теперь перезагружаем службу:

/etc/init.d/mosquitto restart

Настройка mosquitto завершена создан пользователь test или dom который имеет доступ ко всем топикам.

Проверка

Для проверки будем использовать MQTTLens клиент под Windows, а именно приложение Google Chrome, которое подключается к брокеру MQTT и может подписываться на топики MQTT и публиковать их.

Вот такое непримечательное окно, но нам с ним особо не работать, а только проверить.

 MQTTLens
MQTTLens

Жмем на плюсик и настраиваем доступ к нашему серверу.

-10

Вводим эти параметры больше ничего не меняем.

И вот уже горит зелёненьким значит уже подключились и это уже хорошо значит все работает

Подключение
Подключение

Подпишемся на топик "Proverka"

Подписались на топик проверка
Подписались на топик проверка

И ничего, а это потому что никто топики не отправляет, но мы же проверяем работу сервера, по крайне мере пока. Поэтому сами и отправим в тот же топик на который подписались к примеру известную фразу Hello, world! Вот так, жмем публиковать:

-13

И вот нам пришло сообщение

-14

Сколько будите жать "PUBLISH" - публиковать, столько оно и будет приходить, а значит все работает. Вот и все, мы настроили MQTT сервер, можем двигаться дальше, к светлому будущему, в четвертую промышленную революцию, дальше нам ждет Domoticz, а на сегодня пока все мои красноглазые друзья! И как всегда, а вот и продолжение.

Продолжение: "Умный дом на роутере. Domoticz."

Предыдущие части:

Статьи по теме

Страничка путеводитель по каналу TehnoZet-2

И конечно пользуйтесь рубрикатором, там все по разделам: "Страничка путеводитель по каналу TehnoZet-2"

Подписывайтесь на наш канал TehnoZet-2 , будет интересно! Мы активно развиваемся! Понравилась статья, хотите продолжения - пишите комментарии, ставьте лайк, жмите палец вверх!

Тэги

#роутер

#tl-mr3020

#openwrt 

#Mqtt

#умныйдом

#протокол

#машина-машина

#данные