MQTT сервер на Raspberry PI

Публикация 11.05.2017

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

MQTT сервер на Raspberry PI

К слову сказать, я бы для такого mqtt брокера лучше бы использовать какой-нибудь Orange PI Zero т.к. он стоит дешевле и питание у него удобнее - 5-и вольтовое.

Для начала нам нужно залить на флешку образ ОС. Скачать его можно с сайта http://www.orangepi.org/downloadresources/
Подробности установки и детали первого запуска расписывать не буду.
Подключаемся к терминалу нашей Pi и вводим:

raspi-config

В файле конфигурации нам нужно включить опцию Expand Filesystem, дающая разрешение на использование всей флешки файловой системой.
Для удаленного доступа Advanced Options — SSH — Enable активирует ssh клиент.
Далее нужно настроить для "малины" параметры подключения к сети или просто запомнить ip адрес, если вы подключились проводом к роутеру:

ifconfig eth0
Параметры подключения Raspberry pi к сети

Теперь нужно перезагрузиться командой:

reboot

После запуска системы мы будем подключаться к ней по ssh каналу связи. В качестве клиента на windows можно использовать чудо программу Putty. Если вы используете linux или osx - у вас уже есть bash консоль и больше ничего не потребуется.

Что бы избавиться от неожиданностей в процессе установки нужно обновить все загруженное ПО:

apt-get update

Менеджер пакетов сверится с репозиториями и затянет все обновления.

Подготовка завершена теперь приступим к установки MQTT броккера mosquitto.

apt-get -y install libssl-dev cmake libc-ares-dev uuid-dev daemon

Для работы брокера потребуется поддержка websocket. Этим будет заниматься отдельный пакет. Установим его вручную.

cd ~
mkdir src
cd src
wget https://github.com/warmcat/libwebsockets/archive/master.zip
unzip master.zip
rm master.zip
cd libwebsockets-master/cmake

Теперь нужно выполнить сборку:

cmake .. 
make install

Сборка займет некоторое время. После завершения нам нужно построить все необходимые связи между пакетами и библиотеками. Этим занимается автоматическая утилита ldconfig. Запустим ее:

ldconfig

Теперь нужно заняться развертыванием masquitto. Разворачивание будем проводить в дирректории src.

cd ../..
wget http://mosquitto.org/files/source/mosquitto-1.4.8.tar.gz
tar zxf mosquitto-1.4.8.tar.gz
cd mosquitto-1.4.8

Нужно будет внести изменения в конфиг. Откроем файл config.mk любым редактором и зададим значение опции WITH_WEBSOCKETS:=yes

sed -i -- 's/WITH_WEBSOCKETS:=no/WITH_WEBSOCKETS:=yes/g' config.mk
make 
make install

После завершения вы увидите что-то такое:

MQTT сервер на Raspberry PI

Не забываем, что mqtt сервер работает должен работать из под учетной записи пользователя и ее нужно сконфигурировать. Добавим строки с данными подключения в конец файла mosquitto.conf

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
useradd -r -m -d /var/lib/mosquitto -s /usr/sbin/nologin -g nogroup mosquitto

Настроим автозапуск mosquitto. Создадим новый файл в фиддерктории и /etc/init.d

nano /etc/init.d/mosquitto

Вставим в него содержимое:

#!/bin/bash
#/etc/init.d/mosquitto
 
case "$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
;;
esac
 
exit 0

Дадим директории разрешающие права и создадим папку для логирования:

chmod +x /etc/init.d/mosquitto
mkdir -p /var/log/mosquitto

Добавляем сервер в список автозапуска и стартуем его:

update-rc.d mosquitto defaults
/etc/init.d/mosquitto start

На этом все. Наш броекр-сервер MQTT запущен. Убедимся, что он исправлен выполнив в консоли комманду:

ps acx | grep mosquitto
Проверка запущенного mqtt сервера

Если вы потерпели феаско, то не расстраивайтесь, а затем смотрите логи:

log_type /var/log/mosquitto
log_type /etc/mosquitto/mosquitto.conf

Сервер HTTP MQTT будет слушать порт 1883, а WebSocet MQTT - 9001.
Открыть доступ брокер сервера из интернета можно на роутере, если прокинуть порт 9001 во внешнее internet соединение.

* комментарии публикуются после модерации
06.01.2020 14:28
Вам нужен интернет-провайдер с белым статическим ip. В настройках роутера добавить виртуальный сервер, прописать в нем ip адрес локального устройства и внешний/внутренний порт. Далее регистрируете доменное имя и в настройках dns указываете ваш белый статический ip адреса. Теперь при обращении по вашему домену и порту будет прямой запрос к вашему устройству (mqtt серверу).
04.01.2020 18:59
Доброго времени суток. Подскажите, как зеркалить данные с этого сервера на внешний хостинг VPS/VDS. Так хочу убить двух зайцев - не нужен статический айпи и всякие dyndns, которые все равно не работают на мобильных операторах и можно сделать нормальный сайт на человеческом домене. А хостинг все равно уже есть.
21.09.2018 17:07
Makefile:54: recipe for target 'read_handle_server.o' failed
make[1]: *** [read_handle_server.o] Error 1
make[1]: Leaving directory '/home/pi/src/mosquitto-1.4.8/src'
Makefile:21: recipe for target 'mosquitto' failed
make: *** [mosquitto] Error 2
Скромный вопрос что не так?
23.07.2018 18:10
Увы, нужны базовые навыки linux администрирования. В противном случае инструкция будет очень длинной и скучной.
23.07.2018 17:54
Для начинающего не очень понятно, как будто с палками
гнались и не дали возможности донести, а хотелось понять.