Mqtt сервер на роутере asus

  • #1

Trying to work out how to install Mosquitto on a AsusWRT firmware / Asus RT-AC68U combo.
I believe the Linux is based on Tomato and heavily modified, but all the instructions I can find don’t correspond to the folders I am seeing on the router when I telnet into it.

What I am ultimately trying to do is setup some kind of presence detection and pass instructions to a Mosquitto server, for further action. I am not the most educated Linux user, so I am not sure if there is an easy way to do this.

These are the instructions I am trying to follow https://github.com/dersimn/owrtwifi2mqtt
It seems to be based on OpenWRT which from what I read doesn’t really do wireless on the Asus RT-AC68U.

Would appreciate any assistance you can give.

  • #3

Thanks for the link. For those playing along at home and trying to do the same thing I am at a later date, the link basically tells you to use Entware…

I have AsusWRT firmware on my RT-AC68U router, which under «Tools» tells me the CPU is an arm v7
So I navigated through several links to get to the arm v7 download page. https://github.com/Entware/Entware/wiki/Alternative-install-vs-standard

I didn’t know the kernel version so I used PuTTY to telnet into the router and run the following command. (http://www.linfo.org/find_kernel_version.html)
uname -r

Which told me the kernel version was 2.6.36.4, then I could work out which version to use… armv7 (kernel >= 2.6.36)
Next step is determine if I need Standard (Generic) or Alternative. Looking at the text above the download links, I should be fine with Standard (Generic).

Next step is to work out how to load an xxxx.sh file.
Back on this page I found these instructions. https://github.com/Entware/Entware/wiki/Install-on-Asus-stock-firmware

First check your kernel version with uname -r. If your kernel is 3.2 or higher and your architecture is arm (RT-AC58U) use armv7sf-k3.2 repo, if your kernel is 2.6.36 (Asus Broadcom routers) use armv7sf-k2.6 repo. If you have mipsel router vith 2.6.22 kernel you can use only Entware-ng repo. After reboot, open telnet/ssh console and type following command.

  • Standard install on ARM 2.6.36 devices (RT-AC68U, RT-AC56U, RT-AC87U, RT-AC3200, RT-AC88U, RT-AC3100, RT-AC5300, e.t.c):

wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh

OK if I had found that page first it might have saved a step or two… However I don’t know if the AsusWRT firmware is the same as the regular Asus firmware. I am going to make an assumption that they are both loosely based on the Tomato flavour of Linux and give this a go…
wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh

I ran the command from the default folder me@myrouter: /tmp/home/root# wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh
and got a whole heap of messages saying «No such file or directory»
so lets try cd / to go back to the root folder and try again…
me@myrouter: /# wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh
Nope a whole lot more of the same messages, seems like I have hit a dead end.

L&LD

L&LD

Part of the Furniture


  • #4

Thanks for the link. For those playing along at home and trying to do the same thing I am at a later date, the link basically tells you to use Entware…

I have AsusWRT firmware on my RT-AC68U router, which under «Tools» tells me the CPU is an arm v7
So I navigated through several links to get to the arm v7 download page. https://github.com/Entware/Entware/wiki/Alternative-install-vs-standard

I didn’t know the kernel version so I used PuTTY to telnet into the router and run the following command. (http://www.linfo.org/find_kernel_version.html)
uname -r

Which told me the kernel version was 2.6.36.4, then I could work out which version to use… armv7 (kernel >= 2.6.36)
Next step is determine if I need Standard (Generic) or Alternative. Looking at the text above the download links, I should be fine with Standard (Generic).

Next step is to work out how to load an xxxx.sh file.
Back on this page I found these instructions. https://github.com/Entware/Entware/wiki/Install-on-Asus-stock-firmware

First check your kernel version with uname -r. If your kernel is 3.2 or higher and your architecture is arm (RT-AC58U) use armv7sf-k3.2 repo, if your kernel is 2.6.36 (Asus Broadcom routers) use armv7sf-k2.6 repo. If you have mipsel router vith 2.6.22 kernel you can use only Entware-ng repo. After reboot, open telnet/ssh console and type following command.

  • Standard install on ARM 2.6.36 devices (RT-AC68U, RT-AC56U, RT-AC87U, RT-AC3200, RT-AC88U, RT-AC3100, RT-AC5300, e.t.c):

wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh

OK if I had found that page first it might have saved a step or two… However I don’t know if the AsusWRT firmware is the same as the regular Asus firmware. I am going to make an assumption that they are both loosely based on the Tomato flavour of Linux and give this a go…
wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh

I ran the command from the default folder me@myrouter: /tmp/home/root# wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh
and got a whole heap of messages saying «No such file or directory»
so lets try cd / to go back to the root folder and try again…
me@myrouter: /# wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh
Nope a whole lot more of the same messages, seems like I have hit a dead end.

You’re making it much more difficult than it needs to be?

I would recommend that you format your jffs partition to ensure you’re starting in a clean state. Perform a ‘format jffs partition on next reboot’ and proceed to reboot the router 3 times in the next 15 minutes waiting 5 to 10 minutes between reboots.

Install amtm from thelonelycoder and format your USB drive to Ext4 with journalling enabled.

If you want to install Diversion (a whole network Ad blocker from thelonelycoder), it will also install Entware for you. You can install Diversion from the amtm menu script you already have installed. ;)

If you do not want to install Diversion, then install the standalone Entware to try your Mosquito install. Just know that if you later want to use the additional scripts amtm supports, you will probably need to re-install everything again at that point.

Hint; install Diversion and let it install Entware and pixelserv-tls. You can disable Diversion immediately afterward. And install Mosquito then. ;)

  • #5

At this point I would say everything is harder than it should be. I know a little Linux probably enough to get me into trouble, but nothing more.
While what you propose may do what I am looking for, I can tell at a glance the instructions are too generic and missing too many parts to follow…

For example, back on the other page I am trying to still follow their somewhat dubious instructions…

Start scripts
Open telnet/ssh console and copy & past following scripts:

cat << EOF > /tmp/script_usbmount.tmp
if [ \$1 = «/tmp/mnt/MYPART» ]
then
ln -sf \$1 /tmp/opt
/opt/etc/init.d/rc.unslung start
fi
EOF
nvram set script_usbmount=»`cat /tmp/script_usbmount.tmp`»

cat << EOF > /tmp/script_usbumount.tmp
if [ \$1 = «/tmp/mnt/MYPART» ]
then
/opt/etc/init.d/rc.unslung stop
fi
EOF
nvram set script_usbumount=»`cat /tmp/script_usbumount.tmp`»

nvram commit
reboot

I have opened a telnet / ssh console and pasted the text in hit enter and it did nothing, so this would suggest that I need to put this text into a file something like a Windows batch file or a Linux script (.sh?) to make it run, only problem is I can’t create said file because nano doesn’t seem to be recognised by the Asus firmware Linux, in fact most Linux commands don’t seem to work, so while this person thinks this is a slam dunk instruction to follow, even something as simple as this is proving to be a chore even before I try to install Entware.

Then there is the little matter of running a script which I don’t know how to do. I did find this..
Set execute permission on your script:
chmod +x script-name-here.sh
To run your script, enter:
./script-name-here.sh

Which may work if I can open some kind of editor to paste the text to get it to work, but currently I am stuck at step 1.
Would appreciate you filling in the most basic and obvious blanks I am missing if you please could.

  • #6

Success (sort of)… Downloaded Asuswrt-Merlin 384.10 which has just been released and nano now works :D

Used nano to create the two scripts (took a guess at where to split between the two scripts, and modified the MYPART to the RouterUSB) and called them USBmount.sh and USBumount.sh
Run the chmod command chmod +x USBmount.sh and chmod +x USBumount.sh to make them executable
Typed ls -la to check the attributes had changed…
and then run USBmount.sh by typing ./USBmount.sh
finally I run… wget -O — http://bin.entware.net/armv7sf-k2.6/installer/generic.sh | sh and this time I had success I now have Entware installed. Not sure if it is running…

Found this on the Asuswrt section.
Install on asuswrt merlin firmware
Alexander Ryzhov edited this page on Mar 15, 2018 · 2 revisions

Entware installer is included into firmware since 384.4 Beta 3.

Run entware-setup.sh to start using Entware.

Million dollar question is where on the file system is entware-setup.sh????
Looked in folders, looked on the USB no sign to be found and still no idea how to install Mosquitto once I do find it.

I am hoping that this entware-setup.sh starts some kind of GUI that I can install Mosquitto from otherwise it would seem like I have wasted hours trying to install Entware.

Last edited:

  • #7

L&LD’s comment made the assumption that you were using Merlin’s fimrware which you weren’t at that time.

Now that you are I believe you can just SSH into the router and type «entware-setup.sh». But as you have already installed a version of Entware you need to remove that first and start again. Remember to format your JFFS partition as well as removing Entware from your USB device.

When you went from stock Asus firmware to Merlin did you perform a factory reset afterwards? If not you need to do that now before you go any further.

Don’t

then reload an old «save settings» backup from a previous firmware.

Last edited:

XIII

XIII

Very Senior Member


  • #8

Million dollar question is where on the file system is entware-setup.sh????

/usr/sbin/entware-setup.sh

  • #9

L&LD’s comment made the assumption that you were using Merlin’s fimrware which you weren’t at that time.

Now that you are I believe you can just SSH into the router and type «entware-setup.sh». But as you have already installed a version of Entware you need to remove that first and start again. Remember to format your JFFS partition as well as removing Entware from your USB device.

When you went from stock Asus firmware to Merlin did you perform a factory reset afterwards? If not you need to do that now before you go any further.

Don’t

then reload an old «save settings» backup from a previous firmware.

I have actually gone from the factory firmware to the AsusWRT 384.9 back to the factory firmware back to AsusWRT384.10 (which gave me nano) where I am currently on 384.10
I just used the firmware tool in the router to do all the upgrades and every time it carried the settings back over onto the new firmware, I haven’t needed to reload the settings file to get my settings back.

I just tried to install this on the router:
How to install on Asuswrt-Merlin
Enter this into your favorite SSH terminal:
/usr/sbin/curl -Os https://raw.githubusercontent.com/decoderman/amtm/master/amtm && sh amtm

Nothing happened…
And there is nothing in this folder to start.
How to start amtm after installation
Enter this into your SSH terminal:
/jffs/scripts/amtm

So this option would seem like a bust. So far I seem to have managed to install Entware but don’t even know if I have managed to start the service. I have tried putting services-start.sh in the jffs/services folder but when I type top or ps I see no signs of it being there as a service.

I have spent all day trying to install this Entware and I am no closer to getting Mosquitto installed on the router. Is this Entware absolutely necessary to install Mosquitto because I don’t know how many more hours I can waste trying to get to step one of the process.

  • #10

Entware isn’t a service so you won’t see it running. Entware is a package manager that allows you to install other software.

If you look at the wiki for installing Entware the «easy way» on Merlin that is what you should have seen. It’s literally one command. There’s no need to manually create or edit files. If you followed other instructions it’s likely that Entware has not installed properly. That is why I suggested you reformat your JFFS partition (Administration -> System) and install it properly.

If you want to enable the running of user scripts they must be enabled at Administration -> System on the webui.

After installation of Entware you can type «opkg» on the command line to verify that it’s working.

  • #11

/usr/sbin/entware-setup.sh

That just reinstalled the software exactly like the first time. (at least I know where to find the set up file now)

This is the bit that has me pulling my hair out…
Info: Add /opt/bin & /opt/sbin to your PATH variable
Info: Add ‘/opt/etc/init.d/rc.unslung start’ to startup script for Entware services to start

the moment you try type cd opt it redirects you to the USB stick
me@myrouter:/tmp/mnt/usbstickname/entware#
so I ls- la to see what is there, no opt folder so I look for the next closest folder and cd /etc cd /init.d
to finally get to me@myrouter:/tmp/mnt/usbstickname/entware/etc/init.d# where I ls -la again and see the rc.unslung file.

Now I have searched and searched to see which files start the scripts and the only thing that seems to work on this firmware (plently of other reference folder that just aren’t there)
is the instruction to put services-start in the /jffs/scripts folder.
So I created the file adding services-start.sh in the folder with the following content

#!/bin/sh
/tmp/mnt/usbstickname/etc/init.d/rc.unslung start

saved and restarted several times but had no joy in starting the service…. HOWEVER now that the software has reinstalled I now have three files in that folder I never had before post-mount, services-start, and services-stop all in yellow.

I type nano service-start to see what is in there and I get:

#!/bin/sh
RC=’/opt/etc/init.d/rc.unslung’

i=30
until [ -x «$RC» ] ; do
i=$(($i-1))
if [ «$i» -lt 1 ] ; then
logger «Could not start Entware»
exit
fi
sleep 1
done
$RC start

Since rc.unslung is not in the /opt/etc/init.d/ folder I am going to add the path to where I found it /tmp/mnt/usbstickname/etc/init.d/rc.unslung and try reboot the router again to see if it picks it up this time. I might even try to reboot as is since this file has never been in this folder before now.

  • #12

/opt is a symbolic link to where you installed Entware on your USB disk. So in your case /opt is the same as /tmp/mnt/usbstickname/entware. So you should be using /opt

not

/tmp/mnt/usbstickname/entware.

  • #13

Entware isn’t a service so you won’t see it running. Entware is a package manager that allows you to install other software.

If you look at the wiki for installing Entware the «easy way» on Merlin that is what you should have seen. It’s literally one command. There’s no need to manually create or edit files. If you followed other instructions it’s likely that Entware has not installed properly. That is why I suggested you reformat your JFFS partition (Administration -> System) and install it properly.

If you want to enable the running of user scripts they must be enabled at Administration -> System on the webui.

After installation of Entware you can type «opkg» on the command line to verify that it’s working.

already enabled the scripts in the GUI. Just tried opkg (the missing link I have been searching for) and I got presented with a whole heap of options. If I am not mistaken this is a menu for Entware. I really hope so.

Unfortunately opkg list give me a verbose list from p all the way to z, I need to see the packages that are from A — P.

  • #14

opkg update
opkg list mosquitto*

  • #15

The answer was staring me in the face the whole time…

https://github.com/dersimn/owrtwifi2mqtt

Install the MQTT client
Install the packages

  • mosquitto-client
  • coreutils-nohup

with either luci or opkg.

All I needed was the key word OPKG to then find out there was an install option for me to simple type opkg install mosquitto-client and it work.
I’m not sure if opkg would still work without Entware, I really hope it doesn’t because I would hate to find out I spent the whole day chasing my tail with the answer virtually in front of me.

  • #16

I’m not sure if opkg would still work without Entware, I really hope it doesn’t because I would hate to find out I spent the whole day chasing my tail with the answer virtually in front of me.

No it wouldn’t. opkg is Entware.

  • #18

No it wouldn’t. opkg is Entware.

Good all that pain wasn’t for nothing.

  • #19

Step two was just like step one…

me@myrouter:/jffs/scripts# opkg install coreutils-nohup
Installing coreutils-nohup (8.30-1) to root…
Downloading http://bin.entware.net/armv7sf-k2.6/coreutils-nohup_8.30-1_armv7-2.6.ipk
Installing coreutils (8.30-1) to root…
Downloading http://bin.entware.net/armv7sf-k2.6/coreutils_8.30-1_armv7-2.6.ipk
Configuring coreutils.
Configuring coreutils-nohup.
me@myrouter:/jffs/scripts#

On a roll now, hopefully the rest of the instructions go easy.

