Перейти к содержимому

Поднимаем HTTP-сервер на роутере Keenetic ( для OTA обновлений и не только )

Добрый день, уважаемые читатели! В данной статье я расскажу о том, как быстро и просто поднять свой собственный небольшой и легкий WEB-сервер на роутере Keenetic. Нужен он нам будет для того, чтобы с него можно было бы обновлять прошивки разных “умных штуковин” на ESP8266 и ESP32 через WiFi по технологи ОТА. Впрочем, вы вполне можете использовать его и для других целей, но в данной статье я буду рассматривать его только в данном контексте.

Если вы еще не знаете что такое ОТА, и для чего оно нужно, то рекомендую вам ознакомиться с другими статьями:

 


Почему именно Keenetic?

Ну во первых потому, что он у меня есть 😁. И даже не один… Но не только поэтому.

В моделях Keenetic, оснащенных USB-портом, кроме моделей Keenetic 4G (KN-1210/1211), можно воспользоваться менеджером пакетов OPKG. Он позволяет устанавливать сторонние программные пакеты Entware на USB-накопитель для расширения возможностей интернет-центра. Без необходимости перепрошивки роутера на OpenWRT. 

Кроме собственно роутера из списка поддерживаемых моделей вам потребуется USB-накопитель или HDD/SSD-диск с USB-интерфейсом.

Но для того, чтобы запустить http-сервер на роутере, не обязательно иметь роутер Keenetic – наверняка можно сделать это и на других моделях. Например я встретил такой вот комментарий на хабре, из которого следует, что похожие действия можно провернуть и на TP-Link:

Но, вероятнее всего, для этого его (роутер) придется перепрошить сторонней прошивкой OpenWRT.

 


Подготовка к работе

Прежде всего, необходимо установить менеджер пакетов OPKG на роутер. Как это сделать, я уже описывал в другой статье “Поднимаем личный MQTT-сервер на Keenetic” и вы можете воспользоваться ей вплоть до раздела “4. Настройка репозитория Entware” включительно. Думаю, в данной статье нет особой необходимости повторять то же самое. И если у вас уже OPKG установлен и работает, то само собой, ещё раз устанавливать не нужно.

Но я бы рекомендовал вам обратить внимание и на официальные инструкции:

Ну все-таки моя графомания – это моя, она может и устареть после какого-либо обновления. Пока она вроде бы соответствует истине, но кто знает… А официальные инструкции по идее должны бы поддерживаться в актуальном состоянии.

На этом будем считать что подготовку вы выполнили, успешно зашли через Putty / SSH на роутер и готовы к установке сервера…

 


Какой сервер выбрать?

Если погуглить тему “http-сервер на keenetic” то натыкаешься на статьи, к которых предлагается установить на keenetic сервер nginx. Возможно, он и не плох, и конечно же имеет право на жизнь, но встречается несколько комментариев (правда 2017 года), в которых указывается, nginx может грузить процессор роутера до 100%. В процессе изучения в одной из статей (на хабре) я наткнулся на интересный комментарий:

В общем, решил попробовать установить другой web-сервер – lighttpd. Lighttpd – это безопасный, быстрый и гибкий веб-сервер, который эффективно использует память и процессор и потребляет меньше ресурсов, чем другие популярные веб-серверы. Его расширенный набор функций (FastCGI, CGI, аутентификация, сжатие вывода, перезапись URL-адресов и многое другое) делает Lighttpd идеальным веб-сервером для всех систем, малых и больших. Lighttpd выпускается под пересмотренной лицензией BSD с открытым исходным кодом.

 


Установка и настройка на роутере

Как я уже упоминал, к этому моменту предполагается, что вы уже получили доступ к менеджеру пакетов OPKG через SSH.

Для начала обновим список доступных пакетов командой 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
~ #

Открыв список доступных пакетов, отфильтруем по ключевому слову lighttpd:

Нажмите для увеличения

