##
Полнофункциональный WiFi NAT-маршрутизатор (а теперь также WiFi-ретранслятор, он же L2-мост)
**НОВИНКА 2026:** _Спустя 10 лет после первого релиза он наконец стал тем, чем всегда притворялся:**настоящим WiFi-ретранслятором**. Чтобы не ломать существующую документацию и ссылки, стандартная редакция по-прежнему остаётся известной версией NAT-маршрутизатора со всеми расширенными функциями. Но если вас интересует урезанный настоящий L2-мост, смотрите ниже раздел ESP8266 WiFi Repeater - L2 bridge._
Это реализация WiFi NAT-маршрутизатора на esp8266 и esp8285. Она также включает поддержку межсетевого экрана с фильтрацией пакетов и ACL, проброс портов, формирование трафика, хуки для удалённого мониторинга (или перехвата пакетов), интерфейс управления MQTT, простое взаимодействие с GPIO и управление питанием. Для настройки с несколькими маршрутизаторами в mesh-сети для покрытия большей площади добавлен новый режим «Automesh».
_Если вы ищете способ интегрировать функцию NAT в свой проект Arduino_ — смотрите здесь .
EPS32 NAT Router — это продвинутый проект для _ESP32_.
Типичные сценарии использования включают:
* Простой удлинитель диапазона для существующей WiFi-сети
* Питаемые от батареи уличные (mesh) сети
* Настройка дополнительной WiFi-сети с другим SSID/паролем для гостей
* Настройка защищённой и ограниченной сети для устройств IoT
* Преобразование сетей WPA2 Enterprise в WPA-PSK
* Мониторинговый зонд для анализа WiFi-трафика
* Сетевые эксперименты с маршрутами, ACL и формированием трафика
* Mesh-устройство IoT с базовыми возможностями ввода/вывода и управлением через MQTT
По умолчанию ESP работает как STA и как soft-AP и прозрачно передаёт любой IP-трафик через себя. Поскольку используется NAT, записи маршрутизации не требуются ни на стороне сети, ни на подключённых станциях. По умолчанию станции настраиваются через DHCP в сети 192.168.4.0/24 и получают адрес DNS-резолвера из существующей WiFi-сети.
Измерения показывают, что он может достигать примерно 5 Мбит/с в обоих направлениях, так что возможна даже потоковая передача.
Для прямой прошивки устройства используйте Web-Installer.
esp_wifi_repeater запускается со следующей конфигурацией по умолчанию:
* ap_ssid: MyAP, ap_password: none, ap_on: 1, ap_open: 1
После первой загрузки (или сброса к заводским настройкам) он будет предлагать WiFi-сеть с открытой точкой доступа и SSID «MyAP». При этом он ещё не пытается автоматически переподключаться к вышестоящей точке доступа (поскольку не знает корректный SSID или пароль).
Подключитесь к этой WiFi-сети и выполните базовую настройку либо через простой веб-интерфейс, либо через консоль — полную настройку со всеми параметрами.
Веб-интерфейс позволяет настраивать все параметры, необходимые для базовой функции пересылки. Спасибо rubfi за основную работу над этим: . Укажите в браузере адрес « Должна появиться эта страница:
.
Если хотите, можете отметить флажок «lock» и нажать «Lock». Теперь конфигурацию нельзя изменить, пока вы не разблокируете её паролем вышестоящей WiFi-сети (задайте его, даже если сеть открыта).
Если вы хотите ввести не-ASCII или специальные символы в веб-интерфейсе, вам нужно использовать HTTP-подобное шестнадцатеричное кодирование, например «My%20AccessPoint». В результате получится строка «My AccessPoint». С помощью этого шестнадцатеричного кодирования можно ввести любое байтовое значение, кроме 0 (по внутренним причинам C).
Если вы ошиблись и потеряли всякую связь с ESP, вы всё ещё можете использовать последовательную консоль для восстановления («reset factory», см. ниже).
Расширенная настройка выполняется через командную строку в консольном интерфейсе. Эта консоль доступна либо через последовательный порт со скоростью 115200 бод, либо через TCP-порт 7777 (например, «telnet 192.168.4.1 7777» с подключённой STA).
Используйте следующие команды для первоначальной настройки:
* set password your_home_router's_password
Опять же, если вы хотите ввести не-ASCII или специальные символы, вы можете использовать HTTP-подобное шестнадцатеричное кодирование (например, «My%20AccessPoint») или, только в CLI, в качестве сокращения — C-подобные кавычки с обратной косой чертой (например, «My\ AccessPoint»). Оба метода дадут строку «My AccessPoint».
Командная строка понимает гораздо больше команд:
Достаточно, чтобы заработать почти в любом окружении.
* help: выводит краткое справочное сообщение
* set [ssid|password] _value_ : изменяет настройки вышестоящей точки доступа (WiFi-конфигурация вашего домашнего маршрутизатора); для открытых сетей используйте пароль «none».
* set [ap_ssid|ap_password] _value_ : изменяет настройки soft-AP ESP (для ваших станций)
* show [config|stats]: выводит текущую конфигурацию или некоторую информацию о состоянии и статистику
* save [dhcp]: сохраняет текущие параметры конфигурации, ACL и записи маршрутизации [+ текущие DHCP-аренды] во flash
* lock [_password_]: сохраняет и блокирует текущую конфигурацию, изменения не разрешены. Пароль можно не указывать, если он уже был задан ранее (по умолчанию это пароль вышестоящей WiFi-сети)
* unlock _password_ : разблокирует конфигурацию; требуется пароль из команды lock
* reset [factory]: перезагружает ESP; 'factory' опционально сбрасывает параметры WiFi к значениям по умолчанию (на заблокированном устройстве работает только из последовательной консоли)
Большинство set-команд вступают в силу только после save и reset.
Любая часть ввода командной строки после одиночного символа «#» до конца строки будет рассматриваться как комментарий и игнорироваться.
* set automesh [0|1]: выбирает, включён ли режим automesh (по умолчанию выключен); подробности здесь
* set am_threshold _dB_ : задаёт порог «плохого» соединения (в отрицательных дБ, по умолчанию 85, т.е. -85 дБ)
* set am_scan_time _secs_ : задаёт интервал времени в секундах, в течение которого ESP в режиме automesh пытается найти вышестоящую точку доступа перед переходом в сон (0 — отключено, по умолчанию)
* set am_sleep_time _secs_ : задаёт интервал времени в секундах, в течение которого ESP спит в режиме automesh, если вышестоящая точка доступа не найдена (0 — отключено, по умолчанию)
* set ap_on [0|1]: выбирает, отключён ли soft-AP (ap_on=0) или включён (ap_on=1, по умолчанию)
* set ap_open [0|1]: выбирает, использует ли soft-AP защиту WPA2-PSK (ap_open=0, автоматически, если задан ap_password) или открыт (ap_open=1)
* set auto_connect [0|1]: выбирает, должна ли STA продолжать попытки переподключения к точке доступа. auto_connect выключен (0) после первой прошивки или после «reset factory». Когда вы вводите новый SSID, он автоматически устанавливается в положение вкл. (1).
* set ssid_hidden [0|1]: выбирает, скрыт ли SSID soft-AP (ssid_hidden=1) или видим (ssid_hidden=0, по умолчанию)
* set phy_mode [1|2|3]: задаёт PHY_MODE WiFi (1=b, 2=g, 3=n (по умолчанию))
* set country _CC_ : задаёт регулирующий код страны WiFi в виде двухбуквенного кода ISO 3166-1 (например, «US», «DE», «CN», «JP»). Коды, отличные от US, разблокируют каналы 12 и 13. Пустое значение (по умолчанию) оставляет стандартное значение SDK без изменений. Параметр сохраняется во flash и применяется заново при каждой загрузке.
* set bssid _xx:xx:xx:xx:xx:xx_ : задаёт конкретный BSSID вышестоящей точки доступа для подключения (по умолчанию 00:00:00:00:00:00 — означает любую)
* set [ap_mac|sta_mac] _xx:xx:xx:xx:xx:xx_ : задаёт MAC-адрес STA и SOFTAP как пользовательское значение (бит 0 первого байта MAC-адреса не может быть 1)
* set sta_mac random: задаёт новый случайный STA MAC после каждой перезагрузки
* set sta_hostname _name_ : задаёт имя STA (видимое вышестоящей точке доступа)
* set max_clients [1-8]: задаёт количество STA, которые могут подключиться к SoftAP (предел реализации SoftAP в ESP — 8, по умолчанию)
* scan: выполняет сканирование точек доступа
* connect: пытается подключиться к точке доступа с текущими настроенными _ssid_ и _password_
* disconnect: отключается от любой вышестоящей точки доступа
* set use_peap[0|1]: выбирает, должна ли STA подключаться через простой WPA-PSK (use_peap=0, по умолчанию) или через WPA2 Enterprise (PEAP)
* set peap_identity _value_ : задаёт «внешний» идентификатор PEAP (строка, которая сначала предъявляется RADIUS-серверу, например [email protected])
* peap_username _value_ : задаёт имя пользователя PEAP
* peap_password _value_ : задаёт пароль PEAP
* set network _ip-addr_ : задаёт IP-адрес внутренней сети; сеть всегда /24, маршрутизатор всегда x.x.x.1
* set dns _dns-addr_ : задаёт статический DNS-адрес, который распространяется клиентам через DHCP
* set dns dhcp: настраивает использование динамического DNS-адреса из DHCP, по умолчанию
* set ip _ip-addr_ : задаёт статический IP-адрес для интерфейса STA
* set ip dhcp: настраивает динамический IP-адрес для интерфейса STA, по умолчанию
* set netmask _netmask_ : задаёт статическую маску подсети для интерфейса STA
* set gw _gw-addr_ : задаёт статический адрес шлюза для интерфейса STA
* set max_nat _no_of_entries_ : задаёт размер таблицы NAPT (по умолчанию 512)
* set max_portmap _no_of_entries_ : задаёт размер таблицы portmap (по умолчанию 32)
* set tcp_timeout _secs_ : задаёт таймаут NAPT для TCP-соединений (0=по умолчанию (1800 сек))
* set udp_timeout _secs_ : задаёт таймаут NAPT для UDP-соединений (0=по умолчанию (2 сек))
* set lease _min_ : задаёт время аренды в минутах для DHCP-сервера внутренней сети (по умолчанию 120)
* show dhcp: выводит текущее состояние таблицы DHCP-аренд
* show route: отображает текущую таблицу маршрутизации
* route clear: очищает все статические маршруты
* route add _network_ _gw_ : добавляет статический маршрут к сети (сеть задаётся в нотации CIDR ('x.x.x.x/n')) через шлюз gw
* route delete _network_ : удаляет статический маршрут к сети
* interface _inX_ [up|down]: устанавливает состояние интерфейса up или down (нет IP-маршрутизации/трафика через интерфейсы down, по умолчанию: up)
* set nat [0|1]: выбирает, используется ли NAT на интерфейсе soft-AP (nat=1, по умолчанию) или нет (nat=0). Без NAT прозрачная пересылка трафика от внутренних STA не работает! Полезно в основном в сочетании со статической маршрутизацией.
* portmap add [TCP|UDP] _external_port_ _internal_ip_ _internal_port_ : добавляет проброс порта
* portmap remove [TCP|UDP] _external_port_ : удаляет проброс порта
* nslookup _name_ : выполняет DNS-запрос для указанного имени и отображает результат
* ping _host_ : проверяет IP-связность с помощью ICMP-запроса/ответа (хост как IP-адрес или DNS-имя)
### Конфигурация межсетевого экрана/мониторинга
* acl [from_sta|to_sta|from_ap|to_ap] [TCP|UDP|IP] _src-ip_ [_src_port_] _desr-ip_ [_dest_port_] [allow|deny|allow_monitor|deny_monitor]: добавляет новое правило в ACL
* acl [from_sta|to_sta|from_ap|to_ap] clear: очищает весь ACL
* show acl: показывает заданные ACL и некоторую статистику
* set acl_debug [0|1]: включает/выключает отладочный вывод ACL — все отклонённые пакеты будут записываться в терминал
* set [upstream_kbps|downstream_kbps] _bitrate_ : задаёт максимальную исходящую/входящую битовую скорость (0 — без ограничения, по умолчанию)
* set daily_limit _limit_in_KB_ : задаёт максимальное количество килобайт, которое STA могут передать за день (0 — без ограничения, по умолчанию)
* set timezone _hours_offset_ : задаёт локальный часовой пояс (требуется, чтобы знать, когда день заканчивается в 00:00)
* monitor [on|off|acl] _port_ : запускает и останавливает сервер мониторинга на указанном порту
### Конфигурация пользовательского интерфейса
* set config_port _portno_ : задаёт номер порта для входа в консоль (по умолчанию 7777, 0 отключает удалённую настройку через консоль)
* set web_port _portno_ : задаёт номер порта веб-сервера настройки (по умолчанию 80, 0 отключает веб-настройку)
* set config_access _mode_ : управляет сетями, которым разрешён доступ к настройке через консоль и веб (0: нет доступа, 1: только внутренняя, 2: только внешняя, 3: обе (по умолчанию))
* show gpio: отображает конфигурацию GPIO
* gpio [0-16] mode [_in_ |_in_pullup_ |_out_]: настраивает порт GPIO ESP (сохраняется во flash)
* gpio [0-16] set [_high_ |_low_]: записывает в выходной порт
* gpio [0-16] set [_high_ |_low_] for _seconds_ : записывает в выходной порт и возвращает обратно через определённое время
* gpio [0-16] get: читает из входного порта
* gpio [0-16] trigger [0-16] [_monostable_NO_ |_monostable_NC_ |_bistable_NO_ |_bistable_NC_]: связывает входной порт с выходным, либо как моностабильный нормально разомкнутый (кнопка срабатывает при переходе состояния в низкий уровень), моностабильный нормально замкнутый (кнопка срабатывает при переходе состояния в высокий уровень), бистабильный нормально разомкнутый (переключатель, повторяющий вход) или бистабильный нормально замкнутый (переключатель, состояние которого противоположно входу)
* gpio [0-16] trigger none: очищает связь
* set speed [80|160]: задаёт тактовую частоту CPU (по умолчанию 160 МГц)
* sleep _seconds_ : переводит ESP в глубокий сон на указанное количество секунд. Допустимые значения от 1 до 4294 (приблизительно 71 минута)
* set status_led _GPIOno_ : выбирает вывод GPIO для светодиода состояния (по умолчанию 2, >16 отключено)
* set hw_reset _GPIOno_ : выбирает вывод GPIO для аппаратного сброса к заводским настройкам (>16 отключено, по умолчанию)
* set ap_watchdog _secs_ : задаёт таймаут сторожевого таймера AP — если в течение _secs_ не получено пакетов от вышестоящей точки доступа, ретранслятор перезагружается («none» — без таймаута, по умолчанию)
* set client_watchdog _secs_ : задаёт таймаут сторожевого таймера клиента — если в течение _secs_ не получено пакетов ни от одного подключённого клиента, ретранслятор перезагружается («none» — без таймаута, по умолчанию)
* set vmin _voltage_ : задаёт минимальное напряжение батареи в мВ. Если Vdd падает ниже, ESP переходит в глубокий сон. Если 0, ничего не происходит
* set vmin_sleep _secs_ : задаёт интервал времени в секундах, в течение которого ESP спит при низком напряжении
В конфигурации по умолчанию GPIO2 настроен на управление светодиодом состояния (подключённым к GND) со следующими индикациями:
* постоянно горит: запущен, но не подключён к точке доступа (нет корректного внешнего IP)
* мигает (1 раз в секунду): работает, подключён к точке доступа
* мигает непериодически: работает, есть трафик во внутренней сети
С помощью «set status_led GPIOno» вывод GPIO можно изменить (любое значение > 16, например, «set status_led 255» полностью отключит светодиод состояния). При настройке на GPIO1 он работает со встроенным синим светодиодом на платах ESP-01. Однако, поскольку GPIO1 также является выводом UART-TX, это означает, что последовательная консоль не работает. Тогда настройка ограничивается сетевым доступом.
# Аппаратный сброс к заводским настройкам
Если прижать выбранный GPIO к низкому уровню более чем на 3 секунды, ретранслятор выполнит сброс к заводским настройкам и перезапустится с конфигурацией по умолчанию. С помощью «set hw_reset GPIOno» вывод GPIO можно изменить (любое значение > 16, например, «set hw_reset 255» отключит функцию аппаратного сброса).
Для многих модулей, включая ESP-01s и NodeMCU, вероятно, хорошей идеей будет использовать для этого GPIO 0, так как он всё равно используется. Однако это не вывод по умолчанию, поскольку он может помешать при подтягивании к земле во время прошивки. Поэтому, если вы хотите использовать существующую кнопку на GPIO 0 для аппаратного сброса, настройте её с помощью «set hw_reset 0» и «save» после прошивки. Сброс, вызванный аппаратным выводом, НЕ сбросит настроенный номер GPIO для hw_reset (это сделает «reset factory» из консоли).
Чтобы разрешить клиентам из внешней сети подключаться к серверному порту во внутренней сети, порты должны быть сопоставлены. Внешний порт сопоставляется с внутренним портом конкретного внутреннего IP-адреса. Используйте для этого команду «portmap add». Сопоставления портов можно вывести командой «show», и они сохраняются вместе с текущей конфигурацией.
Однако, чтобы гарантировать, что нужное устройство прослушивает определённый IP-адрес, необходимо убедиться, что это устройство имеет тот же IP-адрес после перезагрузки его самого или ESP. Для этого можно либо настроить фиксированные IP-адреса на устройствах, либо ESP должен запоминать свои DHCP-аренды. Это достигается командой «save dhcp». Она сохраняет текущее состояние и все DHCP-аренды, чтобы они были восстановлены после перезагрузки. Список DHCP-аренд можно вывести командой «show stats».
Поддержка WPA2 Enterprise (PEAP) теперь включена в проект. Она позволяет создать «конвертер», который преобразует корпоративную сеть WPA2 с аутентификацией PEAP в сеть WPA2-PSK. Это решает распространённую проблему, особенно в университетской среде: локальная WiFi-сеть является корпоративной сетью WPA2 с аутентификацией PEAP-MSCHAPv2. Очень яркий пример — сеть «eduroam», доступная во многих университетах по всему миру. Проблема в том, что многие устройства IoT не могут работать с аутентификацией WPA2 Enterprise. Поэтому разработка и демонстрации затруднены. Очень полезен «конвертер», который входит в сеть WPA2 Enterprise и предлагает своим клиентам более простую сеть WPA-PSK.
Для его использования задайте следующие параметры конфигурации: ssid, use_peap, peap_identity, peap_username и peap_password (обычный параметр password не нужен). Эта настройка должна выполняться (и сохраняться) через CLI и недоступна в веб-интерфейсе.
Код в настоящее время не проверяет сертификат RADIUS-сервера. Он уязвим для MITM-атак, когда кто-то разворачивает мошенническую точку доступа и RADIUS-сервер. Хотя пароль не передаётся в открытом виде, используемый MSCHAPv2, как известно, взломан. Также имейте в виду, что ESP8266 теперь содержит пароль вашей корпоративной сети. Весь трафик, который он пересылает, теперь может быть соотнесён сетевым администратором с вашей учётной записью. Не злоупотребляйте этим и не предоставляйте его недоверенным лицам, например, настраивая открытую сеть. И даже когда устройство заблокировано, пароль вашей корпоративной сети может быть извлечён через последовательный порт из flash ESP в открытом виде.
Иногда вам может потребоваться использовать несколько esp_wifi_repeaters подряд или в mesh-сети, чтобы покрыть большее расстояние или площадь. В целом это можно сделать без каких-либо проблем с NAT-маршрутизаторами; фактически у вас будет несколько уровней NAT. Однако это означает, что связность ограничена: все узлы могут выходить в интернет, но обычно между узлами нет прямой IP-связности. И, конечно, доступная пропускная способность снижается с каждым дополнительным хопом. Но пользователи сообщают, что даже 5 esp_wifi_repeaters подряд работают вполне хорошо.
В такой конфигурации настройка является довольно трудоёмким и чреватым ошибками занятием. Чтобы упростить это, esp_wifi_repeater теперь имеет новый режим: «Automesh». Просто настройте SSID и пароль и включите «automesh» (либо в CLI командой «set automesh 1», либо в веб-интерфейсе, просто установив флажок). Это приведёт к следующему:Каждый esp_wifi_repeater, настроенный таким образом, будет автоматически предоставлять сеть WiFi на AP с тем же SSID/паролем, к которому он подключён. Клиенты могут использовать те же настройки WiFi для исходной сети или для повторённых. Каждый esp_wifi_repeater, настроенный с "automesh", сначала ищет лучшую другую AP для подключения. Это та, которая находится ближе всего к исходной сети WiFi и имеет наилучшую мощность сигнала (RSSI).
Мощность сигнала легко измерить с помощью сканирования, но как определить, какая из нескольких AP с одинаковым SSID находится ближе всего к исходной сети WiFi? Поэтому протокол использует несколько грязный трюк: esp_wifi_repeater'ы в режиме "automesh" манипулируют своим BSSID (на самом деле, согласно стандарту IEEE 802.11, это "ESSID", так как это AP, но SDK называет его "BSSID"), т.е. MAC-адресом своего AP-интерфейса, который отправляется в каждом beacon-кадре примерно 10 раз в секунду. Используется формат: 24:24:mm:rr:rr:rr. "24:24" — это просто уникальный идентификатор повторителя (существует минимальная вероятность коллизии с MAC реальных AP, но этим можно пренебречь, так как при необходимости этот префикс можно изменить). "mm" означает "уровень mesh" — это расстояние в переходах до исходной сети WiFi. Последние три "rr:rr:rr" — просто случайные числа для различения различных ESP. Исходная AP сохраняет свой BSSID, т.е. та, что без префикса "24:24", распознаётся как корневая и называется уровнем mesh 0.
 с исходной WiFi AP в качестве корня и повторяющими узлами на нескольких уровнях mesh (на самом деле это работает примерно так же, как Spanning Tree Protocol (STP) на канальном уровне или маршрутизация на сетевом уровне с использованием протокола вектора расстояния). Как только обнаруживается потеря uplink-соединения, конфигурация перезапускается. Это должно предотвращать петли, так как во время (пере)конфигурации также не отправляются beacon-кадры с BSSID.