Copy over the script
Use SCP to copy the presence_report script to /usr/bin/presence_report on the target device. Call chmod u+x /usr/bin/presence_report to allow script execution.

Add the script to rc.local
Place the following lines

  • nohup /usr/bin/presence_report event 192.168.1.2 >/dev/null 2>&1 &
  • nohup /usr/bin/presence_report lastseen 192.168.1.2 >/dev/null 2>&1 &

inside the /etc/rc.local file before the exit 0. You can to this via command-line or via LuCI in System -> Startup -> Local Startup. The script will be executed after reboot.

Usage
After installation the following topics will be published for each WiFi device, using the lowercase MAC address:

owrtwifi/status/mac-00-00-00-00-00-00/lastseen/iso8601

Payload contains the timestamp when the device was seen in an ISO 8601 (and OpenHAB) compatible format, like this: 2017-08-25T19:29:57+0200

owrtwifi/status/mac-00-00-00-00-00-00/lastseen/epoch

Unix epoch in seconds

owrtwifi/status/mac-00-00-00-00-00-00/event

Message will be new or del and is sent right after the device connected/disconnected to/from WiFi.

  • #20

Those instructions are for OpenWRT not Asuswrt so you’ll have to modify them accordingly.

/usr/bin is not a writable location. User scripts normally go in /jffs/scripts.

There’s no direct equivalent to rc.local so you’ll probably have to create a startup script and put it in /opt/etc/init.d.

EDIT: Glancing at the presence_report script I can see that it uses OpenWRT specific commands to query the wireless devices. These commands don’t exist in Asuswrt so this script will have to be rewritten using different commands.

Самый простой и удобный протокол для управления различными “умными” устройствами, на мой взгляд – это MQTT. На этом сайте Вы можете найти перечень публичных облачных MQTT-серверов (брокеров), с помощью которых можно связать один или несколько микроконтроллеров с устройствами управления (например смартфоном) или даже между собой. Но использование только публичных MQTT-брокеров не всегда удобно, например когда требуется обмен информацией между разными микроконтроллерами в пределах одной локации. Например: у меня на даче сведения о уличной температуре и влажности собирает гаражная метеостанция, а использует эти данные не только она, но и множество других устройств – управление вентиляцией, отоплением, подогревом погреба и т.д. Конечно, можно натекать на каждое устройство свои автономные “уличные” датчики, но это лишние датчики, провода, выводы; да и датчик далеко не всегда можно разместить так, чтобы он давал правильные показания. А через MQTT брокер это сделать не сложно – нужно только подписаться на любом устройстве на данные метеостанции и всё, получай данные. Проблемы начинаются, когда пропадает доступ к сети интернет, и это бывает к сожалению, не редко. В таком случае устройства уже не могут обмениваться информацией между собой и вся схема рушится. Если с погодными данными можно как-то смирится, то данные о срабатывании охранных и аварийных сенсоров должны распространяться между устройствами практически мгновенно. Очевидное решение описанной проблемы – использовать локальный брокер. Вторая причина, по которой стоит установить свой личный брокер – временные задержки при обмене информацией между устройствами. И третья не очень очевидная выгода от использования локального брокера – возможность избавиться от необходимости создания защищенного (TLS) соединения между устройствами и сервером, ведь эти подключения будут происходить только за NAT-ом. Недостаток тоже имеется – “просто так” подключиться со смартфона к локальному брокеру вне сети не получится, но эту проблему можно решить.

1. На базе Raspberry Pi. Самый очевидный вариант. Можно довольно просто развернуть на “малинке” образ какого-нибудь linux-а, установить mosquitto или его аналог и пользоваться в свое удовольствие. Мощности малинки хватит с запасом. А как вариант можно развернуть на ней полноценную систему “умного дома” типа Home Assistant (или другую, вариантов много), тогда Вы автоматически получаете связанный с умным домом MQTT-брокер, и “велосипед изобретать” не потребуется. Но мне “умный дом” не приглянулся вовсе, я предпочитаю создавать маленькие автономные устройства, решающие четко ограниченные задачи; а объединять их все только на уровне панели управления MQTT. Кроме того, в этом варианте меня напрягла необходимость покупать и постоянно кормить электричеством (хоть и относительно немного) отдельное устройство.

2. На базе ESP8266. Существует проект esp_mqtt, который позволяет создать на базе ESP8266 маленький MQTT-брокер. Достоинства: маленький размер и малое энергопотребление. Правда и ограничений в этом случае довольно много – в частности по количеству клиентов и хранимых сообщений. Можно наплодить из ESP целую кучку таких брокеров и создать разветвленную сеть. Я рассматривал это как “запасной вариант”.

2. На базе домашнего роутера. Но зачем покупать лишнее устройство, если можно поставить MQTT брокер на домашний роутер, ведь роутер всё равно нужен и к тому же работает круглые сутки. Существуют прошивки для многих роутеров на базе OpenWRT, куда можно поставить что угодно. Правда мне не хотелось перепрошивать свой роутер кастомной прошивкой, ведь в случае ошибки можно превратить роутер в кирпичик с лампочками. Да и, судя по отзывам, OpenWRT не всегда так удобна, как родная прошивка роутера. Но сейчас на Keenetic-и добавили поддержку “Менеджера пакетов OPKG“, и теперь не требуется перепрошивать роутер, чтобы получить возможность устанавливать на него дополнительные пакеты. OPKG — это свободно распространяющийся менеджер пакетов для встраиваемых систем. Вот этой возможностью мы и воспользуемся.


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

1. Роутер Keenetic с поддержкой OPKG. Насколько я понял из официальной инструкции, это могут быть следующие модели: Keenetic Omni (KN-1410), Keenetic Extra (KN-1710/1711), Keenetic Giga (KN-1010), Keenetic Ultra (KN-1810), Keenetic Viva (KN-1910), Keenetic Giant (KN-2610), Zyxel Keenetic II / III, Zyxel Keenetic Extra, Zyxel Keenetic Extra II, Zyxel Keenetic Giga II / III, Zyxel Keenetic Omni, Zyxel Keenetic Omni II, Zyxel Keenetic Viva, Zyxel Keenetic Ultra, Zyxel Keenetic Ultra II, а также Keenetic DSL (KN-2010), Duo (KN-2110) и Zyxel Keenetic DSL, LTE, VOX.
Следует иметь в виду, что младшие модели с небольшим объемом RAM и слабым процессором могут просто не потянуть дополнительную нагрузку в виде mosquitto, особенно если роутер уже нагружен большим объемом передаваемого трафика. У меня уже имелся достаточно мощный Keenetic Giga с двухядерным процессором и 256MB RAM. Старый Keenetic 4G не тянул не только OPKG, но даже и кастомную OpenWRT. Поэтому, когда пришло время менять роутер на даче, я даже не задумывался, какую модель выбрать – купил точно такую же Giga. Да, это достаточно дорогой выбор, но “любишь кататься, люби и бензин покупать”… Поэтому процесс установки будет описан именно для нее. Думаю, что для других моделей Keenetic процесс установки практически не будет отличаться от описанного.
PS: Я вполне допускаю, что роутеры других производителей ещё круче и лучше, и так же допускают установку пакетов OpenWRT “из коробки” – но эта статья не про них.

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

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

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

Заходим в панель управления (“админку”) роутера. Находим раздел “Управление” – “Общие настройки” – “Обновления и компоненты”. Нажмите кнопку “Изменить набор компонентов”:

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

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

  • Пакеты OPKG / Поддержка открытых пакетов – Система управления пакетами на основе OPKG. Основной компонент, что нам требуется.
  • Пакеты OPKG / Модули ядра для поддержки файловых систем – Поддержка различных файловых систем для OPKG.
  • USB-накопители / Файловая система Ext – Необходим для работы с файловой системой Ext на USB-накопителях.
  • USB-накопители / Общий доступ к файлам и принтерам (TSMB CIFS) – Предоставляет доступ к USB-накопителям и принтерам для компьютеров под управлением Windows. необходим будет, чтобы иметь возможность подключаться к флешке по сети и копировать на нее или с нее файлы, редактировать файл конфигурации mosquito.
  • Базовые компоненты / Сервер SSH – Позволяет безопасно подключаться к командной строке устройства. Это нам потребуется. Я не на 100% уверен, что именно этот компонент будет задействован впоследствии, по подключаться к командной строке придется. Поэтому лучше поставить, не убудет.

Остальные компоненты – по желанию и необходимости (если Вы ещё ничего не меняли). Не забываем нажать кнопку “Установить обновление” внизу, ждем несколько минут, пока роутер скачает необходимые пакеты, установит их и перезагрузится. А в это время можно заняться подготовкой USB-накопителя…


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

Как я уже написал выше, для установки OpenWRT-пакетов на Keenetic необходимо предварительно подготовить внешний USB-накопитель и установить на него систему пакетов репозитория Entware. Повторю здесь цитату из официальной инструкции: Для использования пакетов OPKG необходим USB-накопитель, подключенный к интернет-центру. Диск должен быть отформатирован в файловой системе EXT. Мы рекомендуем использовать современную и актуальную журналируемую файловую систему EXT4. Для работы накопителей с EXT4 в роутере Keenetic должен быть установлен компонент “Файловая система Ext”.

Небольшое примечание: в инструкции по установке Asterisk на роутер настойчиво рекомендуют использовать файловую систему EXT2, чтобы снизить износ Flash-памяти. Хм, теперь я не уверен в том, что EXT4 это оптимальный выбор для OPKG, но все-таки я отформатировал флешку, как описано в “основной” инструкции. Какую ФС предпочтете Вы – решать Вам. Я не думаю, что с EXT2 OPKG будет хуже работать.

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

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

Не забудьте нажать кнопку “Apply” слева внизу (применить внесенные изменения). Ждем, довольно долго… 32GB форматируется больше получаса. После форматирования Windows “не видит” эту флешку, так что на нее напрямую ничего скопировать не получится. Вставляем подготовленную флешку в порт Keenetic-а. Заходим в интерфейс Keenetic и убедимся, что накопитель доступен. Для этого необходимо отрыть раздел “Управление” – “Приложения“:

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

Теперь нужно подключить этот накопитель к приложению “Сеть Windows“, дабы иметь возможность скопировать на него файлы по сети. Находим приложение “Сеть Windows” на этой же странице, только ниже и кликаем по его названию:

Активируем приложение “Сеть Windows”

Убедимся, что доступ к диску по сети имеется, при необходимости можно настроить доступ с помощью кнопки “Добавить общий ресурс”:

Настройка приложения “Сеть Windows”

На компьютере с помощью файлового менеджера открываем диск по сети (в ОС Windows можно использовать Проводник) “Сеть > Ваш Роутер > Ваш ресурс” и убеждаемся, что всё успешно работает.

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

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


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

Инструкция на сайте keenetic. Для моделей Omni (KN-1410), Extra (KN-1710/1711), Giga (KN-1010), Ultra (KN-1810), Viva (KN-1910), Giant (KN-2610) и Zyxel Keenetic II / III, Extra, Extra II, Giga II / III, Omni, Omni II, Viva, Ultra, Ultra II используйте для установки архив mipsel – mipsel-installer.tar.gz.

Для моделей DSL (KN-2010), Duo (KN-2110) и Zyxel Keenetic DSL, LTE, VOX используйте для установки архив mips – mips-installer.tar.gz

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

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

В веб-интерфейсе роутера перейдите на страницу “Настройка” – “OPKG” для выбора накопителя. Выберите накопитель, в поле “Сценарий initrc” добавьте opt/etc/init.d/rc.unslung, после чего сохраните изменения.

Настройка OPKG

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

Системный журнал

PS: Официальная инструкция: Установка системы пакетов репозитория Entware на USB-накопитель.


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

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

Запускаем, выбираем режим SSH, указываем адрес Вашего роутера (у меня он несколько “нестандартный”, так как несколько роутеров объединены в сеть) и порт 222, как на рисунке:

PUTTY

На страшный запрос о добавлении сертификата сервера в кеш обязательно отвечаем “Да”, после чего появится черное-черное окно терминала в черной-черной комнате. На запрос login as вводим root, на запрос пароля вводим keenetic (в пароле вводимые символы никак не отображаются):

login as: root
root@192.168.111.1's password: keenetic

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

Терминал Entware

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

Смена пароля

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

~ # opkg update
Downloading http://bin.entware.net/mipselsf-k3.4/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware
Downloading http://bin.entware.net/mipselsf-k3.4/keenetic/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/keendev
~ #

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

~ # mc
-sh: mc: not found
~ # opkg install mc
Installing mc (4.8.26-1b) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/mc_4.8.26-1b_mipsel-3.4.ipk
....
Configuring libiconv-full.
....
Configuring mc.
~ # mc

Midnight Commander

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


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

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

Основной список пакетов для mipsel Дополнительный список пакетов Keenetic для mipsel

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

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

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

~ # opkg install mosquitto-ssl
Installing mosquitto-ssl (2.0.10-1) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/mosquitto-ssl_2.0.10-1_mipsel-3.4.ipk
Installing zlib (1.2.11-3) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/zlib_1.2.11-3_mipsel-3.4.ipk
Installing libopenssl (1.1.1k-1) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/libopenssl_1.1.1k-1_mipsel-3.4.ipk
Installing libcap (2.48-1) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/libcap_2.48-1_mipsel-3.4.ipk
Installing libwebsockets-openssl (4.1.6-1) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/libwebsockets-openssl_4.1.6-1_mipsel-3.4.ipk
Installing cJSON (1.7.14-3) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/cJSON_1.7.14-3_mipsel-3.4.ipk
Configuring libcap.
Configuring zlib.
Configuring libopenssl.
Configuring libwebsockets-openssl.
Configuring cJSON.
Configuring mosquitto-ssl.
~ #

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


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

Файл конфигурации mosquitto находится в каталоге /opt/etc/mosquitto/ и называется mosquitto.conf. В большинстве инструкции авторы советуют оставить этот файл неизменным, а все настройки выполнять в отдельном файле (прилинковав его к первому), мотивируя это тем, что так удобнее (на самом деле так решил только первый, настоящий автор, а остальные просто тупо скопипастили, не задумываясь). Мне этот подход показался не удобным и я сделал по другому – оригинальный файл скопировал с переименованием в mosquitto.default (дабы иметь возможность вернуть оригинал, если накосячу), а все настройки выполнял в основном файле, попутно переводя транслейтом не совсем понятные мне места.

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

~ # adduser mosquitto
Changing password for mosquitto
New password: ***********
Bad password: too weak
Retype password: ***********
passwd: password for mosquitto changed by root
~ #

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

# When run as root, drop privileges to this user and its primary
# group.
# Set to root to stay as root, but this is not recommended.
# If set to "mosquitto", or left unset, and the "mosquitto" user does not exist
# then it will drop privileges to the "nobody" user instead.
# If run as a non-root user, this setting has no effect.
# Note that on Windows this has no effect and so mosquitto should be started by
# the user you wish it to run as.
user mosquitto

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

~ # mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d
~ # ps
  PID USER       VSZ STAT COMMAND
    1 root      1100 S    init
 .........................
 1079 mosquitt  7264 S    mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d
 1080 root      3880 R    ps

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

2. Добавляем mosquitto в автозагрузку при включении или перезапуске роутера. Для этого необходимо создать скрипт в каталоге /opt/etc/init.d с названием Smosquitto. Префикс “S” означает, то данный скрипт будет включён в автозапуск (префикс “K” означает, то данный скрипт будет исключён из автозапуска). Удобнее всего это сделать с помощью mc:

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

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

