ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс станции/Переключение между точками доступа: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{ESP8266 панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} {{Черновик}} =Переключение меж…») |
Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Переключение между точками доступа с помощью библиотеки ESP8266WiFi<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-examples.html arduino-esp8266.readthedocs.io - Station]</ref>= | =Переключение между точками доступа с помощью библиотеки ESP8266WiFi<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-examples.html arduino-esp8266.readthedocs.io - Station]</ref>= | ||
Строка 15: | Строка 15: | ||
Модифицировав код из раздела '''«Быстрый старт»''', мы пойдем на шаг дальше и сделаем так, чтобы [[ESP8266]], отключившись от точки доступа, подключался к следующей доступной точке доступа. Этот функционал обеспечивается классом ESP8266WiFiMulti и демонстрируется в скетче ниже: | Модифицировав код из раздела '''«Быстрый старт»''', мы пойдем на шаг дальше и сделаем так, чтобы [[ESP8266]], отключившись от точки доступа, подключался к следующей доступной точке доступа. Этот функционал обеспечивается классом ESP8266WiFiMulti и демонстрируется в скетче ниже: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <ESP8266WiFi.h> | #include <ESP8266WiFi.h> | ||
#include <ESP8266WiFiMulti.h> | #include <ESP8266WiFiMulti.h> | ||
Строка 63: | Строка 63: | ||
Для того, чтобы опробовать этот скетч, вам понадобятся две (или больше) точки доступа. В строчках ниже замените '''primary-network-name''' и '''pass-to-primary-network''' на [[SSID]] и пароль к вашей главной сети. То же самое сделайте со второй сетью. | Для того, чтобы опробовать этот скетч, вам понадобятся две (или больше) точки доступа. В строчках ниже замените '''primary-network-name''' и '''pass-to-primary-network''' на [[SSID]] и пароль к вашей главной сети. То же самое сделайте со второй сетью. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
wifiMulti.addAP("primary-network-name", "pass-to-primary-network"); | wifiMulti.addAP("primary-network-name", "pass-to-primary-network"); | ||
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network"); | wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network"); | ||
Строка 70: | Строка 70: | ||
Если у вас есть другие точки доступа, то можете добавить и их. | Если у вас есть другие точки доступа, то можете добавить и их. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network"); | wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network"); | ||
... | ... | ||
Строка 81: | Строка 81: | ||
В мониторе порта этот процесс будет выглядеть примерно так: | В мониторе порта этот процесс будет выглядеть примерно так: | ||
<syntaxhighlight lang="bash | <syntaxhighlight lang="bash"> | ||
Looking for WiFi ..... connected to sensor-net-1 | Looking for WiFi ..... connected to sensor-net-1 | ||
Looking for WiFi ....... connected to sensor-net-2 | Looking for WiFi ....... connected to sensor-net-2 | ||
Строка 97: | Строка 97: | ||
Упрощенный скетч будет выглядеть следующим образом: | Упрощенный скетч будет выглядеть следующим образом: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <ESP8266WiFi.h> | #include <ESP8266WiFi.h> | ||
#include <ESP8266WiFiMulti.h> | #include <ESP8266WiFiMulti.h> | ||
Строка 126: | Строка 126: | ||
===При подключении к sensor-net-1 после включения питания:=== | ===При подключении к sensor-net-1 после включения питания:=== | ||
<syntaxhighlight lang="bash" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="bash" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
f r0, scandone | f r0, scandone | ||
f r0, scandone | f r0, scandone | ||
Строка 145: | Строка 145: | ||
===При потере соединения с sensor-net-1 и подключения к sensor-net-2:=== | ===При потере соединения с sensor-net-1 и подключения к sensor-net-2:=== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
bcn_timout,ap_probe_send_start | bcn_timout,ap_probe_send_start | ||
ap_probe_send over, rest wifi status to disassoc | ap_probe_send over, rest wifi status to disassoc | ||
Строка 168: | Строка 168: | ||
===При потере соединения с sensor-net-2 и подключения к sensor-net-1:=== | ===При потере соединения с sensor-net-2 и подключения к sensor-net-1:=== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
bcn_timout,ap_probe_send_start | bcn_timout,ap_probe_send_start | ||
ap_probe_send over, rest wifi status to disassoc | ap_probe_send over, rest wifi status to disassoc |
Текущая версия от 12:52, 18 июня 2023
Переключение между точками доступа с помощью библиотеки ESP8266WiFi[1]
Пример подключения станции к точке доступа был показан в статье о библиотеке ESP8266WiFi в разделе «Быстрый старт». В нем, если соединение было утеряно, ESP8266 автоматически подключается к последней использованной точке доступа, когда она снова становится доступна.
Но можно ли настроить более стабильное WiFi-соединение?
Введение
Модифицировав код из раздела «Быстрый старт», мы пойдем на шаг дальше и сделаем так, чтобы ESP8266, отключившись от точки доступа, подключался к следующей доступной точке доступа. Этот функционал обеспечивается классом ESP8266WiFiMulti и демонстрируется в скетче ниже:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
boolean connectioWasAlive = true;
void setup()
{
Serial.begin(115200);
Serial.println();
wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
}
void monitorWiFi()
{
if (wifiMulti.run() != WL_CONNECTED)
{
if (connectioWasAlive == true)
{
connectioWasAlive = false;
Serial.print("Looking for WiFi ");
// "Поиск WiFi-сети"
}
Serial.print(".");
delay(500);
}
else if (connectioWasAlive == false)
{
connectioWasAlive = true;
Serial.printf(" connected to %s\n", WiFi.SSID().c_str());
// "Подключено к "
}
}
void loop()
{
monitorWiFi();
}
Подготовка точек доступа
Для того, чтобы опробовать этот скетч, вам понадобятся две (или больше) точки доступа. В строчках ниже замените primary-network-name и pass-to-primary-network на SSID и пароль к вашей главной сети. То же самое сделайте со второй сетью.
wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
Если у вас есть другие точки доступа, то можете добавить и их.
wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
...
Пробуем
Теперь загрузите скетч на ESP8266 и откройте монитор порта. Сначала модуль начнет сканировать доступные сети. Затем он выберет и подключится к сети с самым сильным сигналом. Если соединение будет утеряно, модуль подключится к следующей доступной сети.
В мониторе порта этот процесс будет выглядеть примерно так:
Looking for WiFi ..... connected to sensor-net-1
Looking for WiFi ....... connected to sensor-net-2
Looking for WiFi .... connected to sensor-net-1
В примере выше ESP8266 сначала подключается к сети sensor-net-1. Затем я выключаю sensor-net-1. ESP8266 понимает, что подключение разорвано и начинает искать другую доступную сеть. Она называется sensor-net-2, и ESP8266 решает подключиться к ней. Затем я включаю sensor-net-1 и выключаю sensor-net-2.
В конце скетча находится функция monitorWiFi() – она показывает, когда ESP8266 отключается от сети, печатая в мониторе порта сообщение Looking for WiFi. Во время поиска другой точки доступа в мониторе порта будут печататься точки. Когда ESP8266 настроит соединение с сетью, в мониторе порта появится сообщение вроде connected to sensor-net-2.
Можно ли его упростить?
Мы можем упростить этот скетч, удалив функцию и поместив в блок loop() только функцию wifiMulti.run(). ESP8266 по-прежнему будет переключаться между точками доступа, но теперь в мониторе порта будет молчание, разве что вы не добавите в скетч функцию Serial.setDebugOutput(true), о которой рассказывалось в статье о библиотеке ESP8266WiFi в разделе «Включение WiFi-диагностики».
Упрощенный скетч будет выглядеть следующим образом:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
void setup()
{
Serial.begin(115200);
Serial.setDebugOutput(true);
Serial.println();
wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
}
void loop()
{
wifiMulti.run();
}
Вот и все! Это весь код, нужный для того, чтобы ESP8266 автоматически переключался между доступными точками доступа.
Загрузив скетч и открыв монитор порта, вы увидите в нем примерно следующее.
При подключении к sensor-net-1 после включения питания:
f r0, scandone
f r0, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt
chg_B1:-40
connected with sensor-net-1, channel 1
dhcp client start...
ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9
При потере соединения с sensor-net-1 и подключения к sensor-net-2:
bcn_timout,ap_probe_send_start
ap_probe_send over, rest wifi status to disassoc
state: 5 -> 0 (1)
rm 0
f r-40, scandone
f r-40, scandone
f r-40, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt
connected with sensor-net-2, channel 11
dhcp client start...
ip:192.168.1.102,mask:255.255.255.0,gw:192.168.1.234
При потере соединения с sensor-net-2 и подключения к sensor-net-1:
bcn_timout,ap_probe_send_start
ap_probe_send over, rest wifi status to disassoc
state: 5 -> 0 (1)
rm 0
f r-40, scandone
f r-40, scandone
f r-40, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt
connected with sensor-net-1, channel 6
dhcp client start...
ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9
Итого
На мой взгляд, данный минималистичный скетч, использующий класс ESP8266WiFiMulti, – это отличный пример «закулисной» работы ESP8266, реализованной всего парой строчек кода.
Кроме того, пример выше показывает, что переподключение между точками доступа отнимает время и не всегда проходит стабильно. Следовательно, при работе над проектами потребуется, скорее всего, отслеживать статус подключения, чтобы понимать, к примеру, можете ли вы отправлять данные во внешнюю систему или должны подождать, пока соединение не восстановится.
Более подробно о функциях для управления режимом станции читайте в статье о классе станции.