Сетевой мост, его настройка между серверами (брокерами) MQTT
Григорий
Назначение - обмен информацией между локальным и внешним сервером MQTT ( сетевой мост между ними). Для чего это нужно? Сетевой мост (network bridge), служит для объединения двух локальных сетей в одну или для разделение одной сети на два сегмента. Как использовать в технологиях умного дома.
С учётом специфики работы устройств со слабой мощностью и сетей с небольшой пропускной способностью протокол MQTT сделан маленьким и лёгким. К их числу можно смартфоны, планшеты и микрокомпьютеры, датчики и т.д.
MQTT стал протоколом, используемым разработчиками "умного дома".

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

У меня локальный сервер поднят на Raspberry PI3, который по своим характеристикам вполне может выполнять эти задачи. Использование "Малинки" обусловлено его низкой ценой, небольшим энергопотреблением. Многие разработчики устанавливают сервер MQTT на маршрутизаторе. Ну тут кому как удобнее.Микрокомпьютер загружается не с SD-карты, а флешки объемом 16 Гб. Это сделано для повышения надежности, так как SD-карты часто выходят из строя и каждые 6-12 месяцев переустанавливать программное просто лень. USB Флеш-накопитель гораздо надежнее. Вместо флешки можно использоваить SSD или жесткий диск. Сделать это несложно. На Raspberry pi4 данная функция загрузки с USB носителя уже есть и там делать ничего не надо. На старых моделях эту возможность нужно активировать вручную путем внесения значения в OTP-память опции USB Boot Mode. Устанавливаем на флеш накопитель операционную систему (точно также как на SD-карту). Загружаемся с SD- карты, заходим в терминал и прописываем строку в config.txt (для этого использовал программу putty, осуществляющую соединение по SSH):

echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
Сохраняемся и перезагружаем микрокомпьютер командой - sudo reboot. Теперь можно загружаться с флешки. Настраиваем операционную систему. Обязательно после настройки системы выполняем две команды в терминале:
sudo apt-get update
sudo apt-get upgrade
Рекомендовал бы прописать для Raspberry статистический IP- адрес, чтобы не зависить от внезапной его замены на другой. В этом случае Вы потеряете подключение к микрокомпьютеру. Для этого необходимо отредактировать файл “dhcpcd.conf”, который находится в каталоге “etc”.
Вводим команду в терминале
sudo nano /etc/dhcpcd.conf
В открывшемся окне в конце файла прописываем
nodhcp
Далее устанавливаем статистический IP- адрес для Raspberry прописывая следующие строки в dhcpcd.conf:
interface eth0
static ip_address=192.168.1.48/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
У меня примерно так.
После настройки устанавливаем на Raspberry mosquitto (сервер MQTT. Не буду подробно описывать его установку и установку ОС - об этом не писал разве только ленивый.
Я пользуюсь внешним брокером WOTT.ru. Оплата за услуги пользования 300 рублей в год, сумма по нынешним временам небольшая. Для установки моста между серверами надо на локальном сервере используюя терминал в файле /etc/mosquitto/conf.d/bridge_wqtt.conf прописать следующие строки
sudo nano /etc/mosquitto/conf.d/bridge_wqtt.conf
connection m4.wqtt.ru
address server xxxxx:port
try_private true
notifications true
start_type automatic
remote_clientid Local-Broker
remote_username логин
remote_password пароль
#bridge_cafile /etc/ssl/certs/ca-certificates.crt
topic # both
#bridge_cafile /etc/ssl/certs/ca-certificates.crt (данную строку я задокументировал так как не использую шифрование)
Теперь связь между серверами должна быть установлена. В устройствах необходимо прописать все данные локального сервера. Почему локального? Локальный сервер MQTT основной и будет получать данные с устройств и управлять ими, одновременно отсылая данные на сервер в интернете. Если соединение с интернетом не установлено у вас все (кроме голосового управления) будет работать. Также если какие-то команды поступят на внешний сервер, то он передаст их на локальный.
Если же будет прописан в настройках устройств внешний сервер - то при отсутствии соединения с интернетом все работать не будет из-за отсутствия соединения с сервером. Установить IP-адрес Raspberry можно в роутере или при помощи программы Advanced IP Scanner или аналогичной.

Проверить есть ли обмен пакетами информации между серверами MQTT достаточно просто. Я использовал приложение MQTT Dash для смартфона. Настройки сервера в приложении соответствовали его настройкам на Raspberry. При нажатии например на какой либо выключатель происходило срабатывание и на внешнем сервере это отбражалось. Точно также проверялась обратная связь с WQTT на локальный сервер. Отключаем входящий кабель от роутера, имтируя пропажу интернета. После чего проверяем управление устройствами со смартфона. Как видите ничего сложного.