#!/bin/sh
PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin 
mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf

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

3. Создаем рабочие каталоги или разрешаем доступ к уже существующим. Для нормальной работы mosquitto потребуется иметь доступ на запись как минимум в два каталога (а на первых порах лучше в три). Поскольку мы будем запускать брокер от пользователя с “не root”, права на доступ к файлам и папкам у него будут минимальными – только на чтение (по большей части, исключение составляет каталог пользователя). Поэтому придется вначале вручную создать необходимые директории и разрешить пользователю mosquitto доступ к ним.

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

  • /opt/etc/mosquitto [чтение и выполнение] – Этот каталог будет создан автоматически при установке. Здесь находятся файл конфигурации, позже я добавил файл со списком пользователей, файл со списком разрешений, служебные скрипты (перезапуск например). Ничего дополнительно настраивать не требуется.
  • /opt/etc/mosquitto/persistence [полный доступ, владелец] – Этот каталог предназначен для хранения базы данных брокера. Можно, конечно, обойтись и без этого, но тогда все retained сообщения будут потеряны при случайной перезагрузке роутера или отключении электричества. Для того, чтобы брокер мог беспрепятственно создавать файлы и писать туда данные, дадим полный доступ.
  • /opt/var/log [чтение, запись и поиск (выполнение)] – сюда будем писать журнал. На первых порах он гораздо удобнее системного журнала. Потом, когда всё отлажено, чтобы не следить за размером файла, можно оставить вывод сообщений только в системный журнал роутера. Хотя, в принципе, ничто не мешает писать логи в другой каталог, например /opt/etc/mosquitto/log
  • /opt/var/run [чтение, запись и поиск (выполнение)] – а в этом каталоге сервер сохраняет pid-файл, который определяет, запущен процесс или нет. Сюда же роутер пишет другой похожий файл, так что здесь ему самое место.

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

Приступаем к настройке каталогов и раздаче прав. С собственно /opt/etc/mosquitto делать ничего не требуется – пользователь mosquitto по умолчанию имеет права на чтение и выполнение, а большего и не нужно. Переходим в этот каталог, создаем новый persistence и назначаем ему нового владельца:

~ # cd /opt/etc/mosquitto
~ # mkdir persistence
~ # chown -R :mosquitto persistence
~ # chown -R mosquitto persistence

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

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

~ # chmod 777 /opt/var/log
~ # chmod 777 /opt/var/run

Тут уж ничего не поделаешь – изменять владельца нельзя, добавить только пользователя mosquitto (как это можно сделать в виндах) – тоже. Ограничится только чтением + записью тоже не удалось (файлы не создавались). Пришлось давать все права и всем (777).

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

~ # touch /opt/var/run/mosquitto.pid
~ # touch /opt/var/log/mosquitto.log
~ # chown mosquitto:mosquitto /opt/var/run/mosquitto.pid
~ # chown mosquitto:mosquitto /opt/var/log/mosquitto.log

С одной стороны, это более правильный вариант. Команда touch создает пустой файл, затем с помощью команды chown меняем владельца данного файла на mosquitto. Единственный момент – после того, как любой из файлов будет удален “вручную” (например из-за большого размера файла журнала), потребуется вновь повторить данные команды.

4. Настраиваем mosquitto.conf. Файл конфигурации mosquitto.conf я полностью очистил и заполнил только теми значениями, которые я изменял. Просто “выдергивал” из заранее скопированного в отдельную папку “дефлотного” нужные мне параметры и вставлял в основной файл. Можно править этот файл по сети, но нужно иметь в виду что файл должен быть в кодировке UTF-8 с BOM. Можно править файл с помощью mc прямо в консоли роутера.

Первым делом нужно указать, на каком порту сервер будет “слушать” входящие подключения. Пока оставим один порт – 1883, без TLS. Честно говоря, в локальной сети TCP + TLS не очень то и требуется, ведь все соединения происходят только внутри за NAT-ом и в некоторой степени изолированы от внешнего интернета. Да, порт 1883 сервер слушает по умолчанию, без указаний сверху. Но если не указывать listener, то принимать входящие подключения он будет только со своего IP, а всех остальных “пошлет лесом”. Подключения по WebSocket я тоже отключил, за ненадобностью. Итак:

# =================================================================
# Listeners
# =================================================================

# Порт без SSL
listener 1883
protocol mqtt

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

# =================================================================
# General configuration
# =================================================================

# Пользователь, от имени которого будет запущен mosquitto
user mosquitto

# Файл идентификатор запущенного сервиса
pid_file /opt/var/run/mosquitto.pid

# Разрешить сохраняемые сообщения
retain_available true

# Лимит кучи (оставил на будущее)
memory_limit 0

# Разрешить подключение без указания идентификатора клиента
allow_zero_length_clientid true
auto_id_prefix auto-

# Удалять подключения старше 1 месяца
persistent_client_expiration 1m

# Помещать сообщения QoS0 в очередь
queue_qos0_messages false

# Интервал публикации системной информации
sys_interval 60

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

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

# =================================================================
# Persistence
# =================================================================

# Разрешить сохранение базы данных на диске
persistence true

# Каталог для хранения локальной базы данных
persistence_location /opt/etc/mosquitto/persistence
# Имя файла локальной базы данных
persistence_file mosquitto.db

# Интервал записи данных на диск в секундах
autosave_interval 1800
# Сохранять по интервалу времени (true - по количеству изменений)
autosave_on_changes false

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

# =================================================================
# Logging
# =================================================================

# Вывод в консоль
log_dest stdout
# Вывод в системный лог роутера
log_dest syslog
# Вывод в файл
log_dest file /opt/var/log/mosquitto.log
# Вывод в системный топик
log_dest topic

# Какие типы сообщений следует писать в лог
log_type error
log_type warning
log_type notice
log_type information
log_type subscribe
log_type unsubscribe

# Выводить в лог события подключения клиентов
connection_messages true

# Выводить в лог метку времени
log_timestamp true
log_timestamp_format %Y-%m-%d %H:%M:%S

Ну и последний этап (ну не совсем, а до первого запуска) – указываем, как будет происходить авторизация клиентов на сервере. Я выбрал самый простой вариант – по логину и паролю, без всяких там плагинов и сертификатов.

# =================================================================
# Security
# =================================================================

#clientid_prefixes
# Запретить анонимные подключения
allow_anonymous false
# Имя файла с данными пользователей и паролями
password_file /opt/etc/mosquitto/mosquitto.users
# Имя файла с правами доступа к топикам
acl_file /opt/etc/mosquitto/mosquitto.acl

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

mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf

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

#!/bin/sh
PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin 
killall mosquitto
mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf

Назвать его можно как угодно, я обозвал без выкрутасов – restart. Очень экономит время при настройке. Действуйте по аналогии, как это описано выше для скрипта Smosquitto, можно даже просто создать копию с Smosquitto, а затем отредактировать.

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

mosquitto_passwd
mosquitto_passwd is a tool for managing password files for mosquitto.

Usage: mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c | -D] passwordfile username
       mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c] -b passwordfile username password
       mosquitto_passwd -U passwordfile
 -b : run in batch mode to allow passing passwords on the command line.
 -c : create a new password file. This will overwrite existing files.
 -D : delete the username rather than adding/updating its password.
 -H : specify the hashing algorithm. Defaults to sha512-pbkdf2, which is recommended.
      Mosquitto 1.6 and earlier defaulted to sha512.
 -U : update a plain text password file to use hashed passwords.

See https://mosquitto.org/ for more information.

Вам потребуется добавить как минимум одного пользователя в список пользователей брокера. С помощью этого аккаунта Вы будете подключаться к брокеру со смартфона и с Ваших устройств. Однако я настоятельно рекомендую Вам не ограничиваться одной учетной записью, а создать несколько разных учетных записей – отдельные учётки для смартфонов управления, и отдельные учётки для каждого из умных устройств. Во-первых при необходимости изменения единственного пароля (при утере смартфона, например), Вам придется поменять все пароли на всех устройствах сразу. А в случае разных учёток можно ограничится только удалением из списка скомпрометированной записи. Во-вторых, при разных учетных записях возможно настроить разные уровни доступа к топикам, что может быть полезно.

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

mosquitto_passwd -c -b /opt/etc/mosquitto/mosquitto.users логин пароль

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

mosquitto_passwd -b /opt/etc/mosquitto/mosquitto.users логин пароль

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

admin:$7$101$NUE9kyIRB4Ght9ub$qOzyqRAf5rRcVVddLoQbgplfRhbZFc8NLsrTy3jDsHli9Gq52cK6uSnRkQE0xHWKqNgYZV+sE27lv/Mzsm2phw==
test:$7$101$KrJjxaCUf2QeC9xt$wb2TMbbfb3ZUGqELgYFFPePQfSO63ARbrhBH5+cHZjHAtKAnObBsnqDvvWCcbMZ0coxMkGvcjYScLv00Gl/6GA==

Теперь нужно создать файл с правами доступа к топикам. Утилиты для этого никакой нет, да её и не требуется – это простой текстовый файл. Создайте его в mc. В нем для каждого пользователя должно быть две строчки вида:

user test
topic readwrite #

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

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

user <username>
topic [read|write|readwrite|deny] <topic>

Упомянутое здесь имя пользователя такое же, как в password_file. Это не clientid. Тип доступа контролируется с помощью «чтение», «запись», «чтение-запись» или «запретить». Этот параметр является необязательным (если <topic> не содержит пробела) - если не задан, то доступ осуществляется на чтение / запись. <topic> может содержать подстановочные знаки + или #, как в подписках. Параметр «deny» может использоваться для явного отказа в доступе к теме, который в противном случае был бы предоставлен более широким оператором чтения / записи / чтения и записи. Любые запрещенные темы обрабатываются перед тем, которые предоставляют доступ для чтения / записи.

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

user admin
topic readwrite #

user test
topic readwrite #

Этим самым мы дали полные права на все топики (пока так – потом я буду настраивать доступы гораздо более “тонко”). Далее нажимаем f2, на запрос имени файла вводим mosquitto.acl. Разумеется, имена пользователей должны соответствовать Вашим.

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

2021-05-09 08:26:43: mosquitto version 2.0.10 starting
2021-05-09 08:26:43: Config loaded from /opt/etc/mosquitto/mosquitto.conf.
2021-05-09 08:26:43: Opening ipv4 listen socket on port 1883.
2021-05-09 08:26:43: Opening ipv6 listen socket on port 1883.
2021-05-09 08:26:43: mosquitto version 2.0.10 running 

Теперь можно попробовать подключиться со смартфона или компьютера под любым из созданных пользователей. На данном этапе используем “прямое” подключение на порту 1883. Если всё было сделано правильно, подключение будет успешно выполнено, а в файле журнала должны появится следующие строки:

2021-05-09 08:54:47: New connection from 192.168.8.73:41352 on port 1883.
2021-05-09 08:54:47: New client connected from 192.168.8.73:41352 as mqttdash-03b55403 (p2, c1, k30, u'admin').
2021-05-09 08:54:49: Client mqttdash-03b55403 disconnected.

Ура! Заработало!


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

