ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс станции/Переключение между точками доступа

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Переключение между точками доступа с помощью библиотеки ESP8266WiFi[1]

Пример подключения станции к точке доступа был показан в статье о библиотеке ESP8266WiFi в разделе «Быстрый старт». В нем, если соединение было утеряно, ESP8266 автоматически подключается к последней использованной точке доступа, когда она снова становится доступна.

Но можно ли настроить более стабильное WiFi-соединение?

Введение

Модифицировав код из раздела «Быстрый старт», мы пойдем на шаг дальше и сделаем так, чтобы ESP8266, отключившись от точки доступа, подключался к следующей доступной точке доступа. Этот функционал обеспечивается классом ESP8266WiFiMulti и демонстрируется в скетче ниже:

 1 #include <ESP8266WiFi.h>
 2 #include <ESP8266WiFiMulti.h>
 3 
 4 ESP8266WiFiMulti wifiMulti;
 5 boolean connectioWasAlive = true;
 6 
 7 void setup()
 8 {
 9   Serial.begin(115200);
10   Serial.println();
11 
12   wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
13   wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
14   wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
15 }
16 
17 void monitorWiFi()
18 {
19   if (wifiMulti.run() != WL_CONNECTED)
20   {
21     if (connectioWasAlive == true)
22     {
23       connectioWasAlive = false;
24       Serial.print("Looking for WiFi ");
25                //  "Поиск WiFi-сети"
26     }
27     Serial.print(".");
28     delay(500);
29   }
30   else if (connectioWasAlive == false)
31   {
32     connectioWasAlive = true;
33     Serial.printf(" connected to %s\n", WiFi.SSID().c_str());
34               //  "Подключено к "
35   }
36 }
37 
38 void loop()
39 {
40   monitorWiFi();
41 }

Подготовка точек доступа

Для того, чтобы опробовать этот скетч, вам понадобятся две (или больше) точки доступа. В строчках ниже замените 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-диагностики».

Упрощенный скетч будет выглядеть следующим образом:

 1 #include <ESP8266WiFi.h>
 2 #include <ESP8266WiFiMulti.h>
 3 
 4 ESP8266WiFiMulti wifiMulti;
 5 
 6 void setup()
 7 {
 8   Serial.begin(115200);
 9   Serial.setDebugOutput(true);
10   Serial.println();
11 
12   wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
13   wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
14   wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
15 }
16 
17 void loop()
18 {
19   wifiMulti.run();
20 }

Вот и все! Это весь код, нужный для того, чтобы ESP8266 автоматически переключался между доступными точками доступа.

Загрузив скетч и открыв монитор порта, вы увидите в нем примерно следующее.

При подключении к sensor-net-1 после включения питания:

 1 f r0, scandone
 2 f r0, scandone
 3 state: 0 -> 2 (b0)
 4 state: 2 -> 3 (0)
 5 state: 3 -> 5 (10)
 6 
 7 add 0
 8 aid 1
 9 cnt
10 chg_B1:-40
11 
12 connected with sensor-net-1, channel 1
13 dhcp client start...
14 ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9

При потере соединения с sensor-net-1 и подключения к sensor-net-2:

 1 bcn_timout,ap_probe_send_start
 2 ap_probe_send over, rest wifi status to disassoc
 3 state: 5 -> 0 (1)
 4 rm 0
 5 f r-40, scandone
 6 f r-40, scandone
 7 f r-40, scandone
 8 state: 0 -> 2 (b0)
 9 state: 2 -> 3 (0)
10 state: 3 -> 5 (10)
11 add 0
12 
13 aid 1
14 cnt
15 
16 connected with sensor-net-2, channel 11
17 dhcp client start...
18 ip:192.168.1.102,mask:255.255.255.0,gw:192.168.1.234

При потере соединения с sensor-net-2 и подключения к sensor-net-1:

 1 bcn_timout,ap_probe_send_start
 2 ap_probe_send over, rest wifi status to disassoc
 3 state: 5 -> 0 (1)
 4 rm 0
 5 f r-40, scandone
 6 f r-40, scandone
 7 f r-40, scandone
 8 state: 0 -> 2 (b0)
 9 state: 2 -> 3 (0)
10 state: 3 -> 5 (10)
11 add 0
12 aid 1
13 cnt
14 
15 connected with sensor-net-1, channel 6
16 dhcp client start...
17 ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9

Итого

На мой взгляд, данный минималистичный скетч, использующий класс ESP8266WiFiMulti, – это отличный пример «закулисной» работы ESP8266, реализованной всего парой строчек кода.

Кроме того, пример выше показывает, что переподключение между точками доступа отнимает время и не всегда проходит стабильно. Следовательно, при работе над проектами потребуется, скорее всего, отслеживать статус подключения, чтобы понимать, к примеру, можете ли вы отправлять данные во внешнюю систему или должны подождать, пока соединение не восстановится.

Более подробно о функциях для управления режимом станции читайте в статье о классе станции.

См.также

Внешние ссылки