• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Посоветуйте доработку скетча для надежности

CCat

Member
Можно, я подытожу для себя?

Эта часть кода будет выглядеть так:
Код:
  if (connectWifi == "y") { //выполняется при старте Ардуины исходящей от нее командой, но думал оставить возможность дать команду снова, если не получаю нужной строки какое-то время

    WiFi.mode(WIFI_STA); //только клиент
    if (String(ssid) != WiFi.SSID() || String(password) != WiFi.psk()) {
      WiFi.begin(ssid, password);
    } else {
      WiFi.begin();
    }

    if (WiFi.getAutoConnect() != true) WiFi.setAutoConnect(true);
    WiFi.setAutoReconnect(true);
.....
Мне интересно - при исполнении этого кода, раз при старте ESP сам постарается законнектиться, произойдет реконнект из-за WiFi.begin(); или ESP "пожмет плечами", типа "так я ж уже" и не будет пытаться переконнектиться? В принципе, это ни на что не повлияет, но интересно. Не нашел в доках ответа на этот вопрос.
 

enjoynering

Well-known member
если убрать WiFi.begin(); но оставить WiFi.setAutoConnect(true); то модуль подключиться. надеюсь я ответил на ваш вопрос.

ну теперь вместо
Код:
WiFi.mode(WIFI_STA); //только клиент
лучше
Код:
 WiFi.enableSTA(true);
 
  • Like
Реакции: CCat

kab

New member
(WiFi.getAutoConnect() != true)
А я всё-таки посоветовал бы конструкции типа "... = true" и "... != true" не использовать.
Код
[inline](!WiFi.getAutoConnect())[/inline]
короче, понятнее, логичнее. И при трансляции в машинный код несколько короче.

Конечно, это сущая мелочь, но тем не менее...:)
 

enjoynering

Well-known member
а можно пруф или упоминание в доках в студию, что после трансляции !WiFi.getAutoConnect() кроче WiFi.getAutoConnect() = ! true

спасибо
 

Алексей.

Active member
enjoynering, После таких советов
(!WiFi.getAutoConnect())
короче, понятнее, логичнее
люди перестают задумываться, что явное указание вызова оператора сравнения для объектов определенного типа хоть что либо значит, и продолжают использовать вызов оператора сравнения для целочисленного значения не только для логических типов, но и для указателей, после попыток использовать такую практику на других языках программирования таких как .net или java, приходит разочарование "Почему же я на си использовал if (some_ptr) и работало, а сейчас на .net ругается???".
 

kab

New member
а можно пруф или упоминание в доках в студию, что после трансляции !WiFi.getAutoConnect() кроче WiFi.getAutoConnect() = ! true

спасибо
:)Вынужден признать - насчет экономии кода - погорячился. Похоже компилятор достаточно "умный", чтобы эти ситуации разрешать.
 

enjoynering

Well-known member
enjoynering, После таких советов

люди перестают задумываться, что явное указание вызова оператора сравнения для объектов определенного типа хоть что либо значит, и продолжают использовать вызов оператора сравнения для целочисленного значения не только для логических типов, но и для указателей, после попыток использовать такую практику на других языках программирования таких как .net или java, приходит разочарование "Почему же я на си использовал if (some_ptr) и работало, а сейчас на .net ругается???".

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

спасибо.
 

CCat

Member
если убрать WiFi.begin(); но оставить WiFi.setAutoConnect(true); то модуль подключиться. надеюсь я ответил на ваш вопрос.
Спасибо за столько полезной информации!
Ну я еще умозрительно интересовался, вызывает ли WiFi.begin(); реконнект, если на момент его вызова и так уже Station подключена к точке доступа.
Хотя какая разница - главное, чтобы коннект был. ;)
 

Алексей.

Active member
каждый раз когда вызываете WiFi.begin(ssid, password); ардуино презаписывает назание точки доступа и пароль. в итоге через год, два таких манипуляций у вас на флешке будет дырка.
Это не так, посмотрите исходники, сначала выполняется проверка переданных параметров ssid и password (ssid не нулевой и длина не более 31, password не более 64), затем выполняется подготовка нового конфига, чтение текущего и сравнение с новым, если они не совпадают только после этого выполняется запись новых параметров.

если убрать WiFi.begin(); но оставить WiFi.setAutoConnect(true); то модуль подключиться. надеюсь я ответил на ваш вопрос.
setAutoConnect всего лишь вызывает wifi_station_set_auto_connect.
Смотрим Колбана, wifi_station_set_auto_connect говорит wifi драйверу что нужно соединятся с последней точкой доступа при загрузке, если выполнять wifi_station_set_auto_connect при инициализации (во время user_init, но это не Ваш случай) то настройки будут сразу применены, если вызывать из другого места, настройки будут применены на следующем перезапуске.

У меня Kolban's Book on ESP8266 редакция от октября 2015
 
Последнее редактирование:

enjoynering

Well-known member
Спасибо почитаю. Если все как вы сказали, то посыпаю волосы пеплом, что поверил аксакалам форума в прошлом.
 

kab

New member
Это не так, посмотрите исходники, сначала выполняется проверка переданных параметров ssid и password (ssid не нулевой и длина не более 31, password не более 64), затем выполняется подготовка нового конфига, чтение текущего и сравнение с новым, если они не совпадают только после этого выполняется запись новых параметров.


setAutoConnect всего лишь вызывает wifi_station_set_auto_connect.
Смотрим Колбана, wifi_station_set_auto_connect говорит wifi драйверу что нужно соединятся с последней точкой доступа при загрузке, если выполнять wifi_station_set_auto_connect при инициализации (во время user_init, но это не Ваш случай) то настройки будут сразу применены, если вызывать из другого места, настройки будут применены на следующем перезапуске.

У меня Kolban's Book on ESP8266 редакция от октября 2015
Напомню, если кому интересно :):
На этом сайте есть ссылка, где эта книга скачивается "on russian". Правда, автор сообщения уточняет, что перевод автоматический - не везде адекватный

Первая книга о ESP8266
 

enjoynering

Well-known member
да вы правы есть такой кусок
Код:
    struct station_config current_conf;
    wifi_station_get_config(&current_conf);
    if(sta_config_equal(current_conf, conf)) {
        DEBUGV("sta config unchanged");
    }
но автору топика скажу что это

Код:
  if (WiFi.SSID() != stationConfig.ssid || WiFi.psk() != stationConfig.password)
{
  WiFi.begin(stationConfig.ssid, stationConfig.password);
 }
можно оставить, экономится немного времени так мы обрезаем вот эти операции
проверка переданных параметров ssid и password (ssid не нулевой и длина не более 31, password не более 64), затем выполняется подготовка нового конфига,
 

CCat

Member
А я не собирался его вырезать. :) Он в любом случае хуже не сделает. Хотя чем больше читаешь о всем том, что выполняется фоном, тем больше думаешь, что для "большей надежности" делать нечего. Сам модуль и библиотека вполне самодостаточны. Мы им и не нужны вообще-то. :confused: Им хорошо и без нас. :(
Гоняю пару дней и вижу, что все мои проверки уже на стороне Ардуино "а целиком ли дошла строка", "а точно ли мы подсоединены к точке доступа" и прочее ни разу не стреляло. Так и тянет устроить скандал. ;)
 
Последнее редактирование:
Сверху Снизу