Как видим, к установке доступны модули на все случаи жизни. Какие выбрать?

Для обновления прошивки через ОТА от web-сервера потребуется только одна единственная функция – разместить файл с прошивкой и сделать его доступным для ESP. Никакие дополнительные скрипты типа cgi и php нам не потребуются (но только если вы не планируете использовать его для чего-то ещё, например для личного сайта или панели управления).  

Поэтом смело ставим “чистый” lighttpd и всё:

~ # opkg install lighttpd

Ставится он очень быстро и сам себя добавляет в автозагрузку без каких-либо ручных манипуляций. После перезагрузки роутера web-сервер запустится и будет готов к работе, но… не спешите этого делать.

 

А что начет SSL / TLS?

В принципе, ESP-IDF требует, чтобы соединение с HTTP-сервером, с которого скачивается файл с прошивкой, было обязательно защищено TLS. Но если мы не собираемся выпускать этот сервер “наружу” и будем использовать его только в собственной локальной сети, то я не вижу ничего страшного в том, чтобы использовать и не защищенные соединения в данном конкретном случае. По умолчанию ESP-IDF откажется загружать прошивки с такого сервера, но ниже я расскажу, как изменить это поведение.

Если же вы всё-таки хотите использовать защищенные соединения, то вам кроме собственно установки дополнительного модуля opensll, придется решать непростой вопрос с сертификатами вашего сервера. Проще всего создать самоподписанный сертификат – как это сделать я описывал в той же статье “Поднимаем личный MQTT-сервер на Keenetic“. Но в данном случае я не стал заморачиваться с этой проблемой.

 

Особенности работы дополнительного web-сервера на роутере

Прежде чем мы перейдем к настройкам, вспомним следующее. По умолчанию любой web-сервер слушает два порта:

  • 80 – для незащищенных соединений
  • 443 – для защищенных соединений

Но на роутере эти порты уже заняты под стандартный web-интерфейс и мы не сможем их использовать. Поэтому нам придется использовать другие, например 81 вместо 80. А заодно выясним, куда нужно будет копировать файлы прошивок.

Для удобства будем использовать Miвnight Commander – с помощью него уже смотрим каталог /opt/etc/lighthpd:

Здесь нам нужен файл конфигурации – lighthpd.conf, выделите его и нажмите [F4] для его редактирования.

### Documentation
# https://wiki.lighttpd.net/
#
### Configuration Syntax
# https://wiki.lighttpd.net/Docs_Configuration
#
### Configuration Options
# https://wiki.lighttpd.net/Docs_ConfigurationOptions
#
### Configuration Variables (potentially used in /opt/etc/lighttpd/conf.d/*.conf)
var.log_root    = "/opt/var/log/lighttpd/"
var.server_root = "/opt/share/www/"
var.state_dir   = "/opt/var/run/"
var.home_dir    = "/opt/var/lib/lighttpd/"
var.conf_dir    = "/opt/etc/lighttpd"
var.vhosts_dir  = server_root + "/vhosts"
var.cache_dir   = "/opt/var/cache/lighttpd"
var.socket_dir  = home_dir + "/sockets"

### OpenWRT lighttpd base configuration
server.document-root        = server_root
server.upload-dirs          = ( "/opt/tmp" )
server.errorlog             = log_root + "error.log"
server.pid-file             = state_dir + "lighttpd.pid"
#server.username             = "http"
#server.groupname            = "www-data"

# historical; preserved for compatibility; should have been disabled by default
index-file.names            = ( "index.php", "index.html",
                                "index.htm", "default.htm",
                              )

static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

include "/opt/etc/lighttpd/mime.conf"
include "/opt/etc/lighttpd/conf.d/*.conf"

### Customizations
# customizations should generally be placed in separate files such as
#   /opt/etc/lighttpd/conf.d/00_vars.conf    # override variables for conf.d/*.conf
#   /opt/etc/lighttpd/conf.d/zz_custom.conf  # override other conf.d/*.conf settings 

