Желание управлять всем в своем доме или квартире есть у многих наших читателей и часть из них уже преуспела в этом деле, но эта статья больше для тех, кто не успел закупиться по нормальному курсу и теперь кусает локти. Я расскажу как можно недорого поставить брокер mosquitto буквально «рядом с вашим роутером» с поддержкой WebSockets для управления вашими устройствами из IoT Manager.
При текущем курсе рубля покупать Raspberry Pi за 35$ для своего умного дома сейчас, наверное не самая лучшая идея, особенно, когда есть достойная альтернатива: Orange Pi, стоимость которой гораздо более демократична. Купить одну из моделей Orange Pi можно прямо у производителя в народном интернет-магазине Aliexpress. Я не буду останавливаться на характеристиках апельсинки — такой информации достаточно много и вы без труда ее найдете. Я себе взял «среднюю» версию с 1Гб оперативки — это Orange Pi PC за 15$ (18.61$ с учетом доставки в РФ), но все описанное в этой статье будет прекрасно работать как на младшей сестре Orange Pi One за 9,99$ (с доставкой в РФ — 13.55$ ), так и на монстре Orange Pi Plus 2 за 49$ (52.78$ с доставкой в РФ) с 2-мя гигами оперативки, встроенной EMMC 8Гб флеш памятью, гигабитной сетью и контроллером SATA на борту.
Тем, кто решится на покупку, могу посоветовать обратить внимание на то, что в отличии от RaspberryPi, Orange PI требуется 5-ти вольтовый 2-х амперный блок питания с «особым разъемом» (апельсинку нельзя запитать от micro USB), так что либо придется заказать один из комплектов с блоком питания, или найти подходящий разъем в своих закромах или поискать в магазинах (моя OrangePi PC не сильно прожорливая: в ненагруженном состоянии потребляет около 340 миллиампер, однако не запустилась при попытке использовать дешевую китайскую USB зарядку с проводами небольшого сечения).
Также можно взять недорогой комплект с кабелем питания и корпусом или подобрать что-то похожее дома — точно подходит и блок питания и разъем от Sony PSP. Еще не забудьте заранее позаботиться о microSD флешке (от 4Гб, но лучше 8Гб и класс не ниже 10) и закажите радиаторы на камень и память или вентилятор в корпус. В случае, если вы хотите установить свой контроллер Умного Дома не рядом с вашим домашним маршрутизатором, то имеет смысл заранее позаботится о WiFi USB адаптере.
Первый запуск и первоначальная настройка описана во множестве статей (почти все, что написано для Raspberry Pi, будет работать и на Orange Pi). Вкратце скажу, что имидж флешки берем здесь, выбираем для своей модели Raspbian (ну или другой, на свой вкус). Заливаем его на флешку, после запуска нужно залогиниться с клавиатуры и запустить
1 |
raspi-config |
В меню нужно расширить файловую систему на всю флешку (Expand Filesystem) и включить SSH для удаленного доступа (Advanced Options — SSH — Enable). Далее можно настроить сеть и т.п. Кстати, настройка сети не потребуется, если вы подключили Orange Pi к своему роутеру обычным сетевым кабелем — просто посмотрите IP адрес, который присвоился вашей апельсинке для удаленного подключения к ней в дальнейшем:
1 |
ifconfig eth0 |
Перезагружаемся
1 |
reboot |
и заходим уже удаленно со своего компьютера. Я предпочитаю использовать putty.
Заходим в систему и первым делом обновляем кэш репозитариев для установки пакетов:
1 |
apt-get update |
Далее, для упрощения файловых операций типа создания каталогов, перехода по папкам и легкого редактирования файлов поставим Midnight Commander:
1 |
apt-get install mc |
Я предпочитаю пользоваться встроенным в mc редактором, для этого запускаю mc иду в настройки F9 — Options — Configuration, ставлю галочку напротив Use internal edit, жму Ok и сохраняю настройки F9 — Options — Save Setup. Далее можно скрыть панели mc комбинацией клавиш CTRL+O и работать как обычно, в командной строке. Для перехода по каталогам и редактирования файлов нажмите CTRL+O опять для отображения панелей mc.
Итак, это была подготовка, а теперь начинается именно то, что относится непосредственно к теме этой статьи — ставим MQTT брокер mosquitto из исходников с поддержкой WebSockets.
Инсталлируем необходимые библиотеки и утилиты:
1 |
apt-get -y install libssl-dev cmake libc-ares-dev uuid-dev daemon |
Запускаем наш mc и переходим в домашний каталог (или из консоли вводим команду cd ~). Здесь создаем папку с произвольным именем, например src и переходим в нее. Загружаем и распаковываем последнюю версию libwebsockets (на момент написания этой статьи это версия 1.7.5)
1 2 3 4 |
wget http://git.libwebsockets.org/cgi-bin/cgit/libwebsockets/snapshot/libwebsockets-1.7.5.tar.gz tar zxf libwebsockets-1.7.5.tar.gz cd libwebsockets-1.7.5/cmake |
собираем и инсталлируем ее:
1 2 |
cmake .. make install |
Сборка и установка займет пару минут. Далее запустим утилиту ldconfig, которая создаст необходимые связи и сформирует кэш динамических библиотек:
1 |
ldconfig |
Перейдем на пару уровней выше, обратно в нашу папку src и займемся непосредственно самим mosquitto (актуальная версия на момент написания статьи 1.4.8)
1 2 3 4 |
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:=no и заменяем ее на WITH_WEBSOCKETS:=yes) или делаем это элегантно одной командой в консоли, как настоящие линуксоиды и собираем:
1 2 3 |
sed -i -- 's/WITH_WEBSOCKETS:=no/WITH_WEBSOCKETS:=yes/g' config.mk make make install |
Тут можете попить кофе — процесс сборки займет несколько минут. По окончании процесса вы увидите ничем не примечательную картину
На это еще не все, теперь нужно сделать для mosquitto конфигурационный файл и создать пользователя под которым будет запущен брокер
1 2 3 4 5 |
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 |
Обратите внимание, что командами echo мы добавляем необходимые строки в конец конфигурационного файла. Тоже самое, но более осмысленно можно сделать вручную в редакторе, поместив строку listener 1883 в раздел Default listener, а listener 9001 и protocol websockets в Extra listeners, но это вовсе не обязательно, т.к. эти разделы в mosquitto условные, различаются лишь комментариями и нужны только нам для удобства.
Далее мы создаем скрипт автозапуска mosquitto. Для этого жмем CTRL+O для отображения mc, идем в каталог /etc/init.d и там создаем через Shift+F4 новый файл, вставляем туда следующие строки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/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 |
Жмем F2 для сохранения, вводим имя файла mosquitto и выходим из редактора по F10. Вместо создания скрипта запуска в редакторе вы можете скачать этот файл с нашего сайта командой:
1 |
wget http://esp8266.ru/usefull/mosquitto |
Осталось еще немного — мы уже на финишной прямой — установим атрибут исполняемого файла скрипту и создадим каталог для логов:
1 2 |
chmod +x /etc/init.d/mosquitto mkdir -p /var/log/mosquitto |
Включаем скрипт в автозагрузку и запускаем:
1 2 |
update-rc.d mosquitto defaults /etc/init.d/mosquitto start |
Последний штрих — убедимся, что mosquitto запустился и работает, а не вылетел с ошибкой сразу после запуска:
1 |
ps acx | grep mosquitto |
Если все ок, то вы увидите следующее:
Если нет — смотрите логи в /var/log/mosquitto, если там пусто, настройте более подробный лог командами log_type в /etc/mosquitto/mosquitto.conf
В результате, наш брокер слушает MQTT подключения на стандартном порту 1883 и MQTT over WebSockets на порту 9001, т.е. в настройках IoT Manager вы теперь можете прописать IP адрес вашей апельсинки и порт 9001 (SSL выключен). Чтобы ваш mosquitto был виден приложению не только из вашей локальной сети, но и из интернет осталось только прокинуть на роутере порт 9001 во внешний мир (побеспокойтесь о безопасности и создайте пользователей, как описано в этой статье) или настройте mqtt bridge на какой-нибудь облачный MQTT сервис, но тогда в приложении подключайтесь уже к этому сервису.
Виктор Бруцкий, независимый IoT евангелист, 4refr0nt@gmail.com
Отдельная благодарность Александру Суслову за помощь в подготовке статьи.
Обсуждение этой статьи, mosquitto и вообще домашних серверов, на нашем форуме