Как сделать mqtt брокер на роутере

Обновлено: 03.07.2024

Для одноплатных компьютеров на Linux cуществует несколько MQTT брокеров. Одним из самых популярных является Mosquitto. Сегодня мы с вами разберемся, как поставить серверную и клиентскую, а также как проверить работу протокола MQTT. Данная инструкция отлично подходит для Raspberry Pi с установленной системой Raspbian и Orange Pi с системой Armbian.

1. Обновляем систему

Первым делом перед началом установки нам необходимо обновить систему. Подключаеся к нашему Pi по SSH и вводим:

sudo apt-get update
sudo apt-get upgrade

Подробнее посмотреть как подключаться к Pi по SSH и что потом можно делать вы можете в нашей статье.

2. Устновка брокера и клиента “mosquitto”

К сожалению, обычные библиотеки “apt-get” Raspberry Pi (Orange Pi) не содержат последнюю версию Mosquitto software. Поэтому перед установкой нам нужно будет обновить библиотеки. Если на сервере будет установлена не последняя версия брокера, то могут появляться ошибки в процессе работы.

Добавляем ключ и обновляем репозиторий. Вводим эти строчки по очереди. Иногда надо будет вводить пароль от вашего пользователя и нажимать Y для согласия с установкой.

Устанавливаем MQTT брокер (сервер):

sudo apt-get install mosquitto

Устанавливаем MQTT клиент:

sudo apt-get install mosquitto mosquitto-clients

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

3. Останавливаем сервер для настройки

После установки сервер MQTT сразу запускается. Нам необходимо оставновить его, чтобы произвести последующую настройку.

sudo /etc/init.d/mosquitto stop

4. Настройка

Открываем файл настроек

sudo nano /etc/mosquitto/mosquitto.conf

и заменяем его содержимое на следующее:

persistence true
persistence_location /var/lib/mosquitto/

log_type error
log_type warning
log_type notice
log_type information

connection_messages true
log_timestamp true

Сохраняем, закрываем программу nano и выходим обратно в терминал (ctrl+o, Enter, ctrl+x).

5.Запускаем сервер MQTT

sudo /etc/init.d/mosquitto start

6. Проверяем работу MQTT брокера

Для проверки работы нашего MQTT брокера нам понадобится MQTT клиента. Это могут быть смартфоны с MQTT клиентами, которые подключены к той же Wi-Fi сети. Но мы воспользуемся более простым способом - подключимся к серверу 2 терминалами параллельно.

Принцип работы протокола MQTT

Итак, в первом терминале, в котором вы делали все настройки, подписываемся на канал hello/world:

mosquitto_sub -d -t hello/world

mosquitto_pub -d -t hello/world -m "Hello from Terminal window 2!"

Hello from Terminal window 2!

Проверка работы брокера с помощью 2х терминалов

Поздравляем! Ваш MQTT брокер работает!

7. Статус сервера MQTT

Проверить стаус вашего MQTT брокера вы всегда можете через терминал:

sudo /etc/init.d/mosquitto status

После этой команды в терминале будет показана подробная информация о состоянии вашего сервера.

Проверка статуса MQTT брокера

8. Настройка пароля для MQTT

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

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

sudo mosquitto_passwd -c /etc/mosquitto/passwd <username>

Вместо <username> необходимо указать имя пользователя, которому будет разрешен доступ, например, mqtusr. После выполнения этой команды юзер mqtusr будет добавлен в систему. Дальше необходимо будет ввести ваш пароль от юзера pi, а потом 2 раза пароль для доступа юзера mqtusr к mqtt брокеру. В качестве второго пароля не воодите пароль от пользователи pi, лучше придумайте новый.

Теперь необходимо поменять настройки доступа к системе, для этого необходимо отредактировать файл /etc/mosquitto/conf.d/default.conf на вашем pi. Вы можете использовать для этого любой текстовый редактор, я предпочитаю nano, поэтому в консоли ввожу:

sudo nano /etc/mosquitto/conf.d/default.conf

В открывшейся файл добавляем 2 строчки:

allow_anonymous false
password_file /etc/mosquitto/passwd

Сохраняем и закрываем файл. Для этого в nano нажимаем ctrl+x, выбираем Y и нажимает Enter. Как вы видите в этом конфиге мы прописали в каком файле хранятся юзеры и пароли для подключения к нашему MQTT брокеру, а также мы запретили подключение к серверу всем пользователям без логина и пароля.

Теперь необходимо перезапустить MQTT сервер, для этого вводим в консоли:

sudo systemctl restart mosquitto

Настройка закончена - безопасность вашей системы теперь на высшем уровне!

