Установка Mosquitto mqtt брокера на UBUNTU 16.04.2 Orange Pi

Установка Mosquitto брокера MQTT на Orange Pi Zero с UBUNTU 16.04.2

В основе современных проектов умного дома и интернета вещей все чаще используется протокол MQTT  (Message Queuing Telemetry Transport), имеющий на сегодня несколько вариантов реализации сервера, так называемого брокера. Из всех вариантов я решил остановить свой выбор на MQTT брокере Mosquitto, устанавливать его будем на Orange Pi Zero с Armbian UBUNTU Xenial 16.04.2

Все о чём пойдет речь ниже написано по мотивам статьи Виктора Бруцкого и Александра Суслова размещенной в сообществе разработчиков esp8266.ru: https://esp8266.ru/orange-pi-mosquitto-websockets. Описанный им процесс установки MQTT брокера отличается тем, что Mosquitto компилируется из исходного кода, а не устанавливается из реппозитария, и отличается поддержкой WebSockets для управления устройствами через IoT Manager и прочие приложения требующие WebSockets.

Сразу отвечу на очевидный вопрос: «Для чего нужен собственный MQTT брокер когда уже есть несколько бесплатных облачных сервисов?». В первую очередь Mosquitto MQTT брокер нужен для тестирования проектов в локальной сети, а так же неограниченная возможность изучать и экспериментировать. Начнём!

Установку Mosquitto MQTT брокер на Ubuntu 16.04.2 будем производить используя недавно приобретенную для подобных экспериментов плату Orange Pi Zero.

В прошлой публикации на Orange Pi была установлена ОС Armbian (UBUNTU Xenial 16.04.2), система не настраивалась и на сегодня осталась в первозданном виде, поэтому перед установкой MQTT брокера выполним несколько стандартных процедур. Для работы с устройством будем пользоваться SSH-клиентом PUTTY.

1 Войдем в систему и обновим кэш репозитариев:

sudo apt update
 
затем обновим пакеты
 
sudo apt upgrade
 
2 Для удобства работы с файлами установим Midnight Commander:
 
sudo apt install mc
 
 
3 До устанавливаем необходимые библиотеки и утилиты:
 
sudo apt -y install libssl-dev cmake libc-ares-dev uuid-dev daemon
 
4 Запускаем Midnight Commander (sudo mc) и переходим в домашний каталог (можно ввести команду cd ~ из консоли). Создадим папку с любым именем, например vrem и зайдем в нее.
Загрузим последнюю версию libwebsockets (на момент написания этой статьи это версия 2.0.2):
 
wget https://libwebsockets.org/git/libwebsockets/snapshot/libwebsockets-2.0.2.tar.gz
 
и распакуем её
 
tar zxf libwebsockets-2.0.2.tar.gz
 
cd libwebsockets-2.0.2/cmake
 
5 Соберём из исходников и инсталлируем libwebsockets:
 

sudo cmake ..

sudo make install

Процесс занимает около 5-10 минут. По готовности создадим необходимые связи и сформируем кэш динамических библиотек с помощью утилиты ldconfig:
 
sudo ldconfig
 
6 Приступим к установке Mosquitto (актуальная версия на момент написания статьи 1.4.10):
 

cd ../..

wget http://mosquitto.org/files/source/mosquitto-1.4.14.tar.gz

tar zxf mosquitto-1.4.14.tar.gz

cd mosquitto-1.4.14

 
7 Вносим правки в файл config.mk (ищем строку WITH_WEBSOCKETS:=no  заменяем на WITH_WEBSOCKETS:=yes) или делаем это командой в консоли, а затем собираем пакет:
 

sed -i — ‘s/WITH_WEBSOCKETS:=no/WITH_WEBSOCKETS:=yes/g’ config.mk

sudo make

sudo make install

Процесс сборки на моем железе занял около 7-8 минут.
 
