• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 работает по локальной сети, не работает через роутер

saharesp

New member
Здравствуйте, уважаемые знатоки!
Собрал себе домашнюю сеть из модулей ESP8266. Задача для сети: включение и выключение потребителей с телефона через WI-FI по протоколу ESP-NOW. Один модуль ESP8266 используется в качестве сервера с веб-интерфейсом, через него команды передаются на другой модуль ESP8266. Я подключаюсь к нему через браузер напрямую по WI-FI, все работает. Решил сделать доступ к нему из интернета. Настроил роутер, назначил постоянный IP-адрес. В браузере без проблем попадаю на страницу с веб-интерфейсом и из интернета и из WI-FI соединения с роутером. А тут начинаются чудеса. Кнопка на странице веб-интерфейса работает: включает-выключает. Но до другого модуля команда не доходит. Скетч заливаю в Arduino IDE. В мониторе порта я вижу ошибку доставки сообщения. Предполагаю, что проблема в настройках роутера. Если кто сталкивался с такой проблемой, прошу помочь.
 

Сергей_Ф

Moderator
Команда форума
Ничего не понял, но попробую догадаться.
Если вы подключаетесь к esp в режиме точки доступа, то команды проходят по ESP-NOW на другие модули.
Если же подключиться к esp в режиме STA, то команды по ESP-NOW не идут.
Так? Или что-то другое?
Роутер не участвует в доставке команд по ESP-NOW, насколько я понимаю.
Если я правильно догадался, то вот тут решение вашей проблемы.
 
Последнее редактирование:

saharesp

New member
Ничего не понял, но попробую догадаться.
Если вы подключаетесь к esp в режиме точки доступа, то команды проходят по ESP-NOW на другие модули.
Если же подключиться к esp в режиме STA, то команды по ESP-NOW не идут.
Так? Или что-то другое?
Роутер не участвует в доставке команд по ESP-NOW, насколько я понимаю.
Если я правильно догадался, то вот тут решение вашей проблемы.
Да, вы все верно поняли. В этом направлении я уже пытался найти решение, но не получилось. Так как роутер настраивал впервые, подумал, что здесь что-то не так.
По вашей ссылке пример кода у меня не работает.
Если я вставляю код как в примере:
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
то ничего не меняется.
Но если я меняю строки местами:
WiFi.begin(ssid, password);
WiFi.mode(WIFI_AP_STA);
то выключение работает, а включение нет. И пакеты с выключением доходят по ESP-NOW до другого модуля. А при включении также ошибка доставки. Пока так. Буду дальше экспериментировать. Написал этот пост в благодарность за подсказку в направлении поиска.
 
Предполагаю, что когда "напрямую", то обе esp работают на 1 канале wifi, поэтому пакеты доходят. Когда первая esp подключается к роутеру, то работает на канале роутера, например 6, отправляет по этому каналу на вторую, а до второй не доходит, потому что она на 1 канале и не знает что первая отправляет на 6.
 

Сергей_Ф

Moderator
Команда форума
Предполагаю, что когда "напрямую", то обе esp работают на 1 канале wifi, поэтому пакеты доходят. Когда первая esp подключается к роутеру, то работает на канале роутера, например 6, отправляет по этому каналу на вторую, а до второй не доходит, потому что она на 1 канале и не знает что первая отправляет на 6.
Именно это и написано по ссылке выше. ТС не удосужился прочитать всё что там написано.
 

saharesp

New member
Прошу прощения, я не силен в этой теме. Но верно, вся проблема в каналах, я уже понял. И именно роутер выделяет канал, в моем случае, 8. А ESP между собой по локалке общались по 1 каналу. Моя ESP8266 не имеет своего SSID, и работает без пароля. На нее сигнал отправляется по MAC-address.
Решение, как я понимаю, даже уверен, здесь:
int32_t getWiFiChannel(const char *ssid)
Но мне было бы удобней вместо SSID использовать MAC-address. Пока ищу такое решение. Для использования SSID тоже есть вариант: плата в сети WI-FI имеет свое имя, несмотря на то, что я SSID не прописывал нигде.
 

saharesp

New member
Код:
int32_t channel = 11;
esp_wifi_set_channel(channel, ...
Добавил я этот код, правда пришлось изменить немного, так как Arduino IDE не хотел с ним работать. Думаю из-за того что он для ESP32.
Получился вот такой код:
uint8_t channel = 8;
wifi_set_channel(channel);
Теперь работает примерно 50 на 50.
Код:
06:19:45.776 -> GPIO 5 off
06:19:46.995 -> Bytes received: 1
06:19:46.995 -> 0
06:19:46.995 -> GPIO 5 on
06:19:48.213 -> Bytes received: 40
06:19:48.213 -> 1
06:19:48.213 -> GPIO 5 off
06:19:49.384 -> Bytes received: 1
06:19:49.384 -> -1723821349
06:19:51.492 -> Bytes received: 40
06:19:51.492 -> 1
06:19:51.492 -> GPIO 5 off
06:19:55.142 -> Bytes received: 1
06:19:55.142 -> 1
06:19:55.142 -> GPIO 5 off
Это я взял часть кода, где видны ошибки.
 
Только учтите что роутер при перезагрузке может поменять канал если в настройках установлено "авто".
 

saharesp

New member
koltinov222
Вы как то странными намеками разговариваете. Естественно, я помню тему: https://esp8266.ru/forum/threads/va...w-i-zagruzki-ix-po-wifi-na-server.4855/page-2. Там от вас готовое решение в этой области, возможно (или скорей всего) и мой случай. Set не получается применить, наверное все-таки get. Просто мои выходные начинаются с понедельника.))
 
Да никаких намеков.

По первому, вам надо что-то решить со сменой канала роутером при перезагрузке, а то в какой-то момент перестанет работать ваше изделие. Есть несколько вариантов, у каждого есть + и -. Самое простое и лёгкое это зафиксировать канал в настройках роутера.

По второму, 40 байт команда на вкл/выкл это много, что-то у вас там не правильно в коде отправителя. Не исключено что это "неправильно" не единственное и возможно поэтому 50/50 успех передачи.
 

saharesp

New member
По первому, вам надо что-то решить со сменой канала роутером при перезагрузке, а то в какой-то момент перестанет работать ваше изделие. Есть несколько вариантов, у каждого есть + и -. Самое простое и лёгкое это зафиксировать канал в настройках роутера.

По второму, 40 байт команда на вкл/выкл это много, что-то у вас там не правильно в коде отправителя. Не исключено что это "неправильно" не единственное и возможно поэтому 50/50 успех передачи.
Я как раз и работаю в данном направлении. Канал в настройках роутера не настраиваемый, уже весь мануал перечитал. Но всегда это канал 8. Я номер канала установил в скетчах такими строками:
uint8_t channel = 8;
wifi_set_channel(channel);
Кроме этого возможно была ошибка в структуре. Я отправляю два значения: 0 или 1. Сейчас структура выглядит так:
typedef struct test_struct {
int test1_int;
} ;
Возможно в этих строках есть грамматические ошибки, т.к. я не нашел описания как правильно оформлять wifi_set_channel и struct . Сейчас у меня размер команд на вкл/выкл 1 байт. Но стабильности приема сигнала пока нет.
 

saharesp

New member
В общем не смог воспользоваться функциями set и get для настройки канала. Потом даже забросил. Сегодня установил канал на роутере (нашел где настраивать), такой же как на ESP8266 и все заработало, причем очень быстро и без ошибок.
 
Сверху Снизу