• Система автоматизации с открытым исходным кодом на базе 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: Им хорошо и без нас. :(
Гоняю пару дней и вижу, что все мои проверки уже на стороне Ардуино "а целиком ли дошла строка", "а точно ли мы подсоединены к точке доступа" и прочее ни разу не стреляло. Так и тянет устроить скандал. ;)
 
Последнее редактирование:
Сверху Снизу