• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 и все заработало, причем очень быстро и без ошибок.
 
Сверху Снизу