ESP8266+mqtt mosquitto, instapush, twitter, SMTP, ThingSpeak

Содержание

Делаем отдельную WiFi сеть для IoT

Настраиваем OpenWRT

Настраиваем MQTT брокер mosquitto

Настройка MQTT-Spy

Пишем прошивку в Arduino IDE, подключаем ESP8266 к mosquitto

Устанавливаем и настраиваем mqttwarn

Передаем данные с ESP8266 на ThingSpeak

Передаем данные c ESP8266 по EMAIL

Передаем с ESP8266 на смартфон PUSH уведомления

Управляем ESP8266 GPIO со смартфона

ESP8266 публикует в Twitter состояние GPIO

Поднимаем Dynamic DNS и делаем bridge с CloudMQTT

Делаем отдельную WiFi сеть для IoT

Мы будем использовать не обычную WiFi точку доступа из ближайшего магазина и не народный MR3020, а для того, чтобы решение получилось максимально доступно для широкого круга умельцев, а не только для линуксоидов, которые не признают ничего, кроме командной строки в терминале, мы возьмем, практически за те же деньги, роутер от китайского стартапа Gl.iNET, созданный специально для DIY. Вот наша партнерская ссылка для покупки этого устройства на Aliexpress для тех, кто готов поддержать наш сайт одновременно экономя на покупках с нашим партнером Aliexpress.

Для тех, кто побаивается линуксов вообще и OpenWRT в частности, сообщаю, что мы будем работать c OpenWRT в русифицированном WEB интерфейсе. Сам я не обладаю большим опытом работы в linux и фанатом командной строки не являюсь, поэтому и вам постараюсь показать простые приемы, которые, возможно, и не блещут изяществом.

Русифицированный интерфейс OpenWRT

Русифицированный интерфейс OpenWRT

В принципе, все что будет описано в данной статье будет работать и на китайских роутерах за десять баксов, однако малый размер их оперативки существенно сужает возможность применения их в задачах, которые мы будем им ставить. Даже подключив свап раздел на USB флешке мы получим монстра, который постоянно качает в свап и обратно страницы памяти и наши приложения будут летать просто как черепахи. Вот скриншот по свободной памяти на моем роутере в обычном режиме работы:

Свободная и занятая память при работе всех нужных нам приложений

Свободная и занятая память при работе всех нужных нам приложений

Надо заметить что, скорее всего, вам не понадобится все, что будет описано в этой статье и свободной памяти, в вашем конкретном случае, окажется гораздо больше. Буду очень признателен тем, кто поделится своим опытом у нас на форуме.

Обратите внимание, что у Gl.iNET есть две модели роутеров: 6408A и 6416A, которые имеют на борту 8 и 16 Мб флеш памяти соответственно. Сейчас разницы в цене у них практически нет, так что постарайтесь взять 16-ти мегабайтную модель. Если вы будете повторять все, что будет описано в данной статье, то все равно придется подключать USB флешку для раcширения overlay раздела, потому что размер всех установленных пакетов у меня уже перевалил за 50 Мбайт.

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

Далее мы будем строить такую сеть:

IoT Home Network

ESP8266 IoT Home Network

Как видите, мы не будем вообще использовать функции маршрутизации IP пакетов, наш роутер будет работать в качестве Ethernet моста в той же подсети, что и остальные устройства. Это позволит нормально функционировать протоколу mDNS без пробрасывания UDP портов, отменит необходимость прописывать маршруты из локальной сети в сеть IoT, и при этом мы будем использовать DHCP сервер вашего основного маршрутизатора. Однако, самое главное, что мы получим в результате: две независимые WiFi сети. Это позволит нам переводить ESP8266 в режим 802.11b или 802.11g для снижения энергопотребления в случаях, когда не требуется высокая скорость подключения без ущерба в скорости для остальных WiFi устройств, требовательных к скорости подключения к интернет.

В итоге должно получиться что-то вроде этого (кстати, приколитесь в каком радиовакууме я живу)

Настраиваем OpenWRT

Этот раздел я писал по памяти, за точность и правильную последовательность действий не ручаюсь. В ваших интернетах полно статей как это сделать. Если вы обнаружили неточность или ошибку то, пожалуйста, сообщите мне об этом, я поправлю статью.

Перед отключением от локальной сети и интернета (напоминаю, что наш OpenWRT роутер будет иметь адрес 192.168.1.1), я рекомендую приготовить следующие программы:

Мне было проще подключиться к роутеру через USB-TTL и все настроить в терминале