Как я уже говорил, в локальной сети TLS / SSL как бы не особо и нужен. Но он потребуется, если Вы захотите открыть порт брокера на роутере “наружу” (так называемый “проброс портов”) – в этом случае оставлять незащищенным канал управления умным домом, мягко говоря, рискованно. Да и внутри сети SSL-соединение не помешает. Я не буду подписывать созданный сертификат в центре сертификации CA, а создам самоподписанный сертификат (потому что “извне” подключаться к серверу не планирую. Однако Вы можете это сделать, например через LetsEncrypt.

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

~ # opkg install openssl-util
Installing openssl-util (1.1.1k-1) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/openssl-util_1.1.1k-1_mipsel-3.4.ipk
Installing libopenssl-conf (1.1.1k-1) to root...
Downloading http://bin.entware.net/mipselsf-k3.4/libopenssl-conf_1.1.1k-1_mipsel-3.4.ipk
Configuring libopenssl-conf.
Configuring openssl-util.
~ #

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

~ # cd /opt/etc/mosquitto
/opt/etc/mosquitto # mkdir certs
/opt/etc/mosquitto # cd certs
/opt/etc/mosquitto/certs #

3. Генерируем личный RSA ключ для личного “центра сертификации” (СА KEY) с помощью команды openssl genrsa -out mosq-ca.key 2048:

/opt/etc/mosquitto/certs # openssl genrsa -out mosq-ca.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
............................................+++++
.....................+++++
e is 65537 (0x010001)
/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. Программа запросит данные страны, региона, организации и другие данные (некоторые можно оставить пустыми), после чего будет создан файл сертификата:

/opt/etc/mosquitto/certs # openssl req -new -x509 -days 999 -key mosq-ca.key -out mosq-ca.crt
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Russian Federation
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:kotyara12
Email Address []:kotyara12@yandex.ru
/opt/etc/mosquitto/certs #

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

/opt/etc/mosquitto/certs # openssl genrsa -out mosq-serv.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
......................................................................................+++++
.................................................................+++++
e is 65537 (0x010001)
/opt/etc/mosquitto/certs #

6. Создаем запрос на подпись сертификата сервера (SERVER CSR). Этот запрос должен быть отправлен в центр сертификации, который после проверки личности автора возвращает сертификат. В данном случае я не буду этого делать, а создам сертификат, подписанный “своим” центром сертификации.

/opt/etc/mosquitto/certs # openssl req -new -key mosq-serv.key -out mosq-serv.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Russian Federation
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:k12village_mosquitto
Email Address []:kotyara12@yandex.ru

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456789
An optional company name []:
/opt/etc/mosquitto/certs #

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

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

/opt/etc/mosquitto/certs # openssl x509 -req -in mosq-serv.csr -CA mosq-ca.crt -CAkey mosq-ca.key -CAcreateserial -out mosq-serv.crt -days 999 -sha256
Signature ok
subject=C = RU, ST = Russian Federation, O = Internet Widgits Pty Ltd, CN = k12village_mosquitto, emailAddress = kotyara12@yandex.ru
Getting CA Private Key
/opt/etc/mosquitto/certs #

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

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

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

Поскольку мы создавали ключи и сертификаты, залогинившись в терминала под пользователем root, то и права на доступ к папке и файлам будет только у пользователя root. А сервер у нас запускается под ограниченным пользователем mosquitto. Если сейчас попытаться перезапустить брокер, то он не сможет подгрузить ключи и выдаст серию ошибок типа “в доступе отказано”. Что ж, это довольно легко поправить, выполнив команду:

chmod 777 /opt/etc/mosquitto/certs -R

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

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

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

# Порт SSL
listener 8883
protocol mqtt
cafile /opt/etc/mosquitto/certs/mosq-ca.crt
certfile /opt/etc/mosquitto/certs/mosq-serv.crt
keyfile /opt/etc/mosquitto/certs/mosq-serv.key

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

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

2021-05-10 08:12:34: mosquitto version 2.0.10 starting
2021-05-10 08:12:34: Config loaded from /opt/etc/mosquitto/mosquitto.conf.
2021-05-10 08:12:34: Opening ipv4 listen socket on port 1883.
2021-05-10 08:12:34: Opening ipv6 listen socket on port 1883.
2021-05-10 08:12:34: Opening ipv4 listen socket on port 8883.
2021-05-10 08:12:34: Opening ipv6 listen socket on port 8883.
2021-05-10 08:12:34: mosquitto version 2.0.10 running

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

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

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

2021-05-10 08:14:03: New connection from 192.168.8.73:48412 on port 8883.
2021-05-10 08:14:03: New client connected from 192.168.8.73:48412 as mqttdash-03b55403 (p2, c1, k30, u'admin').
2021-05-10 08:14:05: Client mqttdash-03b55403 disconnected.

Отлично! Теперь можно пробросить порты 1883 и 8883 на роутере наружу и попытаться подключиться к нашему серверу извне. Если Вы имеете белый IP-адрес… Или попробовать подключиться через Keenetic DNS.


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

Важно! Переадресация портов будет работать только в том случае, если интернет-центр использует белый (публичный) IP-адрес для выхода в Интернет. Дополнительную информацию вы найдете в статье “В чем отличие “белого” и “серого” IP-адреса?”.

Заходим в панель управления роутером в раздел “Сетевые правила” – “Переадресация” и добавляем правило, как на рисунке ниже:

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

Сохраняем. В настройках клиента меняем локальный адрес сервера “192.168.1.1” на тот, который Вам выдал Keenetic (что-то типа “xxx.keenetic.pro”) и пробуем подключиться. У меня всё заработало с первого раза. Единственное, что хотелось бы отметить – эту операцию нужно повторить для всех внешних сетевых интерфейсов, если их несколько (основной и резервный канал до интернета). Нужно ли дополнительно пробросить порт 1883 – решать только Вам. У меня получилось что-то вроде этого:

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

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


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

Проброс портов это хорошо, но не слишком удобно. Особенно, если у Вас есть несколько локаций, на каждой из которых стоит свой роутер со своим локальным брокером. В этом случае свести данные с устройств на одну панель управления не получится. Гораздо удобнее настроить мост между нашим локальным брокером, и любым другим внешним облачным MQTT-брокером. В этом случае смартфоны управления мы будем настраивать на работу с облачным брокером, ESP – на работу с локальным адресом, ну а локальный брокер будет автоматически подключаться к нему и перенаправлять данные туда и обратно. Можно даже сделать сложную структуру так, чтобы данные вначале отправлялись на какой-либо “главный локальный” брокер, а затем уже на облачный брокер в интернете (правда я пока не знаю, зачем такое может быть нужно).

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

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

mosquitto_passwd -b /opt/etc/mosquitto/mosquitto.users bridge 11111111

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

user bridge
topic readwrite #

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

# =================================================================
# Bridges
# =================================================================

# Имя мостового соединения
connection wqtt_ru
# Имя сервера и порт для внешнего брокера
address x65535.wqtt.ru:1003
# Какие топики и в каком направлении следует пересылать: в данном случае всё (только для примера, в раельном соединении не рекомендуется: может вызвать зацикливание)
topic # both
# Тип запуска: автоматический
start_type automatic
# Версия протокола (мой удаленный брокер требует этот протокол)
bridge_protocol_version mqttv311
# Если установлено true, публиковать уведомления для локальных и удаленных брокеров с информацией о состоянии мостового соединения
notifications true
# Параметры локального подключения
local_clientid bridge_local
local_username bridge
local_password 11111111
# Параметры удаленного подключения
remote_clientid bridge_remote
remote_username U_WQTT_RU
remote_password 22222222
# Отписываться на внешнем брокере от тем "наружу"
bridge_attempt_unsubscribe true
# Чистая сессия отключена
cleansession false
# Интервал поддержания соединения в секундах
keepalive_interval 60
# Интервал, после которого неактивный мост будет остановлен
idle_timeout 600

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

Перезапускаем локальный брокер, проверяем. Работает! Но – без SSL, что не есть гуд.


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

Для работы SSL необходим сертификат удаленного сервера, точнее корневой сертификат удостоверяющего центра, с которого по цепочке будут проверены все остальные сертификаты. На роутере сертификат удостоверяющего центра для wqtt.ru уже имеется в каталоге /etc/ssl/certs под именем ISRG_Root_X1.crt, так что ничего скачивать и генерировать не потребуется. Мало того, роутер сам позаботится об его обновлении, когда необходимо. Осталось немного подкорректировать файл конфигурации:

......
# Имя сервера и порт для внешнего брокера: здесь меняем порт на SSL
address x65535.wqtt.ru:1004 
# Сертификат CA (корневой в цепочке сертификатов) внешнего брокера
bridge_cafile /etc/ssl/certs/ISRG_Root_X1.crt
......

Перезапускаем брокер, проверяем. Connecting bridge wqtt_ru (x65535.wqtt.ru:1004), всё в порядке.

Поздравляю, Вы только что настроили свой личный MQTT сервер с SSL, бесплатно и навсегда!


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


На этом пока всё, до встречи на сайте и на telegram-канале!. Если Вам понравилась статья – кликните на любое рекламное объявление, этого будет вполне достаточно для поддержки автора.

🔶 Полный архив статей вы найдете здесь

Введение

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

Многие статьи или инструкции, которые есть в интернете, в части работы с InfluxDB и Telegraf – имеют отношения к довольно старым версиям рассматриваемого ПО, в виду чего у меня ушло какое-то время, чтобы со всем разобраться. Хотелось бы оставить небольшое обновление по инструкциям здесь, возможно, они помогут кому-то сэкономить время и нервы, так как информация агрегирована в виде summury моего погружения в реализацию данного решения. 

Значит понадобилось, как оно водится, по работе, часто взаимодействовать с Linux: CentOS/RHEL, Debian/Ubuntu Server и даже с немного специфичным Clear Linux, специально собранный под процессоры Intel, что дает прирост в производительности во многих бенчмарках (например, тык).

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

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

Состав и описание решения

Рассмотрим состав решения:

Схема взаимодействия компонентов ПО

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

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

  2. Mosquitto MQTT broker.

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

  3. Telegraf.

    Чтобы получить информацию от MQTT брокера, также необходим клиент, который подписывается на топики брокера для получения данных, реализуя тем самым паттерн Издатель-подписчик (англ. publisher-subscriber или англ. pub/sub). Для этого и используется Telegraf. Он, как клиент-подписчик, прослушивает заданные MQTT топики и, получив сообщение, сразу же записывает информацию в InfluxDB. Вообще, Telegraf – это не только MQTT клиент. Telegraf – это серверный агент для сбора, обработки, агрегирования и записи метрик из различных стеков, датчиков и систем в InfluxDB.

  4. InfluxDB.

    InfluxDB – это система баз данных, оптимизированная для предоставления данных временных рядов и их хранения в привязке ко времени и значению (иными словами база данных временных рядов (time series database – TSDB)), разработанная компанией InfluxData.

    И немного про временные ряды и их данные.

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

    В InfluxDB есть встроенный конструктор дашбордов для визуализации – Chronograf, на котором можно было бы и остановиться, но он больше сделан для быстрого прототипирования дашбордов и проверки отображения тех или иных метрик в том или ином виде в самой InfluxDB. Гораздо удобнее использовать платформу Grafana, которая является плюс минус стандартном в вопросах визуализации (особенно в сфере IoT). Для этого будет настраиваться интеграция в Grafana на подключение к InfluxDB.

  5. Grafana.

    Grafana – программное обеспечение с открытым исходным кодом, позволяющее запрашивать, визуализировать и исследовать метрики (данные), где бы они ни хранились. По сути, предоставляет пользователю инструменты для преобразования информации из базы данных временных рядов (TSDB) в удобные графики и визуализации.

  6. Node-RED*.

    Это инструмент визуального программирования для интернета вещей, позволяющий подключать друг к другу устройства, API и онлайн-сервисы. Выступает в роли многофункцильного бекэнда с поддержкой множества интерфейсов и протоколов. 

    Звездочка здесь стоит только потому, что данный компонент не обязателен, но всегда должна быть альтернатива, и Node-RED позволяет собирать и передавать данные альтернативным от Telegraf способом, имея мощный функционал промежуточной обработки.

  7. WireGuard.

    Современный VPN-протокол. Необходим, чтобы подключаться к нашему серверу из любой точки через домашнюю сеть. Приятное дополнение – это возможность шифровать трафик в любой публичной Wi-Fi сети без существенных ограничений по скорости и задержкам.

На чем все запускать?

Сердце домашнего сервера и обитель всех рассматриваемых программных компонентов в моем случае – мини-пк Beelink U59 в конфигурации 16(8+8)RAM/512SSD на базе процессора Intel Celeron N5095. Таких характеристик хватит с запасом под разные задачи. Получается отличный вариант по качеству, производительности, сборке. Особенно в контексте цены – 250$, а если еще и распродажа, сами понимаете. На борту есть гигабитный Ethernet-порт и Wi-Fi 5 (ac). И все это в очень компактном корпусе.

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

Изначально думал взять какой-нибудь микрокомпьютер, а-ля Raspberry Pi 4 или что-то похожее. Но против тех.спеки не попрешь: U59 на мой взгляд гораздо производительнее и удобнее под рассматриваемые задачи, а стоит аналогично Pi 4. (Если говорить о производительности, то тот же Geekbench на U59 показывает 710/2312 (тык) против 337/877 на Pi 4 (тык) 

Ознакомиться с подробными техническими характеристиками и отзывами можно по ссылке (тык), а выглядит он вот так:

Вы можете поступить аналогичным образом и раздобыть себе такой же или аналогичный мини-пк. Возможно, перепрофилировать какой-нибудь старый ноутбук или компьютер под эти задачи, или, в конце концов, развернуть виртуальную машину с характеристиками: 1GB RAM/ 1 CPU / 15GB (HDD/SSD). Есть решения, которые позволяют стартовать виртуальные машины при старте системы в фоновом режиме, без какого-либо интерфейса. А чтобы система при старте на помирала, можно настроить отложенный автозапуск. (Знаю, что у Hyper-V или VMware это есть). 

В моем случае U59 стоит рядом с роутером, подключенный к нему по проводу. IP-адрес выдается DHCP-сервером. Итоговая общая схема получается следующая:

На этой схеме дополнительно появляются два блока, которые мы настроим в самом конце статьи. 

Функция «Динамический DNS» (Dynamic DNS / DDNS) позволяет присвоить постоянное доменное имя (адрес для доступа из интернета) публичному IP-адресу, который роутер получает от интернет-провайдера. Публичный IP-адрес может поменяться, а доменное имя, которые вы зарегистрируете – нет. (есть сервисы, позволяющие сделать это бесплатно и вне ПО роутера, рассматриваемого в данной статье). Это будет необходимо для того, чтобы получать доступ к устанавливаемым сервисам через интернет с любого устройства по доменному имени. И порядком упростить конфигурацию, потому что не нужно прописывать конкретный IP адрес в различных конфигурациях ПО.

Далее, Port Forwarding (или Virtual Server) – настройка для WAN-интерфейса (который отвечает за подключение к интернету), позволяющая извне (через интернет) обращаться к конкретным клиентам локальной сети (например, к нашему мини-пк) по определенному порту приложения. 

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

Установка и настройка ОС

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

В качестве основной ОС будет использоваться Linux Debian 12.1. 

Так как Debian поддерживает три модели выпуска своих ОС «стабильный», «тестируемый», «нестабильный», был выбран второй, так как хотелось иметь более свежие версии ядра и пакетов устанавливаемого ПО. (подробное описание есть на сайте: тык). 

Остается скачать netinst iso-образ для платформы amd64, потому что он содержит минимально необходимый набор базового устанавливаемого ПО. А все пакеты в процессе установки будут загружены из сети, что дает самую актуальную версию ОС и пакетов (ссылочка на образ, чтобы не искать: тык). 

Если при установке возникают ошибки (а такое бывает на тестовых сборках, но редко) вот ссылка на стабильный образ: Linux Debian 12.1 stable: -> тык <-

Процесс установки описывать не буду, он достаточно простой даже для новичков (почти все этапы требуют простого нажатия enter). Пара моментов, которые хотел бы отметить: если устанавливаете через виртуальную машину — обязательно используйте режим bridge (режим моста или сетевого моста), чтобы машина была полноценным отдельным компьютером в вашей домашней сети; обязательная установка пароля для root-пользователя, так как все операции будут выполняться под ним; а также выбор устанавливаемых компонентов, который задается почти в самом конце установки, должен включать только SSH server:

Так выглядит конфигурация установки ОС без лишних компонентов, но с доступом по SSH

Так выглядит конфигурация установки ОС без лишних компонентов, но с доступом по SSH

После установки необходимо войти под пользователем root с паролем, который задавался при установке (и да, пароль при вводе никак не отображается, это нормально).

После ввода root пароля просто нажимаем enter

После ввода root пароля просто нажимаем enter

И внести последнее изменение с самого мини-пк: в конфигурации SSH необходимо разрешить подключение root пользователю, так как, повторюсь, все операции будем выполнять от него. Для этого вводим:

nano /etc/ssh/sshd_config

Ищем закомментированную строку #PermitRootLogin prohibit-password и правим в это: PermitRootLogin yes

Выглядит это так:

Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.

Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.

Перезапускаем сервер:

systemctl restart ssh || systemctl restart sshd

Узнаем ip адрес машины через команду:

ip a

Скорее всего нам нужен будет именно второй интерфейс, а так как IP-адрес получаем по DHCP от роутера, то он будет примерно следующего вида: 

192.168.XXX.YYY (Например, 192.168.0.25 или 192.168.25.136). 

(Во всей статье будет использоваться IP-адрес 192.168.50.56, поэтому держите в уме, что в вашем случае нужно будет заменить его на актуальный IP именно для вашего сервера. Вместо IP-адреса может быть указано также доменное имя)

Узнав адрес, можно отложить ПК в сторону и подключиться по SSH через терминал с основной машины, находящейся в одной локальной сети с сервером, следующей командой (работает в любой ОС):

ssh root@192.168.50.56 

Остается только ввести пароль от пользователя root.

(если на вашей основной машине по каким-либо причинам не установлен ssh-клиент, можете воспользоваться Termius: Win / MacOS / Linux )

Как только получилось авторизоваться, немножко настроим и почистим систему. Уберем поддержку IPv6 и включим переадресацию для IPv4 между сетевыми интерфейсами командой (в терминал вставляется все, так как команды объединены связкой « && \«):

echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf && \
sysctl -w net.ipv4.ip_forward=1

Выключим ненужные сервисы:

systemctl stop cron && \
systemctl stop apparmor && \
systemctl stop console-setup && \
systemctl stop keyboard-setup && \
systemctl disable cron && \
systemctl disable apparmor && \
systemctl disable console-setup && \
systemctl disable keyboard-setup && \
systemctl mask --now systemd-journal-flush && \
systemctl mask --now systemd-journald && \
systemctl set-default multi-user.target

Удалим лишние пакеты и подчистим зависимости:

apt remove -y --purge vim-common vim-tiny ispell iamerican ibritish ienglish-common dictionaries-common emacsen-common wamerican cron cron-daemon-common apparmor console-setup console-setup-linux keyboard-configuration xkb-data kbd isc-dhcp-common shared-mime-info installation-report && \
apt autoclean -y && apt autoremove -y

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

apt install -y sudo curl wget gnupg2 htop lm-sensors

Отредактируем загрузчик, чтобы убрать 5 секундное ожидание при старте и отключить ограничения по уязвимостям Spectre, Meltdown и другим, открыв файл загрузчика для редактирования:

nano /etc/default/grub

Значения меняем на следующие:

GRUB_TIMEOUT=0
GRUB_CMDLINE_LINUX_DEFAULT="mitigations=off quiet nowatchdog processor.ignore_ppc=1 cpufreq.default_governor=performance"

Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.

Обновляем загрузчик и перезагружаемся:

update-grub && \
reboot

Установка ПО: Mosquitto, Node-RED, WireGuard, Influx, Telegraf, Grafana

После перезагрузки снова коннектимся по SSH:

ssh root@192.168.50.56

Установка Mosquitto

Добавляем пакет и проверяем актуальную версию, должна быть 2.0.17:

sudo wget -qO- https://repo.mosquitto.org/debian/mosquitto-repo.gpg.key | sudo tee /etc/apt/trusted.gpg.d/mosquitto-repo.asc && \
sudo wget -O /etc/apt/sources.list.d/mosquitto-bookworm.list https://repo.mosquitto.org/debian/mosquitto-bookworm.list && \
sudo apt update && \
sudo apt-cache show mosquitto | grep Version

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

sudo apt install -y mosquitto=2.0.17-0mosquitto1~bookworm1 mosquitto-clients=2.0.17-0mosquitto1~bookworm1 && \

Создаем пароль для учетной записи IoT (после ввода команды нужно дважды ввести пароль) и настраиваем права доступа:

sudo mosquitto_passwd -c /etc/mosquitto/passwd IoT && \
sudo chmod 777 /etc/mosquitto/passwd

Создаем конфигурацию:

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

И вставляем туда следующие содержимое:

allow_anonymous false
password_file /etc/mosquitto/passwd
listener 1883

Записываем файл ctrl+oenter и выходим из редактора ctrl+x.

Сохраненная только что конфигурация запрещает анонимное подключение, без связки логин-пароль, указывает путь к файлу с заданным ранее паролем для пользователя IoT, а также задает порт, на котором будет работать MQTT брокер. Перезапускаем службу:

systemctl restart mosquitto

Проверим, что все работает, выполнив в двух отдельных терминальных окнах следующие команды (пароль необходимо изменить на свой или использовать student):

mosquitto_sub -h 192.168.50.56 -p 1883 -t Habr -u "IoT" -P "student"
mosquitto_pub -h 192.168.50.56 -p 1883 -t "Habr" -m "Hello, Habr!" -u "IoT" -P "student"

Верхняя команда будет прослушивать топик Habr, командой sub. Нижняя команда отправит на топик с названием Habr сообщение: «Hello, Habr!», командой pub. Что и получилось: В режиме прослушивания (подписки) терминалом была создана строка с полученным значением.

Установка Node-RED + Node.js

Установим сперва актуальную версию Node.js 20:

udo apt-get update && sudo apt-get install -y ca-certificates curl gnupg && \
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
NODE_MAJOR=20 && \
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && \
sudo apt-get update && sudo apt-get install nodejs -y

Далее, воспользуемся скриптом-установщиком, который установит Node-RED:

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Установщик трижды спросит подтверждение, необходимо дважды ввести «y» и последний раз «n».

Are you really sure you want to install as root ? [y/N] ? y
Are you really sure you want to do this ? [y/N] ? y
Would you like to install the Pi-specific nodes ? [y/N] ? n

Далее, нам необходимо инициализировать параметры командой, если вы вдруг не нажали «y» в процессе установки на запрос конфигурации сейчас:

node-red admin init

Небольшая шпаргалка по ответам на вопросы скрипта:

Settings file -> enter
Do you want to setup user security? –> yes
Username -> admin
Password -> задаете_пароль_для_admin
User permissions -> full access
Add another user? -> yes
Username -> user
Password -> задаете_пароль_для_user
User permissions -> read-only access
Add another user? -> no
Do you want to enable the Projects feature? -> no
Enter a name for your flows file -> enter
Provide a passphrase to encrypt your credentials file -> задаете_пароль_для_credentials_file
Select a theme for the editor -> default 
Select the text editor component to use in the Node-RED Editor -> monaco (default)
Allow Function nodes to load external modules? -> yes

Данная конфигурация включает форму авторизации на Node-RED и создает двух пользователей: admin и user, с полными правами и правами только на чтение соответственно. Затем необходимо включить и запустить сервисы Node-RED:

sudo systemctl enable nodered && \
sudo systemctl start nodered

Проверить, что все работает, можно зайдя по адресу: http://192.168.50.56:1880/

Если все действия выполнены успешно, вас встретит эта замечательная приветственная страница

Если все действия выполнены успешно, вас встретит эта замечательная приветственная страница

Установка WireGuard

WireGuard, как и Node-RED, тоже очень просто устанавливается скриптом-установщиком. Загружаем скрипт, делаем его исполняемым:

sudo curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh && \
sudo chmod +x wireguard-install.sh && \

И запускаем:

./wireguard-install.sh

Небольшая шпаргалка по ответам на вопросы скрипта:

IPv4 or IPv6 public address: -> my-home-server.noip.com (указываем доменное имя или публичный IP адрес с 2ip.ru, полученное в конце статьи)
Public interface: -> ens## (автоматом подтягивает имеющийся сетевой интерфейс, который мы видели командой ip a, если это он, можно не менять))
WireGuard interface name: -> wg0 (оставляем без изменений)
Server's WireGuard IPv4: -> 10.66.66.1 (оставляем предложенную адресацию без изменений)
Server's WireGuard IPv6: -> fd42:42:42::1(оставляем предложенную адресацию без изменений)
Server's WireGuard port [1-65535]: -> 1870 (указываем любой порт)
First DNS resolver to use for the clients: ->1.1.1.1
Second DNS resolver to use for the clients (optional): -> 1.0.0.1

После нажатия Enter’a, установки и конфигурирования серверной части скриптом, что был выше, скрипт переходит дальше, к настройке клиентской конфигурации, с помощью которой можно будет подключиться через клиентское приложение WireGuard к нашему серверу. Там указывается следующее:

Client name: -> Client_id_1 (или устанавливаем свое название файла)
Clinet's WireGuard IPv4: -> 10.66.66.2 (оставляем предложенную адресацию без изменений)
Clinet's WireGuard IPv6: -> fd42:42:42::2(оставляем предложенную адресацию без изменений)

Конфигурацию можно скачать по QR-коду или через FTP по пути /root/wg0-client-####.conf .

Результат выглядит вот так:

В итоговой конфигурации удаляем все упоминания об IPv6 и ip6tables в строчках с PostUp и PostDown:

nano /etc/wireguard/wg0.conf

Результат должен быть примерно следующий:

[Interface]
Address = 10.66.66.1/24
ListenPort = 1870
PrivateKey = sLdyJJPFXSZCTuPbuaCKdvDvVDOCCdbwjmPj7QgQkEs
PostUp = iptables -A FORWARD -i enp2s0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i enp2s0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp2s0 -j MASQUERADE

### Client
[Peer]
PublicKey = Rxo33+25X0oBni2v94+ftMXBSEveTpeXDDhmb7/x0mc=
PresharedKey = FNKcatwzm8KyAtP4lj8ZuXfSvQY0nh/SeV34TYMYaL0=
AllowedIPs = 10.66.66.2/32

Записываем файл ctrl+o, enter и выходим из редактора ctrl+x.

Перезапускаем службу:

systemctl restart wg-quick@wg0

Если захотите добавить еще одного пользователя (потому что каждая конфигурация поддерживает только одно активное подключение), то снова запустите скрипт (выбрав 1):

./wireguard-install.sh

Для проверки необходимо запустить клиентское приложение WireGuard, импортировать в него созданную ранее клиентскую конфигурацию (wg0-client-####.conf) и запустить подключение:

После установки WireGuard’a обязательно перезапустить систему:

reboot

После чего снова подключаемся по SSH:

ssh root@192.168.50.56

Установка InfluxDB2 + Telegraf + Grafana

Добавим репозитории для InfluxDB2 и Telegraf, скачаем заданную версию Grafana, установим и запустим службы (для Grafana проверяйте наличие обновленной версии перед установкой здесь. Версию можно поправить прямо в скрипте, когда выйдет более актуальная)

sudo wget -q https://repos.influxdata.com/influxdata-archive_compat.key && \
sudo echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null && \
sudo echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list && \
sudo apt-get install -y adduser libfontconfig1 musl && \
sudo wget https://dl.grafana.com/oss/release/grafana_10.1.1_amd64.deb && \
sudo dpkg -i grafana_10.1.1_amd64.deb && \
sudo rm /root/grafana_10.1.1_amd64.deb && \
sudo systemctl enable grafana-server && \
sudo systemctl start grafana-server && \
sudo apt-get update && sudo apt-get install -y influxdb2 telegraf && \
sudo systemctl start influxd && \
sudo systemctl enable telegraf

Проверим, что InfluxDB и Grafana доступны, зайдя по адресам: http://192.168.50.56:8086/ и http://192.168.50.56:3000/

Должно быть так:

Если все действия выполнены успешно, вас встретит эта замечательная приветственная страница

Если все действия выполнены успешно, вас встретит эта замечательная приветственная страница

И так:

Если все действия выполнены успешно, вас встретит эта замечательная приветственная страница

Если все действия выполнены успешно, вас встретит эта замечательная приветственная страница

Настройка Influx, Telegraf, Grafana

Заходим в InfluxDB по адресу http://192.168.50.56:8086 и нажимаем “GET STARTED” и первым делом создаем учетную запись, указываем название организации и корзины для данных (Organization Name и Bucket Name -> IoT). После заполнения нажать «CONTINUE», а в следующем окне «QUICK START»

Создаем учетную запись, указываем название организации и корзины для данных

Создаем учетную запись, указываем название организации и корзины для данных

Выбираем QUICK START

Выбираем QUICK START

Далее, нам необходимо создать файл конфигурации для Telegraf. Для этого необходимо создать токен доступа InfluxDB (так как просмотр созданных токенов стал запрещен). 

В левом боковом меню нажимаем Load Data -> API Tokens -> GENERATE API TOKEN -> Custom API Token:

GENERATE API TOKEN -> All Access API Token

GENERATE API TOKEN -> All Access API Token

Задаем любое название для создаваемого токена, выбираем все доступы Read и Write для категорий Buckets и Telegrafs и нажимаем GENERATE:

Задаем имя для токена

Задаем имя для токена

Копируем через “COPY TO CLIPBOARD” и сохраняем где-нибудь (еще раз обращу внимание на то, что токен показывается только один раз при его создании).

Копируем токен в буфер обмена (и обязательно сохраняем где-нибудь)

Копируем токен в буфер обмена (и обязательно сохраняем где-нибудь)

Далее, создаем саму конфигурацию для Telegraf:

nano /etc/telegraf/telegraf.d/IoT.conf

И вставляем туда следующее содержимое, которое в части ip-адресов и токена вам нужно будет немного отредактировать:

# Configuration for telegraf agent
[agent]
  interval = "5s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "5s"
  flush_jitter = "0s"
  precision = ""
  hostname = ""
  omit_hostname = false

[[outputs.influxdb_v2]]
  urls = ["http://192.168.50.56:8086"]
  token = "gj8siSCDDuWyPd31LvrA2JIzldDzso_e_R_NiRkjKGJei4VgdoBV4heKIYSb7jMXLvEufhKgZfEv2pjTCHYUXA=="
  organization = "IoT"
  bucket = "IoT"

[[inputs.mqtt_consumer]]
  servers = ["tcp://192.168.50.56:1883"]
  topics = ["#"]
  username = "IoT"
  password = "student"
  data_format = "value"
  data_type = "float"

Записываем файл ctrl+o, enter и выходим из редактора ctrl+x. Затем перезапускаем службу, чтобы применить конфиг:

systemctl restart telegraf

Теперь необходимо отправить данные на наш MQTT брокер:

mosquitto_pub -h 192.168.50.56 -p 1883 -t "Habr/Temp" -m "28.5" -u "IoT" -P "student"

А в InfluxDB проверить, что в Data Explorer -> IoT -> mqtt_consumer есть топик Habr/Temp и данные. Для этого необходимо настроить пространство, как на скриншоте ниже ( нужно поменять тип график на Gauge, aggregate function указать last и нажать SUBMIT):

Все MQTT-сообщения от Telegraf будут собираться в mqtt_consumer

Все MQTT-сообщения от Telegraf будут собираться в mqtt_consumer

Вуаля, наш температурный «спидометр» показывает ровно то значение, которое было отправлено в MQTT сообщении на топик Habr/Temp. Последний шаг, который осталось сделать: скопировать скрипт получения данных из БД. Делается это через SCRIPT EDITOR (рядом с SUBMIT со скриншота выше). Копируем запрос из 6 строк и сохраняем где-нибудь рядом с токеном.

Запрос может быть и больше, если шагом ранее вы выберете несколько метрик

Запрос может быть и больше, если шагом ранее вы выберете несколько метрик

Далее, перейдем к настройкам Grafana. Первая авторизация происходит по логину/паролю admin/admin, после чего система попросит установить новый пароль. 

Hello :)

Hello :)

После чего попадаем на приветственное пространство Grafana. Далее, нам необходимо добавить интеграцию (подключение) с InfluxDB. Нажимаем значок настроек -> Data Sources -> Add Data Sourse -> InfluxDB -> Query Language (Flux) -> URL -> Basic Auth (off) -> Organozation(IoT) -> Default Bicket (IoT) -> Token (Берется в InfluxDB -> Load Data -> Api Tokens -> Admin`stoken) -> Save&Test (должен быть ok)

Много картинок здесь:

Нажимаем значок настроек -> Data Sources ->

Нажимаем значок настроек -> Data Sources ->

-> Add Data Sourse ->

-> Add Data Sourse ->

-> InfluxDB ->

-> InfluxDB ->

-> Query Language (Flux) -> URL (http://192.168.50.56:8086)-> Basic Auth (off) -> Organozation(IoT) -> Default Bicket (IoT) -> Token (Берется в InfluxDB -> Load Data -> Api Tokens -> Admin`stoken) -> Save&Test (должен быть ok)

-> Query Language (Flux) -> URL (http://192.168.50.56:8086)-> Basic Auth (off) -> Organozation(IoT) -> Default Bicket (IoT) -> Token (Берется в InfluxDB -> Load Data -> Api Tokens -> Admin`stoken) -> Save&Test (должен быть ok)

После того, как Grafana успешно подключилась к InfluxDB и обнаружила все корзины с данными, можно добавить дашборд: Dashboards -> New Dashboard -> Add New Panel -> вставляем данные их SCRIPT EDITOR -> Apply -> Save -> Имя дашборда

И много картинок здесь

Dashboards -> New Dashboard ->

Dashboards -> New Dashboard ->

-> Add New Panel ->

-> Add New Panel ->

вставляем данные из SCRIPT EDITOR в InfluxDB -> минимально настраиваем -> Apply

вставляем данные из SCRIPT EDITOR в InfluxDB -> минимально настраиваем -> Apply

Создаем еще одну панель с табличным отображением

Создаем еще одну панель с табличным отображением

Сохраняем итоговый дашборд

Сохраняем итоговый дашборд

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

ВАЖНО: Службу Telegraf необходимо перезапускать после каждой перезагрузки системы. Почему-то она стартует в статусе «failed», а перезагружается со статусом «Active». Видимо баг в последних сборках. «Пофиксить» можно следующим образом:

sed -i 14i\ 'RestartSec=2s' /lib/systemd/system/telegraf.service

И применим изменения:

sudo systemctl daemon-reload

Альтернатива с Node-RED

Для этого нам необходимо зайти в приложение http://192.168.50.56:1880/ и авторизоваться под администратором, пароль которого задавался ранее. В базовом наборе есть множество узлов(нод), в том числе MQTT, поэтому остается добавить и настроить интеграцию с InfluxDB. Для этого необходимо загрузить дополнительную палитру node-red-contrib-influxdb, а еще нам понадобится random-generator_node-red-contrib, для генерации случайных чисел.

Для этого в боковом меню выбирается «Управление палитрой», затем установить и в поле поиска вводится название палитры и нажимается кнопка «установить».

Выглядит это так

Боковое меню -> Управление палитрой

Боковое меню -> Управление палитрой

Устанавливаем палитру node-red-contrib-influxd, аналогично действуем для random-generator_node-red-contrib

Устанавливаем палитру node-red-contrib-influxd, аналогично действуем для random-generator_node-red-contrib

После установки всего необходимого соберем поток:

Делаем так:

  1. Возьмем узел стартового генератор событий «inject» в разделе общее, который будет генерировать сообщение с текущей временной меткой

  2. Возьмем узел «Number», в разделе Random Generator, где зададим диапазон случайно генерируемых чисел.

    Настройка узла Number

    Настройка узла Number
  3. Возьмем узел «mqtt out» в разделе сеть, чтобы отправить данные MQTTброкеру. И настроим его. Указав тему (топик), адрес сервера, и данные авторизации.

    (Шаги с 1 по 3 нужны, чтобы с эмулировать данные от устройства, передающего данные по MQTT.)

    Задается тема для публикации и настраивается сервер

    Задается тема для публикации и настраивается сервер

    Задается адрес и порт сервера

    Задается адрес и порт сервера

    Задаются параметры аутентификации

    Задаются параметры аутентификации
  4. Возьмем узел «mqtt in» в разделе сеть, чтобы получать данные от MQTT брокера. И настроем его по аналогии с П.3

    Указывается уже настроенный сервер и задается тема для подписки

    Указывается уже настроенный сервер и задается тема для подписки
  5. Возьмем узел «influx out» в разделе хранилище, чтобы данные записывались в InfluxDB. И настроим его. Укажем организацию и корзину: IoT, задаим название переменной для измерений, укажем версию InfluxDB (2.0), адрес БД и знакомый по прошлым пунктам токен.

    Указывается Org, Bucket и настраивается подключение к InfluxDB

    Указывается Org, Bucket и настраивается подключение к InfluxDB

    Указывается версия БД (2.0 обязательно), адрес и токен

    Указывается версия БД (2.0 обязательно), адрес и токен
  6. Для удобства к узлам «Number» и «mqtt in» можно подключить узел debug, который покажет, что было сгенерировано такое-то значение, на узле “Number”, а оно же было получено на узле «mqtt in». (и, соответственно, записано в БД).

  7. Нажимаем развернуть (чтобы применить любый изменения)

Проверим, что все настройки работают, нажав на запуск события узла «inject»:

Успех!

Успех!

Как мы видим, MQTT подключение к брокеру успешно установлено. А сгенерированные данные были отправлены и получены по MQTT. Проверим теперь запись измерения в InfluxDB. Заходим в уже знакомый раздел Data Explorer и видим там измерение с названием Habr_temp, которые было задано в узле «influx out». 

Данные в метрику Habr_temp получены!

Данные в метрику Habr_temp получены!

Преимущество данного способа в том, что при получении информации по mqtt на шаге 4 выше, после него можно написать какую-нибудь функцию на javasсript по обработке полученных данных. И только потом записать их в InfluxDB.

Перенастройка Grafana на порт 80

Для того, чтобы Grafana была доступна по порту 80, и не было необходимости вводить полный адрес с указанием порта, а только сам ip-адрес, можно использовать команду для настройки переадресации 80 порта на 3000 порт Grafana (после перезагрузки системы правила iptables очищаются, необходимо применять повторно):

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000 && \
sudo systemctl daemon-reload

Если необходимо сделать работу по 80 порту постоянной, то необходимо исправить конфигурацию графаны, указав необходимый порт, а также отредактировать службу, разрешив ей работать с портами <1024:

sed -i 's/;http_port = 3000/http_port = 80/' /etc/grafana/grafana.ini && \
sed -i 52i\ 'CapabilityBoundingSet=CAP_NET_BIND_SERVICE' /lib/systemd/system/grafana-server.service && \
sed -i 53i\ 'AmbientCapabilities=CAP_NET_BIND_SERVICE' /lib/systemd/system/grafana-server.service && \
sed -i 54i\ 'PrivateUsers=false' /lib/systemd/system/grafana-server.service && \
sudo systemctl daemon-reload && \
sudo systemctl restart grafana-server

После чего Grafana становится доступной по 80 порту.

Немного про DDNS и PortFowarding на роутере ASUS и адресацию.

Под конец настроим проброс портов установленных приложений. Для этого необходимо зайти на роутер (в моем случае адрес 192.168.50.1), авторизоваться и перейти в раздел бокового меню WAN. Там выбрать раздел Virtual Server / Port Forwarding и настроить значения следующим образом через “Add profile”. Необходимо ввести имя профиля, порт, который открываем, тип протокола и адрес нашего сервера:

В зависимости от производителя интерфейс может отличаться, но суть остается без изменений.

В зависимости от производителя интерфейс может отличаться, но суть остается без изменений.

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

Далее, перейдем к настройке нашего доменного имени. Необходимо перейти в соседнюю секцию, включить службу DDNS, установить метод запроса IP -> External. Указать свободное доменное имя и зарегистрировать его (в качестве примера используется: yours-linux-server-1.asuscomm.com). Когда процесс успешно завершится, применить всю конфигурацию. Через небольшой промежуток времени ваш публичный IP адрес привяжется к доменному имени, которое вы зарегистрировали и доступ к приложениям можно будет запрашивать по нему, вместо публичного IP адреса.

Кстати, если вы захотите в будущем заморочиться настройкой https соединения, то здесь же можно получить бесплатный сертификат Let`s Encrypt (кнопочка Export), который можно указать в качестве реквизитов при настройке https-соединения в настройках ПО выше.

Настройка службы DDNS на роутере Asus

Настройка службы DDNS на роутере Asus

Немного про адресацию:

Доступ, например, в Node-Red, осуществляется по адресу http://localhost:1880 с компьютера, на котором он установлен, по адресу http://192.168.50.56:1880 если запрос идет из любого другого компьютера домашней локальной сети, и http://<ваш ip адрес на 2ip.ru / или доменное имя>:1880 если настроен проброс портов и запрашивается доступ через интернет. Итого это будет выглядеть следующим образом:

На самом сервере доступ к ПО осуществляется по ссылкам:

http://localhost:1880     –>     Node-RED
http://localhost:1883     –>     Mosquitto MQTT
http://localhost:1871     –>     WireGuard VPN
http://localhost:3000     –>     Grafana
http://localhost:8086     –>     InfluxDBv2

На любом устройстве домашней локальной сети доступ к ПО осуществляется по ссылкам:

http://192.168.50.56:1880     –>     Node-RED
http://192.168.50.56:1883     –>     Mosquitto MQTT
http://192.168.50.56:1871     –>     WireGuard VPN
http://192.168.50.56:3000     –>     Grafana
http://192.168.50.56:8086     –>     InfluxDBv2

На любом устройстве доступ к ПО через интернет осуществляется по ссылкам (на месте yours-linux-server-1.asuscomm.com может быть ваш публичный IP адрес на 2ip.ru):

http://yours-linux-server-1.asuscomm.com:1880     –>     Node-RED
http://yours-linux-server-1.asuscomm.com:1883     –>     Mosquitto MQTT
http://yours-linux-server-1.asuscomm.com:1871     –>     WireGuard VPN
http://yours-linux-server-1.asuscomm.com:3000     –>     Grafana
http://yours-linux-server-1.asuscomm.com:8086     –>     InfluxDBv2

Если вам интересно, как использовать доменное имя (в примере ниже это superpuperhabr.ru), чтобы обращаться к сайтам подобным образом:

https://nodered.superpuperhabr.ru           –>     Node-RED
https://mqtt.superpuperhabr.ru              –>     Mosquitto MQTT
https://wg.superpuperhabr.ru                –>     WireGuard VPN
https://grafana.superpuperhabr.ru           –>     Grafana
https://influx.superpuperhabr.ru            –>     InfluxDBv2
https://chirpstack.superpuperhabr.ru        –>     Chirpstack-v4
https://chirpstack-api.superpuperhabr.ru    –>     Chirpstack-api

То по ссылке далее описано, как это сделать: —> тык <—

P.S.

Если любопытно посмотреть потребление ресурсов развернутой системы, то можно воспользоваться утилитой htop:

htop

P.S.S: Docker

Для тех, кто предпочитает контейнеры:

Вставляем один большой скрипт (вот прям весь весь):

apt-get update && \
apt-get install -y ca-certificates curl gnupg lsb-release && \
mkdir -m 0755 -p /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && \
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin && \
docker run hello-world && \
docker compose version && \
mkdir -m 777 -p ~/mosquitto/config && \
mkdir -m 777 -p ~/mosquitto/data && \
mkdir -m 777 -p ~/mosquitto/log && \
mkdir -m 777 -p ~/influxdb/data && \
mkdir -m 777 -p ~/influxdb/conf && \
mkdir -m 777 -p ~/telegraf/conf && \
mkdir -m 777 -p ~/grafana/data && \
mkdir -m 777 -p ~/grafana/conf && \
mkdir -m 777 -p ~/grafana/log && \
mkdir -m 777 -p ~/node-red/data && \
mkdir -m 777 -p ~/wireguard/config

Создадим конфигурацию для mosquitto:

cat > ~/mosquitto/config/mosquitto.conf <<EOF
listener 1883
#allow_anonymous false
#password_file /mosquitto/config/password.txt
EOF

Создадим конфигурацию для telegraf:

cat > ~/telegraf/conf/telegraf.conf <<EOF
[agent]
  interval = "5s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "5s"
  flush_jitter = "0s"
  precision = ""
  hostname = ""
  omit_hostname = false

[[outputs.influxdb_v2]]
  urls = ["http://192.168.50.56:8086"]
  token = "!copy_token_here!"
  organization = "IoT"
  bucket = "IoT"

[[inputs.mqtt_consumer]]
  servers = ["tcp://192.168.50.56:1883"]
  topics = ["#"]
  username = "IoT"
  password = "student"
  data_format = "value"
  data_type = "float"
EOF

Настроим Grafana на 80 порт:

cat > ~/grafana/conf/grafana.ini <<EOF
[server]
http_port = 80
EOF

Создадим docker-compose.yml:

cat > docker-compose.yml <<EOF
version: "2"
services:
  influxdb:
    container_name: influxdb
    image: influxdb:latest
    environment:
      - TZ=Europe/Moscow
    ports:
      - "8086:8086"
    volumes:
      - ~/influxdb/data:/var/lib/influxdb
    networks:
      - influxdb-net
    restart: always

  wireguard:
    container_name: wireguard
    image: lscr.io/linuxserver/wireguard:latest
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Moscow
      - SERVERURL=192.168.50.56 #optional
      - SERVERPORT=1871 #optional
      - PEERS=5 #optional
      - PEERDNS=1.1.1.1 #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
      - LOG_CONFS=false #optional
    volumes:
      - ~/wireguard/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: always

  telegraf:
    container_name: telegraf
    image: telegraf:latest
    environment:
      - TZ=Europe/Moscow
    volumes:
      - ~/telegraf/conf/telegraf.conf:/etc/telegraf/telegraf.conf
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - telegraf-net
    restart: always
    
  grafana:
    container_name: grafana
    image: grafana/grafana-oss:latest
    environment:
      - TZ=Europe/Moscow
    ports:
      - "80:80"
    volumes:
      - ~/grafana/data:/var/lib/grafana
      - ~/grafana/log:/var/log/grafana
      - ~/grafana/conf/grafana.ini:/etc/grafana/grafana.ini
    links:
      - influxdb
    networks:
      - grafana-net
    restart: always

  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    environment:
      - TZ=Europe/Moscow
    volumes:
      - ~/mosquitto/:/mosquitto  
    ports:
      - 1883:1883
    networks:
      - mosquitto-net
    restart: always

  node-red:
    container_name: node-red
    image: nodered/node-red:latest
    environment:
      - TZ=Europe/Moscow
    ports:
      - "1880:1880"
    volumes:
      - ~/node-red/data:/data
    networks:
      - node-red-net
    restart: always

networks:
  node-red-net:
  influxdb-net:
  mosquitto-net:
  grafana-net:
  telegraf-net:
EOF

Запустим создание контейнеров (процесс займет какое-то время):

docker compose up -d

Далее, необходимо, как в основной части статьи, настроить mosquitto. От вас требуется только придумать пароль:

docker exec -it mosquitto mosquitto_passwd -c /mosquitto/config/password.txt IoT

Включить авторизацию в конфигурации:

cat > ~/mosquitto/config/mosquitto.conf <<EOF
listener 1883
allow_anonymous false
password_file /mosquitto/config/password.txt
EOF

И применить конфигурацию:

docker restart mosquitto

Настроить авторизацию в Node-red, сгенерировав пароль сперва для admin, потом для user, и скопировав хеши куда-нибудь:

docker exec -it node-red node-red-admin hash-pw

И указать их здесь:

nano +76,5 ~/node-red/data/settings.js

Должно быть примерно так:

adminAuth: {
        type: "credentials",
        users: [
                {
                        username: "admin",
                        password: "$2b$08$WhOtjRwX8Cd44vgryrOPue4rS8YkdOxS7DuuvUaUtotGRiSZ1bUny",
                        permissions: "*"
                },
                {
                        username: "user",
                        password: "$2b$08$sksoLeOB6EDecN3IZYLisO7mqNf/KSI519eioh7gtM0BpvAM3wA3q",
                        permissions: "read"
                }
        ]
},

Затем применяем конфигурацию:

docker restart node-red

Получаем токен Influx по шагам в основной статье. И указываем его здесь:

nano +15,12 ~/telegraf/conf/telegraf.conf

И применяем конфигурацию для Telegraf:

docker restart telegraf

Все контейнеры должны быть в статусе UP

docker ps

Выглядит примерно вот так

Выглядит примерно вот так

Конфиг для WireGuard можно получить командой:

docker exec -it wireguard /app/show-peer 1

Не забываем про настройку интеграции с Influx у Grafana и Node-RED (в части настроек все без изменений, как и в основной статье)

Работа с доменным именем

Для того, чтобы использовать доменное имя для своих сервисов, можно воспользоваться этой статьей: —> тык <—

Выглядеть будет примерно следующим образом:

https://nodered.superpuperhabr.ru           –>     Node-RED
https://mqtt.superpuperhabr.ru              –>     Mosquitto MQTT
https://wg.superpuperhabr.ru                –>     WireGuard VPN
https://grafana.superpuperhabr.ru           –>     Grafana
https://influx.superpuperhabr.ru            –>     InfluxDBv2
https://chirpstack.superpuperhabr.ru        –>     Chirpstack-v4
https://chirpstack-api.superpuperhabr.ru    –>     Chirpstack-api

Вместо заключения

На этом все! Домашний сервер с системой визуализации и подключением по MQTT настроен. Остается только отправлять данные в топики по MQTT и настраивать визуализацию, как душе угодно.

На самом деле в статье рассмотрен лишь частный случай с MQTT. Что Telegraf, что Node-RED – позволяют получать и передавать данные в InfluxDB (и другие БД) по множеству других интерфейсов и протоколов. Но это уже совсем другая история.

Вы уже поигрались с ESP8266 и теперь вам хочется большего? В этой статье я покажу основные приемы передачи данных куда только возможно. Построим надежную домашнюю WiFi сеть, в которой куча ESP8266 не будет мешать вашим высокоскоростным гаджетам. Мы соединим ESP8266 используя прошивку, сделанную в Arduino IDE, c MQTT брокером mosquitto, будем посылать электронную почту с ESP8266, передадим данные на ThingSpeak, CloudMQTT, будем получать PUSH уведомления на смартфон, ESP8266 будет дергать своими GPIO по команде со смартфона без HTTP серверов и проброски портов. ESP8266 будет отчитываться о действиях в собственном твиттер-аккаунте. Интересно? Если да то, как принято говорить на хабре, добро пожаловать под кат — там вас ждет громадное количество кликабельных скриншотов, полезных ссылок, видео и самый минимум линуксовых команд в терминале под OpenWRT, с которыми справятся даже люди абсолютно не знакомые с linux.

Содержание

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

Настраиваем 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

Вы, наверное, уже заметили, что даже один или два модуля ESP8266 с кривым софтом на борту могут уронить вашу домашнюю WiFi сеть и ваши домашние будут ругать провайдера за неповоротливый интернет, пока вы нервно курите в сторонке. Что уж там говорить, если вы собираетесь половину ваших электрических розеток перевести на WiFi управление. Также существует неудобство и в том, что для взаимодействия с ESP8266 вам периодически приходится поднимать на своем рабочем компе то HTTP сервер, то еще что-нибудь. Вот эти две проблемы мы и постараемся решить за один раз (просьба не упоминать про зайцев). Подключим дополнительную WiFi точку доступа на отдельном радио канале специально для наших экспериментов сейчас и для будущей домашней IoT сети в ближайшем будущем.

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

Я не буду здесь описывать все преимущества этого роутера, распаковывать его из коробки у вас на глазах — для этого уже давно есть неплохие обзоры (вот на муське и еще один).  Этот роутер подходит лучше других для нашей задачи потому, что имеет на борту 64Мб оперативки, а нагрузить мы его хотим по полной программе :) Еще приятная новость в том, что на нем предустановлена прошивка OpenWRT, что уменьшает вероятность танцев с бубном для тех, кто не знаком с линуксом вообще.

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

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

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

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

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

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

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

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

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

Однако в этом замечательном роутере есть и ложка дегтя. При отличной схемотехнике и продуманно скомпонованном железе, китайцы собрали наполовину китайскую OpenWRT, которая обращается к репозитарию пакетов на сайте производителя с битыми ссылками и устаревшими сборками. Кроме того, буквально пару недель назад, вышла новая версия OpenWRT — Chaos Calmer 15.05-rc1, которая включает последнюю версию 1.4.2 MQTT брокера mosquitto в которой исправлены баги именно в тех функциях, которые мы будем активно использовать.

Поэтому, особо не парясь, через веб интерфейс будем заливать новую прошивку. Сначала определите модель (по объему флеш памяти) и скачайте с официального сайта OpenWRT либо openwrt-15.05-rc1-ar71xx-generic-gl-inet-6408A-v1-squashfs-sysupgrade.bin либо openwrt-15.05-rc1-ar71xx-generic-gl-inet-6416A-v1-squashfs-sysupgrade.bin и обновитесь. Процесс обновления прошивки я описывать не буду — это легко гуглится, да и эта статья об ESP8266, а не про OpenWRT. Для тех, кто вообще не знаком с OpenWRT, скажу, что нужно искать описание обновления прошивки с OpenWRT на OpenWRT через веб интерфейс самой OpenWRT без сохранения настроек. Во как.

Если что-то пойдет не так — не отчаивайтесь! Ищите в инете инструкцию по прошивке через консоль. Разбираете роутер, подключаете USB-TTL, питание берете внешнее, подключаетесь к роутеру витой парой, поднимаете у себя на компе tftp сервер. Процедура простая и быстрая, дольше будете tftp искать и настраивать. Кстати, тоже самое придется сделать, если в дальнейшем не примонтируете флешку для увеличения доступного места и наустанавливаете кучу пакетов, которые займут все свободное место — OpenWRT в таком случае может и не стартануть. Сам попался как-то раз на такую удочку :)

Есть одно неудобство — после установки чистая OpenWRT имеет IP адрес 192.168.1.1, который в нашем случае (установка второго домашнего WiFi роутера) уже обычно бывает занят старым роутером, который нам раздает интернет. Поэтому, для первоначальной настройки, придется физически отключиться от вашей локальной сети и подключиться проводом к порту LAN нового маршрутизатора.

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

IoT Home Network

ESP8266 IoT Home Network

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

Обсуждение вопросов настройки OpenWRT на нашем формуме

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

WiFi

WiFi

Gl.iNET+OpenWRT

Gl.iNET+OpenWRT

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

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

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

Любой SSH клиент, мне наиболее симпатичен putty. Желательно погуглить про SSH, putty и ключи и сгенерировать собственный ключ — это существенно упростит вам жизнь, но можно обойтись и без этого. Если вы пользуетесь хостингом или уже имеете свой домашний выделенный linux сервер, то такой ключ у вас, наверняка, уже есть.

Любой SFTP клиент, мне больше нравится Far Manager — мы будем редактировать файлы на OpenWRT не через редактор vi, который встроен в OpenWRT, но абсолютно неудобен для обычных людей. Хотя, наверное, линукс гуру со мной не согласятся.

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

Первым делом установим соединение с интернетом:

ifconfig brlan 192.168.1.100

route add default gw 192.168.1.1 brlan

echo «nameserver 8.8.8.8» &gt;&gt; /etc/resolv.conf

 Проверяем интернет

Если яндекс пингуется, то жмем CTRL+C

Задаем пароль root

Подключаемся по SSH к 192.168.1.100, попадаем в командную строку терминала. При возникновении проблем — гуглим.

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

Ждем пока все подгрузится, затем

opkg install luci

/etc/init.d/uhttpd start

Люся — наша лучшая подруга! Запускаем браузер, заходим на 192.168.1.100 и видим приглашение OpenWRT. Отлично, теперь установим русскоязычный интерфейс.

Идем по меню System — Software — Filtr вводим -ru жмем поиск. Переключаем вкладку на доступные пакеты и ищем luci-i18n-base-ru — вот его и устанавливаем. Обновите страницу после установки (не торопитесь — требуется некоторое время для скачивания и установки пакета), всё — русификация завершена — можете обновить страницу.

Сейчас нужно, чтобы люся сама загружалась при старте роутера — идем в Система — Загрузка и ищем uhttpd — если на кнопке красный крестик и надпись Отключено, то жмем по нему — всё, автозапуск включен.

Дальше я рекомендую настроить Far Manager, а точнее его встроенный плагин NetBox.

far netbox

far netbox

Для того, чтобы мы могли передавать/принимать файлы с OpenWRT через sftp устанавливаем пакет

Фаром подключаетесь к OpenWRT, идете в /etc/config/firewall и в политиках зон все REJECT заменяете на ACCEPT, потому что LAN и WAN у этого маршрутизатора находятся в нашей домашней сети, которой мы доверяем.

Дальше все просто: с помощью русскоязычного меню настраиваете WiFi, проверяете настройки br-lan интерфейса (остальные лучше не трогать, но только если вы действительно знаете что делаете). Можете прописать DNS сервера вашего провайдера в качестве вторичных и указать в качестве первичного DNS адрес вашего главного маршрутизатора 192.168.1.1

Перегрузите через меню OpenWRT, убедитесь что все работает, интернет есть и т.п. Подключитесь с ноутбука или смартфона к вашей сети IoT по WiFi, проверьте инет.

Новичкам, которые еще не знают что им может понадобится, лучше сразу увеличить размер файловой системы с помощью USB флешки — лучше взять современную (=быструю) любого размера. Подключение флешки к OpenWRT легко гуглится, так что вы без проблем с этим вполне справитесь. Для облегчения задачи флешку лучше отформатировать у друга на linux машине. Если у вас нет такого друга и возникнут проблемы при разбитии флешки на разделы через консоль в OpenWRT, то можете установить VirtualBox и Extension Pack к нему, запустить linux в виртуальной машине и там в графической оболочке с помощью gparted разбить флешку на разделы. Такая виртуальная машина с линуксом на борту вполне потом может вам сгодится для экспериментов в linux, сборки собственной прошивки для OpenWRT из исходников — я так делал на виртуальной машине с одним гигом памяти — компилировалось всю ночь :)

После того, как примонтируете флешку на overlay жмите

Просто убедимся, что места у нас полно. Вот у меня для примера свободно более 500 мегов.

root@OpenWrt:~# df -h

Filesystem                Size      Used Available Use% Mounted on

rootfs                  609.0M     51.1M    513.4M   9% /

/dev/root                 2.3M      2.3M         0 100% /rom

tmpfs                    29.8M      1.2M     28.6M   4% /tmp

/dev/sda3               609.0M     51.1M    513.4M   9% /overlay

overlayfs:/overlay      609.0M     51.1M    513.4M   9% /

tmpfs                   512.0K         0    512.0K   0% /dev

root@OpenWrt:~#

Сейчас можно не скупиться и поставить все, что потребуется.

Идем в Система — Программное обеспечение, фильтруем mc, устанавливаем замечательный файловый менеджер, чтобы потом не делать файловые операции из командной строки.

Еще можно установить htop — отличная утилита, интерактивно показывающая загрузку системы и использование памяти

Да хоть и mysql-server, если вам требуется запись в БД ваших данных. В общем, тут уже все индивидуально.

На этом первоначальная настройка OpenWRT завершена.

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

Немного расскажу по-простому о протоколе MQTT. Представьте интернет-форум вроде нашего. В нем есть темы (топики). Если вас интересует какой-то топик, то вы на него подписываетесь и вам приходят уведомления об изменениях. Также вы можете публиковать свои посты в топиках, такие уведомления придут и тем, кто подписан на топик, в котором вы опубликовали пост. Топики многоуровневые. Точно также и в MQTT — топики, подписка, публикация. Если вы публикуете в топик, которого не существует, то он создается и становится точно таким-же по свойствам, что и другие. Все это справедливо, если у вас есть права на чтение и/или запись конкретного топика или всех.

Устанавливаем mosquitto через Система — Программное обеспечение, включаем автозапуск. Можно установить все пакеты, у которых в названии есть mosquitto и нет nossl.

Через FarManager или vi редактируем файл /etc/mosquitto/mosquitto.conf

Ищем раздел, где log_dest и добавляем ниже строку

Аналогично делаем

log_facility 5

log_type debug

log_type error

log_type warning

log_type notice

log_type information

Позаботимся о безопасности даже если вам это кажется не нужным (в примерах далее будут прописаны пользователи и пароли и не будут использованы анонимные подключения)

password_file /overlay/mosquitto/users.list

acl_file /overlay/mosquitto/mosquitto.acl

Сохраняем mosquitto.conf

Теперь создадим необходимые каталоги с помощью mc или командной строки

cd /overlay

mkdir mosquitto

cd mosquitto

Для создания пользователей и генерации паролей необходимо установить пакет mosquitto-client. После установки используйте утилиту mosquitto-passwd. Или можете применить грязный хак. Скачиваем win версию mosquitto к себе на комп и с помощью mosquitto_passwd.exe создаем пользователей. Я эту работу сделал за вас, поэтому просто скопируйте эту строчку в пустой файл /overlay/mosquitto/users.list

test:$6$5Prq6fKi/BKhXVd+$SK2AYMVcMUKP94nzkZF3YIy6SXQhA5HBjDM/5n0X07YbIVPJP8Mnl4YGlRDkyWxSWs1mnxhP+CEzw9xvtV6F/Q==

В одну строку без переносов. Это мы определили пароль test пользователю test. Еще создаем файл /overlay/mosquitto/mosquitt.acl следующего содержания

Это мы даем права на чтение и запись юзеру test на все топики. Подробнее о всех командах файла конфигурации и настройке прав смотрите в документации.

Полный файл конфигурации mosquitto.conf

Все готово к запуску mosquitto — включаем его в автозагрузке и запускаем. Теперь надо проверить как он работает.

Обсуждение процесса настройки mosquitto на нашем форуме

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

Для общения с любым mqtt брокером есть отличная программа mqtt-spy единственным недостатком которой можно назвать лишь то, что она требует наличия установленной Java 8.20 и выше. Программа mqtt-spy на потребуется только на период отладки и в рабочей системе будет уже не нужна. JAR файл mqtt-spy просто скачиваем на рабочий стол в пустую папку и запускаем обычным двойным кликом. По умолчанию mqtt-spay автоматически подключается к тестовому серверу iot.eclipse.org, можете поэкспериментировать и с ним, но лучше сразу подключимся к нашему mosquitto. В меню Connections выбираем New connection. Connection Name уже заполнено — можно оставить как есть, но я предпочту исправить на OpenWRT. Ниже на вкладке Connectivity в поле Server URI(s) вводим IP адрес нашего маршрутизатора и порт mosquitto по умолчанию, т.е. 192.168.1.100:1883 Ниже сгенерировался Client ID — можно оставить как есть, или ввести что-то свое. Следует заметить, что стандарт MQTT требует уникальный ClientID у каждого подключенного клиента. Рекомендую так же отметить галочкой Reconnect on failure. На вкладке Security вводим логин и пароль test и test. Жмем Apply и Open Connection. Если все прошло гладко, то вы увидите, что появилась зеленая вкладка с названием нашего соединения OpenWRT. Цвет вкладки означает состояние соединения: красный — отключено, желтый — соединяемся, зеленый — подключено. Забегая вперед скажу, что после отключения/подключения не забывайте переподписываться на топики. Переключаемся на нашу новую вкладку OpenWRT. Далее мы видим 4 группы пока еще пустых полей:

  1. Publish message — для публикации топиков
  2. Define new subscribtion — подписка на топики
  3. Вкладка All в которой мы увидим топики, на которые подпишемся
  4. Ниже увидим сообщения из топиков, на которые мы подписались.

Для начала подпишемся на все топики. В поле Define new subscribtion вводим единственный символ # и жмем Subscribe. Должна появиться вкладка #. Итак мы подписаны на все топики, теперь попробуем что-либо опубликовать. В верхнее поле Publish message — Topic вводим название нашего топика, например esp8266, а в поле Data вводим Hello world! и жмем Publish. Если все сделали правильно, то внизу, там где мы видим топики, на которые подписаны мы должны увидеть продублированное наше сообщение, как на скриншоте

mqtt-spy hello world

mqtt-spy hello world

Теперь мы будем иметь возможность шпионить за всеми топиками, в которых что-либо будет опубликовано и, при необходимости, публиковать и свои данные.

Обсуждение mqtt-spy на нашем форуме

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

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

После установки Arduino IDE подключите библиотеку PubSubClient и залейте мой тестовый скетч mqtt.ino, откройте его в Arduino IDE, поправьте SSID и пароль WiFi сети, настроенной ранее на OpenWRT и заливайте в модуль. Если у вас все получилось, то в mqtt-spy вы увидите приходящие пакеты с ESP8266

esp8266 передает данные mosquitto

esp8266 передает данные mosquitto

Скетч отправляет пакет каждые 10 секунд — это удобно для отладки — не надо долго ждать. Если его настойчивость вас раздражает, то можете сами все поправить. Скетч предназначен только для демонстрации: его код я слепил из примера Ивана Грохоткова (igrr, автор Arduino IDE для ESP8266) и контрибьютера библиотеки PubSubClient — Imroy. Скетч тестировался мной сутками на Arduino IDE 1.6.4-758-ga194024 и PubSubClient версии 1.9, проявив завидную стабильность и надежность. Оставьте модуль ESP8266 включенным — пускай шлет данные в mosquitto — нам они скоро понадобятся.

Для отладки скетчей я использую свой ESPlorer даже не потому, что я его сам написал и поэтому очень люблю, а так совпало, что у него в терминальном окне подсветка синтаксиса в стиле LUA, так что простой текстовый вывод в терминале красиво подсвечивается. Мне, по крайней мере, он нравится много больше встроенного в Arduino IDE терминала.

esplorer mqtt

esplorer mqtt

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

Точно такого же клиента, в принципе, можно слепить и на NodeMCU, но памяти останется меньше и придется делать на какой-то старой версии, потому что в актуальной прошивке mqtt клиент сломан при подписке более чем на один топик.

Все отлично, идем дальше.

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

Сейчас мы установим прекрасный пакет mqttwarn, который позволяет передавать данные c любого mqtt брокера практически куда угодно. Кроме того, что было анонсировано в начале этой статьи он еще умеет передавать данные в Google Docs, Asterics, FreeSwitch, pastebin — список просто огромен и может быть дополнен, если написать плагин для нового сервиса.

Для начала необходимо установить python и модули к нему. Помните — никакой командной строки — идем в меню люси Система — Программное обеспечение, фильтруем python и устанавливаем следующие пакеты:

python

pythondistutils

pythonemail

pythonlogging

pythonncurses

pythonopenssl

pythonpip

и дополнительно

Скачиваем с гитхаба mqttwarn к себе на компьютер, распаковываем и с помощью Far Manager заливаем в каталог /overlay/mosquitto файл mqttwarn.py и полностью папку с плагинами services.

В mqttwarn не оказалось стартового скрипта для OpenWRT — мне пришлось написать его самому и сделать pull request, так что теперь он есть.

Копируем файл с локального компьютера /etc/OpenWRT.init на маршрутизатор под именем mqttwarn в каталог /etc/init затем через mc делаем File — ChMod и отмечаем галочками три пункта execute/search так чтобы справа получилось число 100755. В люси Система — Загрузка и включаем автозагрузку mqttwarn. Запускать этот сервис пока не нужно.

OpenWRT init

OpenWRT init

Далее создаем в /overlay/mosquitto файл mqttwarn.ini следующего содержания:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

[defaults]

hostname     = ‘localhost’

port         = 1883

username     = test

password     = test

clientid     = ‘mqttwarn’

lwt      = ‘clients/mqttwarn’

skipretained = False

cleansession = True

# MQTTv31 = 3   (default)

# MQTTv311 = 4

protocol     = 3

; logging

logformat = ‘%(asctime)-15s %(levelname)-5s [%(module)s] %(message)s’

logfile   = ‘mqttwarn.log’

; one of: CRITICAL, DEBUG, ERROR, INFO, WARN

loglevel     = DEBUG

; name the service providers you will be using.

launch = file, log, instapush, smtp, http, twitter

[config:file]

append_newline = True

targets = {

    ‘data’      : [‘/overlay/mosquitto/mqtt-data.log’],

    ‘mqttwarn’  : [‘/overlay/mosquitto/mqttwarn.err’],

    }

[config:log]

targets = {

    ‘info’   : [ ‘info’ ],

    ‘warn’   : [ ‘warn’ ],

    ‘crit’   : [ ‘crit’ ],

    ‘error’  : [ ‘error’ ]

  }

; special config for ‘failover’ events

[failover]

targets = log:error, file:mqttwarn

Предварительная настройка mqttwarn готова, теперь конфигурируем сервисы.

Обсуждение mqttwarn на нашем форуме

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

Если у вас еще нет аккаунта регистрируемся на thingspeak.com, создаем канал с произвольным именем, в канале задаем произвольные названия для Field1 и Field2. Тут же получаем Write API Key. Добавляем в /overlay/mosquitto/mqttwarn.init

[config:http]

timeout = 60

targets = {

                #method     #URL               # query params or None          # list auth

  ‘thingspeak’ : [ «get», «http://api.thingspeak.com/update?key=ВАШ API KEY&amp;field1={micros}&amp;field2={counter}», None, None ]

  }

[/ESP8266/DATA]

targets = http:thingspeak

Не забудьте вставить ваш Write API Key.

Теперь запускаем через люси Система — Загрузка — mqttwarn Запустить и смотрим графики на ThingSpeak. Через некоторое время там начнут появляться наши данные.

ESP8266+Mosquitto+mqttwarn+ThingSpeak

ESP8266+Mosquitto+mqttwarn+ThingSpeak

Если данных нет, то смотрите /overlay/mosquitto/mqttwarn.log и /overlay/mosquitto/mqttwarn.err и проверяйте настройки еще раз.

Передача данных через HTTP GET и POST запросы — это наиболее универсальное средство подключения к удаленным сервисам для передачи данных с ESP8266. Аналогичным образом вы можете настроить передачу на narodmon и любые другие сервисы. Делитесь своими успехами в специальной теме mqttwarn

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

Идем на mail.ru, регистрируем новую почту. Мне повезло — адрес esp8266@mail.ru оказался еще свободным :)

Добавляем в mqttwarn.ini

[config:smtp]

server    =  ‘smtp.mail.ru:25’

sender    =  «MQTTwarn «

username  =  esp8266@mail.ru

password  =  xxxxxxxxxxxxxxxx

starttls  =  True

targets = {

    ‘notify’     : [ ‘4refr0nt@gmail.com’ ]

    }

Подправляем секцию [/ESP8266/DATA]

[/ESP8266/DATA]

targets = http:thingspeak, smtp:notify

Перезагружаем mqttwarn и получаем каждые 10 секунд по письму :)

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

Регистрируемся на сервисе instapush, делаем все по этой инструкции, кроме пункта 4. В пункте 2 Application Title — ESP8266, Domain — например, esp8266.ru В пункте 3 указываем в поле Event Title: alerts, в поле Trackers сначала вводим object и, не нажимая Enter, жмем на клаве TAB, затем сюда же вводим action и снова TAB, в поле Push Message вводим {object} — {action} далее кликаем Add Event. Идем Dashboards — Apps, кликаем по нашему приложению, жмем +Add Events, добавляем в Event Title — gpio, Trackers — status и жмем TAB, в Push Message вводим Status {status} далее кликаем Add Event. В итоге должно получиться вот так

instapush

instapush

Из вкладки Basic Info копируем AppID и AppSecret и в mqttwarn.ini добавляем

[config:instapush]

appid = ‘xxxxxxxxxxxxxxxxxxxxxx’

appsecret = ‘yyyyyyyyyyyyyyyyyyyyyyyyyyyyy’

targets = {

             # event   # tracker

  ‘alerts’ : [ ‘alerts’, {«object»:«counter», «action»:‘{counter}’}],

  ‘gpio’   : [ ‘gpio’  , {«status»:‘{status}’}]

  }

Подправляем секцию [/ESP8266/DATA]

[/ESP8266/DATA]

targets = http:thingspeak, smtp:notify, instapush:alerts

На смартфон устанавливаем мобильное приложение

AppStore     AndroidStore

Залогиниваемся в мобильном приложении, перезагружаем mqttwarn и наслаждаемся уведомлениями, которые прилетают каждые 10 секунд :)

Adroid Instapush

Adroid Instapush

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

Идем на молодой «идиотский» стартап www.dioty.co регистрируемся, жмем Get Started и получаем данные облачного MQTT брокера

DIoTY.co

DIoTY.co

Построим бридж с нашего mosquitto на облачный MQTT DIoTY.

Добавляем в /etc/mosquitto/mosquitto.conf (префиксы меняете на свои)

connection dioty

address mqtt.dioty.co:1883

topic ESP8266/CONTROL/# in 0 / /4refr0nt@gmail.com/

topic ESP8266/STATUS/# out 0 / /4refr0nt@gmail.com/

bridge_attempt_unsubscribe true

notifications false

start_type automatic

remote_username ваш логин на DIoTY

remote_password ваш пароль, который пришел в письме

Перезапускаем mosquitto, идем в люси Статус — Системный журнал и ищем в логах что-то вроде этого

Wed Jun  3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge local.OpenWrt.dioty doing local SUBSCRIBE on topic /ESP8266/STATUS/#

Wed Jun  3 09:04:26 2015 local5.notice mosquitto[19498]: Connecting bridge dioty (mqtt.dioty.co:1883)

Wed Jun  3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge OpenWrt.dioty sending CONNECT

Wed Jun  3 09:04:26 2015 local5.debug mosquitto[19498]: Received CONNACK on connection local.OpenWrt.dioty.

Wed Jun  3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge local.OpenWrt.dioty sending SUBSCRIBE (Mid: 1, Topic: /4refr0nt@gmail.com/ESP8266/CONTROL/#, QoS: 0)

Wed Jun  3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge local.OpenWrt.dioty sending UNSUBSCRIBE (Mid: 2, Topic: /4refr0nt@gmail.com/ESP8266/STATUS/#)

Wed Jun  3 09:04:26 2015 local5.debug mosquitto[19498]: Received SUBACK from local.OpenWrt.dioty

Если у вас все так же — поздравляю, вы построили MQTT Bridge. Коннектимся mqtt-spy к облачному брокеру DIoTY и подписывемся на топик, на который у нас есть права

Проверяем мост. Нашему mosquitto через mqtt-spy публикуем топик

В поле Data пишем — false, жмем Publish, переключаемся на вкладку с соединением DIoTY и убеждаемся, что то же самое false попало в облако в топик

/4refr0nt@gmail.com/ESP8266/STATUS/GPIO/4

Если да, то отлично, уже почти готово. Еще проверим, управляется ли ESP8266 GPIO4 по MQTT.

С помощью mqtt-spy на mosquitto публикуем топик /ESP8266/CONTROL/GPIO/4 c Data  true — светодиод на GPIO4 должен загореться и в ответ должен прилететь топик /ESP8266/STATUS/GPIO/4 с Data {«status»:»LOW»}.

Пробуем потушить: /ESP8266/CONTROL/GPIO/4 false, светодиод тухнет и прилетает /ESP8266/STATUS/GPIO/4 с Data {«status»:»HIGH»}

В логах тоже все отображается:

esplorer dioty.co

esplorer dioty.co

Теперь то же самое будем делать намного проще и со смартфона.

Скачиваем мобильное приложение DIoTY

AppStore     AndroidStore

В мобильном приложении логинимся, жмем Menu — Add. Name заполняем gpio4 CONTROL, Type выбираем on-off switch в поле Topic пишем /4refr0nt@gmail.com/ESP8266/CONTROL/GPIO/4 жмем Save. Снова жмем Menu — Add, Namegpio4 status, Type выбираем readonly value, Topic /4refr0nt@gmail.com/ESP8266/STATUS/GPIO/4 и жмем Save. Вот инструкция с картинками.

Правим секцию [/ESP8266/STATUS/GPIO/4]

[/ESP8266/STATUS/GPIO/4]

targets = instapush:gpio

Перезапускаем mqttwarn. Все. Теперь у вас должно получиться все точно так же, как на видео в начале статьи.

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

Сначала из консоли устанавливаем python-twitter

pip install pythontwitter

Регистрируем новый аккаунт в твиттере, привязваем его к номеру телефона (без этого нам не дадут зарегистрировать приложение). Дальше идем на apps.twitter.com, добавляем приложение. Обязательно к заполнению название, описание и сайт приложения. Можно заполнять хоть что — это ни на что не влияет. Далее идем на вкладку Keys And Access Tokens и копируем оттуда ключи для конфигурационного файла.

В /overlay/mosquitto/mqttwarn.ini добавляем

[config:twitter]

targets = {

  ‘tweet’ : [ ‘aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa’,  # consumer_key

              ‘bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb’,  # consumer_secret

              ‘ccccccccccccccccccccccccccccccccc’,  # access_token_key

              ‘ddddddddddddddddddddddddddddddddd’   # access_token_secret

            ]

   }

Правим секцию [/ESP8266/STATUS/GPIO/4]

[/ESP8266/STATUS/GPIO/4]

targets = instapush:gpio, twitter:tweet

Перезапускаем mqttwarn, дергаем GPIO с телефона и смотрим твиты

ESP8266 Twitter

ESP8266 Twitter

Это далеко не единственный способ публиковать твиты — еще можете использовать возможности приложений ThingSpeak для получения аналогичного результата.

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

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

Если провайдер вам выдает динамический IP адрес, то вам поможет сервис Dynamic DNS. В люси устанавливаем пакеты

ddnsscripts

luciappddns

lucii18nddnsru

Регистрируемся на сайте noip.com — это один из немногих DDNS сервисов, который предоставляет услуги пока бесплатно, требуется лишь ежемесячно заходить в свой аккаунт продлевать бесплатную подписку. Полученные данные (имя хоста, например esp8266.ddns.net, имя пользователя и пароль) забиваем в новый пункт меню в люси — Сервисы — Динамический DNS. Тут единственная тонкость в том, что нужно в расширенных настройках IP address source выбрать URL, а ниже вписать http://checkip.dyndns.com иначе сервису DDNS будет передаваться ваш приватный адрес 192.168.1.100, а не внешний, присвоенный провайдером.

Сейчас ваш домашний роутер, который смотрит в интернет, вы (да и любой другой) смогут найти в сети по имени esp8266.ddns.net. Чтобы попасть на mosquitto из внешнего мира потребуется пробросить порт 1883 с роутера IoT на роутер, подключенный напрямую к интернету. Эта настройка зависит от модели роутера — у меня Asus. Захожу в Дополнительные настройки — Виртуальный сервер 

Virtual Server

Virtual Server

Теперь соединения инициированные из интернета к esp8266.ddns.net:1883 будут автоматически пробрасываться на ваш роутер с mosquitto.

Теперь регистрируемся на CloudMQTT, заходим в консоль и в разделе Manage Bridges Connection URL вводим mqtt://test:test@esp8266.ddns.net:1883, Direction Both, а префиксы можно не указывать.

Сейчас вы можете посмотреть логи mosquitto на предмет входящих подключений, подключиться к CloudMQTT через mqtt-spy и погонять топики туда-сюда.

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

Более предпочтительным и простым способом подключения к CloudMQTT является создание моста на стороне mosquitto — просто делаете ниже в mosquitto.conf еще одно соединение по аналогии с DIoTY.

Если вы найдете мобильное, десктопное или веб приложение, способное подключаться к CloudMQTT (точнее к любому MQTT брокеру) и интуитивно просто дергать за GPIO как в DIoTY, только с большим количеством возможностей — сообщите мне и я добавлю информацию в эту статью.

Важные замечания.

В этой статье приведены примеры, указаны направления, а не даны законченные решения. В статье и скетче не предусмотрено сохранение состояния GPIO в случае ребута (ждем когда в Arduino IDE будет реализована работа с файловой системой). Не затронуты вопросы повышения безопасности путем использования SSL. Не реализованы режимы сна для снижения энергопотребления в автономных устройствах. Однако, все описанное в этой статье реально работает и вполне может быть использовано в домашней автоматизации.

Купить эту желтенькую отладочную плату с ESP-12

Обсуждение этой статьи у нас на форуме

Обсуждение mqttwarn

Обсуждение Arduino IDE

Обсуждение домашних IoT серверов

Обсуждение облачных IoT сервисов

openHAB Community

Loading

  • Mikrotik netinstall не видит роутер
  • Mikrotik настройка роутера и точек доступа
  • Mikrotik роутер wifi 8 портов
  • Mikrotik cap ac подключить к роутеру
  • Mru что это в роутере