Для удобства esp_wifi_repeater после настройки "automesh" сначала пытается проверить, может ли он подключиться к uplink AP. Если это не удаётся, даже когда AP с правильным SSID найдена, он предполагает, что пользователь ошибся с паролем, и сбрасывается к заводским настройкам. После того как он однажды успешно подключился, он предполагает, что конфигурация верна, и продолжает попытки после потери соединения или сброса столько, сколько потребуется (чтобы избежать DoS-атаки с неправильно настроенной AP).
Если в зоне действия находится более одного ESP, может возникнуть компромисс между более коротким "плохим" путём и более длинным "хорошим" путём (хорошим и плохим с точки зрения качества канала). Параметр _am_threshold_ определяет, что считается плохим соединением: если RSSI при сканировании меньше этого порога, соединение плохое, и предпочтителен путь с ещё одним переходом. Т.е. при _am_threshold_ , равном 85, и при обнаружении в сканировании двух automesh-узлов: A с уровнем 1 и RSSI -88 dB и B с уровнем 2 и RSSI -60 dB, соединение с A считается слишком плохим (-88 dB | Router| | 192.168.1.20 STA-ESP2-AP 10.0.2.1|
Каждый ESP имеет вторую сеть за своей точкой доступа с разными сетевыми адресами: 10.0.1.0/24 и 10.0.2.0/24. ESP1 может пинговать ESP2 по адресу 192.168.1.20, но не 10.0.2.1, так как не знает, что может достичь его через 192.168.1.20. Это изменится, если добавить два статических маршрута. На ESP1:```
и на ESP2:``` route add 10.0.1.0/24 192.168.1.10
Теперь «ping 10.0.2.1» на ESP1 будет успешным. Он отправляется на 192.168.1.20, а затем на него отвечает ESP2.
Теперь в каждой сети подключается дополнительный клиент (с адресами 10.0.1.2 и 10.0.2.2):```
| STA1 10.0.1.2 | | 10.0.1.1 ESP1 192.168.1.10 | | Router| | 192.168.1.20 ESP2 10.0.2.1| | STA2 10.0.2.2 |
Теперь даже клиент STA1 с локальным адресом 10.0.1.2 может пинговать STA2 с адресом 10.0.2.2, поскольку он сначала отправляет свой запрос своему маршрутизатору по умолчанию ESP1, а тот знает, что все пакеты на адрес 10.0.2.0/24 должны пересылаться на 192.168.1.20. Там ESP2 знает, как доставить их до STA2. То же самое применимо и к ответу в обратном направлении.
Это позволяет настроить звездообразную топологию с несколькими центрами из ESP, в которой каждый ESP и его STA-клиенты могут напрямую связываться друг с другом (без необходимости в пробросе портов). Настройка требуемых маршрутов может быть несколько утомительной, но это хорошее упражнение по сетевым технологиям. Следующим шагом мог бы стать перенос динамического протокола маршрутизации, например RIP, на ESP...
Установив параметры upstream_kbps и downstream_kbps в значение, отличное от 0 (по умолчанию используется 0), вы можете ограничить максимальный битрейт точки доступа ESP. Это значение является лимитом, который применяется к трафику всех подключённых клиентов. Пакеты, превышающие заданный битрейт, отбрасываются. Формирователь трафика использует алгоритм «Token Bucket» с размером ведра, равным в настоящее время четырёхкратному битрейту в секунду, что позволяет допускать всплески, если до этого трафика не было.
Начиная с версии 1.3 в маршрутизаторе есть встроенный MQTT-клиент (благодаря Tuan PM за его библиотеку Это помогает интегрировать маршрутизатор/репитер в Интернет вещей (IoT). Система домашней автоматизации может, например, принимать решения на основе информации о текущих подключённых станциях, включать и выключать репитеры (например, по расписанию) или просто использоваться для контроля нагрузки. Маршрутизатор может подключаться как к локальному MQTT-брокеру, так и к публично доступному брокеру в облаке. Однако в настоящее время TLS-шифрование не поддерживается.
По умолчанию MQTT-клиент отключён. Его можно включить, задав конфигурационному параметру «mqtt_host» имя хоста, отличное от «none». Для настройки MQTT можно задать следующие параметры:
* set mqtt_host _IP_or_hostname_ : IP-адрес или имя хоста MQTT-брокера («none» отключает MQTT-клиент)
* set mqtt_port _port_ : Порт MQTT-брокера, используемый для подключения (по умолчанию: 1883)
* set mqtt_qos _QoS_ : значение QoS MQTT для публикаций и подписок (0-2, по умолчанию: 0)
* set mqtt_user _username_ : Имя пользователя для аутентификации («none», если на брокере не требуется аутентификация)
* set mqtt_password _password_ : Пароль для аутентификации
* set mqtt_id _clientId_ : Идентификатор клиента на брокере (по умолчанию: «ESPRouter_xxxxxx», полученный из MAC-адреса)
* set mqtt_prefix _prefix_path_ : Префикс для всех публикуемых тем (по умолчанию: «/WiFi/ESPRouter_xxxxxx/system», также полученный из MAC-адреса)
* set mqtt_command_topic _command_topic_ : Тема, на которую подписываются для получения команд, аналогично командам из консоли. (по умолчанию: «/WiFi/ESPRouter_xxxxxx/command», «none» отключает команды через MQTT)
* set mqtt_interval _secs_ : Задаёт интервал, с которым маршрутизатор публикует темы состояния (по умолчанию: 15 с, 0 отключает публикацию состояния)
* set mqtt_mask _mask_in_hex_ : Выбирает, какие темы публикуются (по умолчанию: «ffff» означает все)
Параметры MQTT можно просмотреть с помощью команды «show mqtt».
Маршрутизатор может периодически публиковать следующие темы состояния (каждые mqtt_interval):
* _prefix_path_ /Uptime: время работы системы с момента последней перезагрузки в секундах (маска: 0x0020)
* _prefix_path_ /Vdd: напряжение источника питания в мВ (маска: 0x0040)
* _prefix_path_ /Bpsin: КБайт/с от станций в точку доступа (маска: 0x0800)
* _prefix_path_ /Bpsout: КБайт/с из точки доступа к станциям (маска: 0x0800)
* _prefix_path_ /Bpd: КБайт в день от станций и к станциям (маска: 0x0400)
* _prefix_path_ /Ppsin: пакетов/с от станций в точку доступа (маска: 0x0200)
* _prefix_path_ /Ppsout: пакетов/с из точки доступа к станциям (маска: 0x0200)
* _prefix_path_ /Bin: общее количество байт от станций в точку доступа (маска: 0x0100)
* _prefix_path_ /Bout: общее количество байт из точки доступа к станциям (маска: 0x0100)
* _prefix_path_ /NoStations: количество станций, в данный момент подключённых к точке доступа (маска: 0x2000)
* _prefix_path_ /TopologyInfo: JSON-структура с текущей информацией о топологии узла (маска: 0x1000)
Кроме того, репитер может публиковать сообщения на основе событий:
* _prefix_path_ /join: MAC-адрес станции, подключающейся к точке доступа (маска: 0x0008)
* _prefix_path_ /leave: MAC-адрес станции, отключающейся от точки доступа (маска: 0x0010)
* _prefix_path_ /IP: IP-адрес маршрутизатора, полученный по DHCP (маска: 0x0002)
* _prefix_path_ /ScanResult: отдельная тема для результатов команды «scan» (одно сообщение на каждую найденную точку доступа) (маска: 0x0004)
* _prefix_path_ /ACLDeny: пакет был отклонён правилом ACL и отброшен (маска: 0x0080)
В качестве LWT и отчёта о состоянии репитер публикует:
* _prefix_path_ /status: ретенционная тема со значением «online» (сразу после подключения репитера) или «offline» (после потери соединения, как LWT)
Маршрутизатор можно настраивать с помощью следующих тем:
* _command_topic_ : маршрутизатор подписывается на эту тему и интерпретирует все сообщения как командные строки
* _prefix_path_ /response: маршрутизатор публикует в этой теме вывод командной строки (маска: 0x0001)
Если вы хотите, чтобы маршрутизатор публиковал, например, только Vdd, свой IP-адрес и вывод командной строки, установите mqtt_mask в 0x0001 | 0x0002 | 0x0040 (= «set mqtt_mask 0043»).
Теперь esp_wifi_repeater поддерживает сетевой контроллер ENC28J60, подключаемый через SPI (благодаря Эндрю Кроллу за его отличную работу по доведению этого до ума), если включить параметр компиляции HAVE_ENC28J60 в «user_config.h». Ethernet-интерфейс будет поддерживать пропускную способность около 1 Мбит/с при работе ESP на частоте 160 МГц. Если включить интерфейс AP и использовать Ethernet в качестве восходящего канала, esp_wifi_repeater превратится в недорогую точку доступа для WiFi-устройств (например, других ESP).
Подключение через SPI должно быть следующим:``` NodeMCU/Wemos ESP8266 ENC28J60
Короткие и пропаянные провода работают лучше всего. Кроме того, вам понадобится транзистор для развязки GPIO15, иначе ваш ESP больше не загрузится, см.: . Также важно иметь хороший источник питания: ENC28j60 потребляет около 160 мА в активном режиме. У меня это не работает, если я пытаюсь использовать 3.3V с платы ESP.
Теперь вы можете настроить новый интерфейс Ethernet:
- set eth_enable [0|1]: включает/отключает сетевой адаптер ENC28J60 Ethernet на шине SPI (по умолчанию: 0 - выключено)
- set eth_ip _ip-addr_: задаёт статический IP-адрес для интерфейса ETH
- set eth_netmask _netmask_: задаёт статическую маску подсети для интерфейса ETH
- set eth_gw _gw-addr_: задаёт статический адрес шлюза для интерфейса ETH
- set eth_dhcpd [0|1]: запускает DHCP-сервер для раздачи динамических IP-адресов на интерфейсе ETH, (по умолчанию: 0 - выключено)
Ретранслятор контролирует текущее напряжение питания (отображается в команде "show stats"). Это работает только в том случае, если 107-й байт в esp_init_data_default.bin, называемый vdd33_const, установлен в 255 (0xFF). Самый простой способ добиться этого — записать esp_init_data_default_v08_vdd33.bin во flash (см. ниже).
Если _vmin_ (в мВ, по умолчанию 0) установлен в значение > 0 и напряжение питания падает ниже этого значения, устройство перейдёт в режим глубокого сна на _vmin_sleep_ секунд. Если вы подключили GPIO16 к RST (что сложно пропаять на ESP-01), оно перезагрузится после этого интервала, попытается переподключиться и продолжит измерения. Если _vmin_ сохранён в конфигурации, устройство будет засыпать снова и снова, пока напряжение питания не поднимется выше порога. Эти настройки особенно (только?) полезны, если вы питаете ESP от (литиевой) батареи без защиты от глубокого разряда. Тогда значение 2900mV-3000mV, вероятно, будет полезно, так как оно снижает энергопотребление ESP до минимума, и у вас будет гораздо больше времени, чтобы зарядить или заменить батарею до повреждения. Это имеет смысл только в том случае, если ESP подключён напрямую к батарее. Если у вас есть дополнительная логика, она всё равно будет разряжать батарею.
Вы можете отправить ESP в сон вручную один раз, используя команду "sleep".
Внимание: Если вы сохраните значение _vmin_ выше максимального напряжения питания во flash, ретранслятор будет немедленно выключаться каждый раз после перезагрузки. Тогда вам придётся стереть всю конфигурацию, прошив blank.bin (или любой другой файл) по адресу 0x0c000.
Теперь проект предлагает два различных режима работы: **NAT Router** и **Layer 2 Bridge** (называемый «режимом ретранслятора»). Хотя оба режима расширяют зону покрытия сети, они принципиально различаются тем, как обрабатывают трафик и идентичность устройств.
В этом режиме, как описано выше, устройство действует как стандартный шлюз. Оно создаёт новую подсеть и выполняет трансляцию сетевых адресов (NAT) для всех устройств, подключённых к его точке доступа (AP).
* **Изоляция подсети**: Подключённые клиенты находятся в частной подсети (например, 192.168.4.x) и изолированы от основной сети.
* **Идентификация трафика**: Весь трафик от клиентов выглядит для основного маршрутизатора так, как будто он исходит от собственного IP/MAC-адреса ESP8266.
* **Простота**: Не требует специальной настройки вышестоящего маршрутизатора и совместим практически со всеми стандартными Wi-Fi сетями.
* **Ограничение**: Устройства в основной сети не могут легко инициировать подключение к устройствам за ретранслятором из-за барьера NAT, если не использовать проброс портов.
### Режим Layer 2 Bridge (вариант «ретранслятора»)
Этот режим реализует прозрачный мост на втором (канальном) уровне. ESP8266 расширяет существующую основную сеть, а не создаёт вторичную подсеть.
* **Прозрачный мост**: ESP8266 мостит трафик на уровне кадров Ethernet. Подключённые клиенты получают IP-адреса напрямую от DHCP-сервера основной сети (через DHCP snooping/relay).
* **Единая сеть**: Все устройства (и за ретранслятором, и на основном маршрутизаторе) находятся в одном широковещательном домене L2.
* **Видимость устройств**: Устройства за ретранслятором сохраняют свои исходные MAC и IP-адреса в основной сети. Это позволяет протоколам локального обнаружения (таким как mDNS/Bonjour, UPnP или сетевое обнаружение) работать без проблем во всей сети.
* **Сложность**: Требует продвинутой обработки, такой как Proxy ARP и DHCP snooping, чтобы вышестоящая сеть правильно маршрутизировала трафик обратно к «скрытым» клиентам, подключённым через ретранслятор.
* **Сценарий применения**: Идеально, когда требуется обнаружение устройств (например, управление принтером или устройством умного дома через приложение на телефоне) во всей сети.
Режим ретранслятора имеет меньше функций: маршрутизация, проброс портов и DHCP не требуются, ACL и Automesh также не имеют особого смысла, как и сетевой мониторинг через pcap. Поэтому все эти функции недоступны в режиме ретранслятора. Также MQTT был удалён. Остальные функции по-прежнему доступны через консоль или удалённую консоль.
Предварительно скомпилированные бинарные файлы можно найти в папке "firmware-repeater".
Первоначальная настройка версии режима ретранслятора в целом так же проста, как и для NAT Router. Через последовательную консоль просто задайте ssid, password, ap_ssid и ap_password, затем сохраните и перезагрузите устройство. Если вы хотите сделать это через веб-интерфейс, это тоже просто, но нужно соблюдать правильный порядок:
- Направьте браузер на "
- Введите **сначала** ssid и пароль в AP Settings, примените настройки и перезагрузите устройство
- Затем подключитесь к только что заданному ssid точки доступа и снова направьте браузер на "
- Теперь введите ssid и пароль в STA settings и подключитесь
Как только STA ssid задан, ретранслятор больше не запускает собственный DHCP-сервер, а получает IP-адрес от вышестоящего DHCP (адрес 192.168.4.1 больше не используется). Чтобы подключиться к его веб-странице или удалённой консоли, вы можете использовать имя "esp-wifi-repeater.local", если ваш клиент поддерживает mDNS, либо вам придётся узнать назначенный адрес в вышестоящем маршрутизаторе (или через последовательную консоль с помощью "show stats"). Вы всегда можете сбросить ESP через консоль и команду "reset factory".
| Feature | NAT Router | Layer 2 Bridge |
| **Сетевая архитектура** | Создаёт новую изолированную подсеть | Расширяет существующий широковещательный домен |
| **IP-адресация** | Клиенты используют вторичный пул адресов | Клиенты используют вышестоящий DHCP-сервер |
| **Обнаружение (mDNS/UPnP)** | Часто блокируется/затруднено | Полностью поддерживается (прозрачно) |
| **Видимость в вышестоящей сети** | Идентичность клиента скрыта (NAT) | Идентичность клиента сохраняется |
| **Реализация** | Стандартные сетевые механизмы | Продвинутое проксирование (Proxy ARP/Snooping) |
Для непосредственной прошивки предварительно скомпилированных бинарных файлов на устройство используйте [Web-Installer](
Если у вас установлен Docker, самый простой способ получить доступ к полной среде сборки — подключить ваш ESP8266 к /dev/ttyUSB0 и запустить образ следующей командой:```
git clone
docker run -it --rm --device=/dev/ttyUSB0 -v $(pwd)/esp_wifi_repeater:/ /esp/esp_wifi_repeater martinfger/iot_devel:1.0
Чтобы собрать версию L2 WiFi Repeater, просто используйте опцию VARIANT=bridge для команды make:``` git clone docker run -it --rm --device=/dev/ttyUSB0 -v $(pwd)/esp_wifi_repeater:/ /esp/esp_wifi_repeater martinfger/iot_devel:1.0 cd esp_wifi_repeater make VARIANT=bridge make flash
Чтобы настроить среду сборки с нуля и собрать этот бинарный файл, скачайте и установите esp-open-sdk (я предлагаю эту версию с базовым NONOS SDK 2.2: Убедитесь, что вы можете скомпилировать и прошить включённый пример "blinky".
Затем скачайте это дерево исходников в отдельный каталог и настройте переменную BUILD_AREA в Makefile и любые нужные параметры в user/user_config.h. Изменения конфигурации по умолчанию можно внести в user/config_flash.c. Соберите прошивку esp_wifi_repeater командой "make". "make flash" прошивает её на esp8266.
Дерево исходников включает бинарную версию liblwip_open плюс необходимые дополнительные заголовочные файлы из моего форка esp-open-lwip и бинарный файл инструмента rboot. *Для этого не требуется дополнительных действий по установке.* Только если вы не хотите использовать предварительно скомпилированную библиотеку, получите исходники с . Используйте их, чтобы заменить каталог "esp-open-lwip" в дереве esp-open-sdk. Выполните "make clean" в каталоге esp_open_lwip и снова "make" в верхнем каталоге esp_open_sdk. Это скомпилирует liblwip_open.a, содержащую функции NAT. Замените liblwip_open_napt.a этим бинарным файлом. Также вы можете собрать бинарный файл "rboot.bin" из и заменить его в корневом каталоге проекта.
*Обновление*: если вы где-то в интернете встречали инструкции по установке с использованием "0x10000.bin" — из-за OTA теперь это изменено на "0x02000.bin".
Если вы хотите использовать готовые предварительно скомпилированные бинарные файлы прошивки, вы можете прошить их с помощью "esptool.py --port /dev/ttyUSB0 write_flash -fs 4MB -ff 80m -fm dio 0x00000 firmware/0x00000.bin 0x02000 firmware/0x02000.bin" (для ESP-01 используйте -fs 1MB). Для esp8285 необходимо использовать -fs 1MB и -fm dout.
В Windows вы можете прошить её с помощью "ESP8266 Download Tool", доступного по адресу Скачайте два файла 0x00000.bin и 0x02000.bin из каталога firmware. Для обычного ESP12, NodeMCU или Wemos D1 используйте следующие настройки (для ESP-01 измените FLASH SIZE на "8Mbit"):
Если режим "QIO" не работает на вашем устройстве, попробуйте "DIO". Также обратите внимание на "Detected Info", чтобы проверить размер и режим микросхемы flash. Если загруженная прошивка всё равно не запускается должным образом, проверьте с помощью прилагаемых контрольных сумм, не повреждены ли бинарные файлы. Если вы сомневаетесь, что бинарные файлы прошивки повреждены, скачайте полный репозиторий в виде zip-архива и извлеките бинарные файлы из этого zip — это позволяет избежать проблем при загрузке по HTTP (например, преобразований CR-LF).
# Поддержка обновления OTA (Over the air)
Основано на использовании библиотеки rboot: и благодаря вкладу christianchristensen.
Процесс сборки создаёт две копии бинарного файла esp_wifi_repeater в каталоге firmware: 0x02000.bin и 0x82000.bin. Для первоначальной установки достаточно прошить только 0x00000.bin (загрузчик rboot) и 0x02000.bin (одну копию программы). esp_wifi_repeater будет работать.
Если у вас есть как минимум 1 МБ flash, вы можете выполнить обновление OTA (Over the air) другой версией. То есть вы можете в интерактивном режиме загрузить новый бинарный файл из CLI и переключиться на него. Другой бинарный файл загружается в текущую неактивную область памяти (либо 0x02000 (rom0), либо 0x82000 (rom1)) и запускается в случае успеха. Вы также можете в интерактивном режиме переключаться между двумя установленными бинарными файлами. Текущая конфигурация будет использоваться для обоих бинарных файлов (пока её формат не изменился).
Вы можете управлять функциями OTA с помощью следующих команд:
- show ota: показывает текущий активный бинарный файл и URL следующего обновления
- set ota_host _hostname_: задаёт имя хоста или IP-адрес OTA-сервера (по умолчанию: "none")
- set ota_port _portno_: задаёт номер порта OTA-сервера (по умолчанию: 80)
- ota update: пытается загрузить новый бинарный файл (0x02000.bin или 0x82000.bin) по HTTP с ota_host:ota_port и запускает его
- ota switch: переключает на другой бинарный файл (если он установлен)
Чтобы проверить функцию OTA, настройте ваш ESP (как STA или AP) на подключение к сети с сервером обновлений. Затем запустите простой веб-сервер в каталоге firmware, например;```
Установите параметр _hostname_ на имя хоста или IP вашего компьютера, установите _portno_ на 8080 и нажмите «Сохранить». Затем введите в командной строке:``` ota update
Если настроено правильно, обновление начнётся, и ESP перезагрузится с новой прошивкой.
- Из-за ограничений реализации SoftAP в ESP существует максимум 8 одновременно подключённых станций.
- ESP8266 требует хорошего источника питания, так как при передаче возникают скачки тока до 170 мА (обычное среднее потребление составляет около 70 мА при включённом Wi-Fi). Сначала проверьте источник питания, если ваш ESP работает нестабильно и время от времени перезагружается. Большой конденсатор между Vdd и Gnd может помочь, если вы столкнулись с такими проблемами.
Программное обеспечение с открытым исходным кодом. Сторонние исходные файлы имеют собственный заголовок лицензии. Ко всем остальным файлам применяется лицензия MIT.
The full story
This article is one source in a clustered incident — the cluster page carries the summary, timeline and every other outlet covering it.