Здесь нам в первую очередь интересна секция переменных, из которой мы узнаем, что корневой папкой нашего web-сервера (куда и необходимо будет “складывать” все файлы для публикации, является “/opt/share/www/“. Разумеется, можно использовать подпапки.

В этом файле нам потребуется как минимум добавить одну единственную строчку:

### OpenWRT lighttpd base configuration
server.document-root        = server_root
server.port                 = 81
server.upload-dirs          = ( "/opt/tmp" )
server.errorlog             = log_root + "error.log"
server.pid-file             = state_dir + "lighttpd.pid"
#server.username             = "http"
#server.groupname            = "www-data" 

Всё остальное – по вашему вкусу. Я не трогал больше никаких настроек. Сохраняем изменения и перезагружаем роутер.

После перезагрузки подключаемся к USB-диску роутера любым удобным способом и копируем в корневую папку HTML-страничку любого содержания в ANSI-кодировке. Например такую index.html:

<!DOCTYPE html>
<html>
<head>
<title>Тестовая страничка!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Тестовая страничка!</h1>
<p>Это простая статическая тестовая страничка, абсолютно ничего интересного.</p>
</body>
</html>

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

Если вы видите это, значит ваш сервер работает нормально!

Если вы не планируете использовать только что созданный сервер в качестве хостинга для внешнего сайта, то больше никаких настроек не требуется. Переходим к самому главному – как все это использовать для OTA обновлений.

 


Используем LIGHTTPD в качестве OTA-сервера

Вначале нам необходимо скопировать скомпилированнsй BIN-файл прошивки на сервер. Где его взять, я писал в статьях “OTA-обновления для ESP8266 и Arduino” и “Механизм OTA обновлений прошивки “по воздуху” для ESP32 и ESP-IDF“. Если вы помните, в них я рекомендовал создавать на внешнем хостинге для OTA-файлов каталог посекретнее – что то вроде “4BC869EC16134B5397AA5C77CEFDE5C2“, чтобы никто кроме вас не смог обнаружить и скачать эти файлы. Для локального сервера это не обязательно, достаточно создать просто папку ota, а внутри неё – подпапки для каждого из ваших устройств. Всё равно по умолчанию ваш только что созданный сервер не виден “снаружи” и никто кроме вас доступа к нему не имеет. Однако, если вы планируете открыть его во внешний мир, рекомендую вам не упрощать себе жизнь.

Итак, я создал папку /opt/share/www/ota/boiler/, а внутри поместил файл прошивки firmware.bin:

В принципе, все уже готово к тестированию. Но…. на пока ESP-IDF “не взлетит”.

Как я уже сказал, для обновлений ESP внутри обслуживаемой роутером сети не обязательно использовать httpS-соединения. Но по умолчанию ESP-IDF не позволяет обновлять прошивку через простое http-соединение.

Переходим в каталог проекта и запускаем утилиту SDK Config. Для platformio сделать это можно с помощью команды “pio run -t menuconfig“, для espressif ide – просто щелкните по файлу sdkconfig. Ищем раздел (Top) → Component config → ESP HTTPS OTA и устанавливаем флаг Allow HTTP for OTA (WARNING: ONLY FOR TESTING PURPOSE, READ HELP).

Сохраняем изменения [CTRL]+[S] и заливаем один раз прошивку в устройство по проводу (или через защищенный сторонний сервер). После этого все готово к тестированию.

Открываем любой MQTT-клиент, например MQTT Explorer, и отправляем в топик <LOCATION>/<DEVICE>/system/ota ссылку на файл с обязательным указанием порта, например так: http://192.168.1.1:81/ota/boiler/firmware.bin

Кликните для увеличения

В ответ в чат telegram должны поступить такое сообщение и устройство перезагрузится:

 


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

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


Пожалуйста, оцените статью:
[ 5 из 5, всего 3 оценок ]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *