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 работает на прикладном уровне поверх 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 - библиотеки автоматически подтянутся при установке.
После установки все само появляется в автозагрузке
Но если что, то включаем в автозагрузке и стартуем
/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
тем самым говорим где искать конфигурационные файлы
В файл 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
Что делают эти строки?
Первая строка запрещает подключение без пароля т. е. анонимным пользователям
Вторая строка объясняет где расположен файл пароля
Третья строка объясняет где расположен файл с доступам к топикам (см. ниже)
Получаем вот так (это можно скопировать и добавить в файл) ссылка на текстовый файл
# За знаком решетки комментарии
Настройка доступа пользователей к топикам
Идем в файл mosquitto.acl
nano /etc/mosquitto/config/mosquitto.acl
который мы создали ранее и редактируем его, настраиваем нужный доступ по нужным пользователям, для тестирование даём доступ пользователю test или 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 и публиковать их.
Вот такое непримечательное окно, но нам с ним особо не работать, а только проверить.
Жмем на плюсик и настраиваем доступ к нашему серверу.
Вводим эти параметры больше ничего не меняем.
И вот уже горит зелёненьким значит уже подключились и это уже хорошо значит все работает
Подпишемся на топик "Proverka"
И ничего, а это потому что никто топики не отправляет, но мы же проверяем работу сервера, по крайне мере пока. Поэтому сами и отправим в тот же топик на который подписались к примеру известную фразу Hello, world! Вот так, жмем публиковать:
И вот нам пришло сообщение
Сколько будите жать "PUBLISH" - публиковать, столько оно и будет приходить, а значит все работает. Вот и все, мы настроили MQTT сервер, можем двигаться дальше, к светлому будущему, в четвертую промышленную революцию, дальше нам ждет Domoticz, а на сегодня пока все мои красноглазые друзья! И как всегда, а вот и продолжение.
Продолжение: "Умный дом на роутере. Domoticz."
Предыдущие части:
- Часть I. TP-Link TL-MR3020 супер роутер - комбайн для нищебродов.
- Подключаем роутер TP-Link TL-MR3020 V3 по UART-USB (через COM-порт) и прошиваемся.
- Умный дом на роутере. Domoticz.
Статьи по теме
Страничка путеводитель по каналу TehnoZet-2
И конечно пользуйтесь рубрикатором, там все по разделам: "Страничка путеводитель по каналу TehnoZet-2"
Подписывайтесь на наш канал TehnoZet-2 , будет интересно! Мы активно развиваемся! Понравилась статья, хотите продолжения - пишите комментарии, ставьте лайк, жмите палец вверх!
Тэги
#роутер
#tl-mr3020
#openwrt
#Mqtt
#умныйдом
#протокол
#машина-машина
#данные