В случае если процесс останавливается с похожими ошибками:
«…/mosquitto-1.4.1 $ make
set -e; for d in lib client src; do make -C ${d}; done
make[1]: Entering directory ‘/home/pi/projects/leoMatthias/software/Mosquitto_MQTT/mosquitto-1.4.1/lib’
cc -Wall -ggdb -O2 -I. -I.. -I../lib -fPIC -DWITH_TLS -DWITH_TLS_PSK -DWITH_THREADING -DWITH_SOCKS -DWITH_SRV -c mosquitto.c -o mosquitto.o
In file included from mosquitto.c:33:0:
./mosquitto_internal.h:40:20: fatal error: ares.h: No such file or directory
compilation terminated.
Makefile:51: recipe for target ‘mosquitto.o’ failed
make[1]: *** [mosquitto.o] Error 1
make[1]: Leaving directory ‘/home/pi/projects/leoMatthias/software/Mosquitto_MQTT/mosquitto-1.4.1/lib’
Makefile:21: recipe for target ‘mosquitto’ failed
make: *** [mosquitto] Error 2″
 
Меняем в файле config.mk параметр WITH_SRV=yes на no и сохраняем его.
 
 
8 Создадим для Mosquitto конфигурационный файл и добавим пользователя под которым будет запускаться наш MQTT брокер:
 
sudo cp mosquitto.conf /etc/mosquitto
echo «listener 1883» >> /etc/mosquitto/mosquitto.conf
echo «listener 9001» >> /etc/mosquitto/mosquitto.conf
echo «protocol websockets» >> /etc/mosquitto/mosquitto.conf
sudo useradd -r -m -d /var/lib/mosquitto -s /usr/sbin/nologin -g nogroup mosquitto
 
Командами echo мы добавим несколько строк в конфигурационный файл mosquitto.conf. У меня не получилось добавить строки через консоль и я сделал это вручную в редакторе nano, поместив строки listener 1883 в раздел Default listener, а listener 9001 и protocol websockets в Extra listeners,  эти разделы в Mosquitto условные, отличаются только комментариями и мы будем использовать такой вариант только для удобства.
 
9 Создадим скрипт для автозапуска Mosquitto. Для меня удобнее сделать это в Midnight Commander (sudo mc), идем в каталог /etc/init.d и создаем (Shift+F4) новый файл, скопируем в него следующие строки:
 
#!/bin/bash
#/etc/init.d/mosquittocase «$1» in
start)
echo «Starting mosquitto»
/usr/local/sbin/mosquitto -d -c /etc/mosquitto/mosquitto.conf
 >> /var/log/mosquitto/mosquitto.log
 2>> /var/log/mosquitto/mosquitto.error
;;
stop)
echo «Stopping mosquitto»
killall mosquitto
;;
*)
echo «Usage: /etc/init.d/mosquitto start|stop»
exit 1
;;
esacexit 0
 
Сохраним файл с именем mosquitto
 
Устанавливаем атрибут исполняемого файла для нашего скрипта автозапуска и создаём каталог для хранения логов:
 

sudo chmod +x /etc/init.d/mosquitto

sudo mkdir -p /var/log/mosquitto

 
9 Включаем скрипт mosquitto в автозагрузку и запускаем его:
 

sudo update-rc.d mosquitto defaults

sudo /etc/init.d/mosquitto start

 
При этом update-rc.d скорее всего ругнется на синтаксис нашего файла, который не соответствует некоторым правилам оформления содержимого скриптов автозапуска Ubuntu, но на работе это не должно отразиться.
 
10 Для чистоты эксперимента перезагружаемся:
 
sudo reboot
 
11 Дождавшись загрузки ОС, вновь подключаемся к плате через PUTTY и проверяем работу MQTT брокера Mosquitto командой:
 
sudo ps acx | grep mosquitto
 
В случае успеха видим следующее:
 
mosquitto mqtt broker test
 
Если что то пошло не так, идем смотреть логи в /var/log/mosquitto, если там пусто, тогда настройте подробный лог командой log_type в файле /etc/mosquitto/mosquitto.conf.
 
В моём случае конфигурация исправно работает, что проверено через MQTT SPY и мобильное приложение для Android.
 
Получившийся MQTT брокер слушает подключения на стандартном порту 1883 и MQTT через WebSockets на порту 9001. Для доступа к нашему Mosquitto не только из локальной сети, «прокидываем» на роутере порт 9001 во внешний мир.