Как говорится, лень — двигатель прогресса. Для облегчения жизни сейчас делаю себе небольшое устройство в виде модуля ESP8266 и преобразователя RS485 для связи с датчиками-газоанализаторами по протоколу Modbus. В производстве постоянно возникает необходимость подключаться к приборам для выполнения различного рода диагностики по 485 интерфейсу, но каждый раз тащить с собой ноутбук неудобно, а вот мобильный телефон всегда в кармане.

В процессе разработки получилась библиотека, которая позволяет подключаться напрямую с телефона к модулю и обмениваться данными через приложение MQTT клиента. Возможно кому-то такое решение тоже пригодится, ведь отпадает необходимость иметь сторонний MQTT брокер (будь то локальный брокер на Raspberry или брокер в интернете) и подключение к интернету, что в моем случае самое главное.

Приложение для телефона

В качестве приложения я выбрал IoTmanager. Основная фича — это очень гибкая настройка виджетов с помощью HTML5+CSS, все настройки производятся в устройствах, а не в приложении. Топики отправляются в JSON формате и содержат в себе имена заголовков, значения и стили отображения. Возможно кому-то это будет неудобно, но мне такой подход понравился.

Приложение может работать на двух MQTT библиотеках: Paho.js и MQTT.js. С ходу у меня получилось установить WebSocket соединение через библиотеку Paho, на ней я и остался работать. Если выбрать в настройках MQTT, соединения не происходит, подозреваю, что нужно поковырять библиотеку WebSocketServer.

Я долго презирал Arduino, но все же сдался

Не хочу разводить дискуссию по поводу выбора среды, просто скажу, что для меня важную роль в выборе Arduino IDE для написания прошивки ESP8266 сыграло наличие тонны готовых библиотек и документации. Все просто и быстро, благо проект обещает быть не сложным.

Хотите верьте, хотите нет, но даже ракеты улетают в космос с микроконтроллерами, запрограммированными в среде Arduino. Решающую роль очень часто играет скорость разработки — подключил готовые библиотеки и в путь.

Open Source наше все

Репозиторий на GitHub. Библиотека пока сыровата, в некоторых случаях настройки виджетов вызывают реконнект IoTmanager’a, причину которого я найти пока не могу, возможно совместная разработка пойдет быстрее.

Проект содержит в себе две реализации библиотеки:

Пример работы

На телефоне подключаемся к созданной Wi-Fi точке доступа. В приложении IoTmanager заходим в настройки подключения: выбираем движок PAHO, вбиваем IP адрес модуля, 80 порт, префикс топиков /IoTmanager и чуть ниже отключаем SSL/TLS.

Жмем на спидометр в углу, после небольшой задержки должно подключиться и отобразить переключатели. Если не подключается, попробуйте убить и заново запустить приложение. На первом переключателе у меня настроен светодиод (см.видео).

Короткое описание

Обе части библиотеки очень похожи, приведу описание версии _lite:


Видео демонстрация

Варианты создания локального MQTT-брокера

Что потребуется

2. USB-накопитель с разделом ext4. Я купил себе крохотную флешку на 32Gb, дабы не сильно торчала из корпуса роутера. Для создания раздела ext4 в системе Windows для этого можно воспользоваться бесплатным приложением MiniTool Partition Wizard Free. Процесс подготовки подробнее будет описан ниже.

Это всё, что требуется. Плюс немного мысленных усилий и гугла в помощь. Приступаем.

1. Устанавливаем необходимые компоненты


Установка необходимых компонентов

Что потребуется установить:

2. Подготавливаем USB-накопитель

Небольшая сложность здесь в том, что Windows сама по себе не умеет работать с файловыми системами EXT. Для подготовки потребуется дополнительная программа MiniTool Partition Wizard Free или аналогичная. Скачиваем, устанавливаем, запускаем. Вставляем накопитель в USB-разъем, находим в списке нужный раздел, и запускаем его форматирование как EXT4, примерно как показано на рисунке ниже:


Форматирования раздела в EXT4


Проверяем успешное монтирование диска




Так выглядит пока ещё пустой USB-диск на роутере

Можно приступать настройке OPKG и установке системы пакетов репозитория Entware.

3. Установка репозитория Entware на USB-накопитель

У меня Giga (KN-1010), поэтому я скачиваю первый вариант. Затем в корне раздела диска необходимо создать директорию install, куда скопировать скачанный файл mipsel-installer.tar.gz. Внимание: регистр символов важен! Не Install, и не INSTALL, а именно install.


Создаем папку install на USB-диске на роутере



4. Настройка репозитория Entware

Для дальнейшей настройки нам понадобится SSH-клиент, например PUTTY для работы с протоколами SSH и Telnet. Если он у Вас ещё не установлен, то скачиваем и устанавливаем. Дальнейшие действия рассматриваются на его примере.


После чего мы попадаем в командный интерфейс:


Первым делом необходимо сменить пароль доступа к терминалу Entware. Примечание: пользователь root в интерфейсе самого роутера нигде не участвует, он необходим только для доступа к Entware. Для этого введите команду passwd и дважды введите новый пароль:


Теперь можно обновить opkg-пакеты, для этого введите команду opkg update:

Для удобства настройки сразу установим Midnight Commander, с помощью него многие операции можно выполнить существенно проще. Для этого следует выполнить команду opkg install mc:


На этом подготовку к установке MQTT-брокера можно считать завершенной.

5. Установка Mosquitto

Находим нужный нам пакет. Полный список пакетов можно найти здесь:

Открываем основной список, в строке фильтра вводим mqtt и смотрим результаты:


Находим пакеты для сервера mosquitto

Нам нужен пакет для сервера mosquitto, их два: простая версия (nossl) и защищенная (ssl). Я выбрал второй вариант. Для установки пакета вводим команду opkg install mosquitto-ssl и ждем завершения:

Установка выполнена, переходим к настройке.

6. Настройка Mosquitto

1. Вначале стоит добавить пользователя, от имени которого будет запускаться mosquitto. Негоже запускать его от имени root, так как это ведет к снижению уровня безопасности всего роутера. Для добавления нового пользователя в консоли вводим команду adduser mosquitto, а затем два раза вводим пароль:

После чего в файле конфигурации mosquitto.conf необходимо раскомментировать строку General configuration / user mosquitto:

Перезапускаем роутер. Снова подключаемся к роутеру по SSH и пробуем запустить mosquitto командой mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d, после чего проверяем успешность запуска с помощью команды ps:

Здесь важно убедится, что сервер нормально запустился под только что созданным пользователем. Если это не так (сервер пишет, что пользователь mosquitto не найден), то можно попробовать обходной путь из этой статьи. Однако на новой версии у меня всё заработало без танцев с бубном.


Создание скрипта автозапуска

Для этого запускам mc, переходим в каталог /opt/etc/init.d, нажимаем клавиши shift+f4 (открывается пустой файл) и вставляем следующие строки:

Затем сохраняем файл с помощью клавиши f2, указав имя файла Smosquitto. Как вариант, можно сделать это по сети. Затем нужно сделать этот скрипт исполняемым командой chmod +x /opt/etc/init.d/Smosquitto.

Я создал следующую структуру каталогов (возможно, она не является оптимальной, Вы можете изменить по своему вкусу):

Обратите внимание! Для всех пакетов OPKG все директории обязательно должны начинаться с /opt/!

Менять владельца требуется, так как мы зашли в SSH-терминал под пользователем root, а доступ нужно дать пользователю mosquitto. Поэтому при создании каталога владельцем автоматически станет тот, кто его создал (я тебя породил, я тебя и убью, да-да, именно так). Можно ограничится chmod 777, но я решил сделать кардинально.

Теперь проверьте, существуют ли каталоги /opt/var/log и /opt/var/run. Если их ещё нет, создайте. Проще и удобнее всего это сделать с помощью mc (Midnight Commander). После этого необходимо дать полные права на эти каталоги:

Альтернативный вариант, предложенный в комментариях. Можно попробовать выполнить следующие команды:

Лимит кучи для брокера я пока оставил без ограничений (0), но если в будущем окажется, что брокер выжирает всю доступную память на роутере, то придется умерить его аппетиты. Уменьшил интервал публикации системной информации, дабы сильно не грузить роутер почти бесполезными данными (по умолчанию 10 секунд).

Далее указываем, где брокер будет хранить базу данных. Указываем ему путь на ранее созданную папку:

Думаю, тут тоже всё понятно. Переходим к журналированию. На начальном этапе я включил несколько журналов: в консоль, в системный журнал роутера, в файл и в системные топики. После того, как настройка брокера будет завершена, вывод журналов в консоль и в файл имеет смысл отключить. Ибо консоль всё равно никто видеть не будет, а файл может неограниченно расти. Ну и количество типов событий можно существенно подсократить (в будущем).

Добавляем все эти секции в файл, проверяем, сохраняем. В принципе, можно уже пробовать запускать брокер. Сделать это можно с помощью команды:

Однако, если брокер уже был запущен, его нужно предварительно остановить. Чтобы не набирать команды каждый раз ручками, я набросал в Midnight Commander скриптик и дал ему права на выполнение:

Однако подключаться пока ещё рано, нужно вначале создать файл пользователей и добавить пользователей в список. Сделать это можно с помощью команды mosquitto_passwd:

Первого пользователя добавляем с опцией создания нового файла ( -с ):

Второго и последующего пользователя добавляем уже без этого флага:

Пользователей можно добавить сколько угодно. В результате будет создан файл примерно такого содержания:

Более подробно можно прочитать в документации:

Итак, запускаем mc, переходим в каталог /opt/etc/mosquitto/, нажимаем клавиши shift+f4 (откроется пустое окно редактора), добавляем строки:

Перезапускаем брокер (скриптом или перезагрузкой роутера). Можно убедится, что всё хорошо, посмотрев файл журнала:

7. Добавляем возможность TLS-соединения

1. Для начала нам необходимо установить утилиту OpenSSL:

2. Создаем каталог для хранения сертификатов и ключей. Поскольку это сертификат mosquitto, то логично расположить всё это хозяйство внутри /opt/etc/mosquitto. Создадим каталог /opt/etc/mosquitto/certs и перейдем в него:

Используя эту команду, мы создаем ключ длиной 2048 бит с именем mosq-ca.key (имя в принципе может быть другим)

4. Генерируем CA сертификат X509 (CA CERT), используя созданный CA ключ. Для этого выполните команду openssl req -new -x509 -days 999 -key mosq-ca.key -out mosq-ca.crt. Программа запросит данные страны, региона, организации и другие данные (некоторые можно оставить пустыми), после чего будет создан файл сертификата:

5. Генерируем личный RSA ключ для сервера (SERVER KEY) с помощью команды openssl genrsa -out mosq-serv.key 2048:

Как вы можете заметить, мы использовали закрытый ключ, сгенерированный на предыдущем шаге. Наконец, мы можем создать сертификат для использования на нашем сервере Mosquitto.

7. Создаем сертификат сервера (SERVER CERT), используя запрос на подпись сертификата и ранее созданный CA сертификат:

Готово. Сертификаты созданы. Конечно, этот сертификат не примет обычный браузер, но в некоторых mqtt-клиентах для android есть возможность использования самоподписанного сертификата (хотя в этом есть потенциальный риск, что сертификат может быть подменен). А для ESP это вообще не важно, так как в любом случае требуется указание корневого сертификата.

Можно проверить результаты, выполнив команду openssl x509 -in mosq-serv.crt -noout -text.

8. Корректируем права на доступ к файлам ключей пользователям.

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

9. Подключаем созданный сертификат к нашему серверу.

Осталось настроить mosquitto.conf. Для этого добавляем в секцию Listeners ещё одного слушателя:

Добавить эти строки нужно после уже добавленного ранее listener 1883.

10. Перезапускаем брокер любым способом: командным файлом, вручную или перезагрузкой роутера и пробуем подключится.

Настраиваем клиент для работы с самоподписанным сертификатом. Для этого можно либо подгрузить CA сертификат на смартфон, либо поставить галочку в свойствах подключения:


Настройка клиента MQTT Dash для работы с локальным брокером напрямую

и пробуем подключится:

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


Проброс порта 8883 на роутере

Проброс MQTT портов на роутере

Как видите, noSSL 1883 порты извне я всё-таки отключил, ибо небезопасно. А внутри локальной сети все будет работать и без SSL.

9. Настраиваем мост к внешнему MQTT серверу

Мостов на внешние брокеры может быть несколько, каждое такое подключение должно иметь своё имя. Кстати, несколько мостов позволяет одновременно принимать данные с разных облачных брокеров, если ранее прошитые ESP по каким-то причинам невозможно переключить на другой брокер.

Прежде чем создавать мостовые соединения, хорошо бы создать отдельного локального пользователя, хотя в принципе можно обойтись и уже существующим. Для этого воспользуемся командой mosquitto_passwd, как мы это делали ранее:

а затем не забудьте добавить права доступа на топики в /opt/etc/mosquitto/mosquitto.acl, для примера можно так:

Для создания мостового соединения необходимо добавить по крайней мере одну новую запись mosquitto.conf в секцию Bridges:

Разумеется, имя сервера, порт, имена пользователей и пароли Вы предварительно должны заменить на свои!

10. Настройка моста на работу через SSL

Ну и напоследок могу порекомендовать выделить для IoT устройств отдельную сеть с отдельным диапазоном адресов, так как медленные ESP8266 в общей сети как-то умудрялись тормозить всю wifi сеть. После выделения и переподключения их в отдельный сегмент, проблема ушла.

Читайте также: