ESP8266: сканировать вайфай сети и подключиться, если есть известная (нужная)
- Войдите на сайт для отправки комментариев
Чт, 07/07/2022 - 02:09
Доброго времени суток. Приходится часто переезжать и разбираться с ардуино (ESP) то в одном месте, то в другом. Руками постоянно перебивать пару ссид/пароль уже надоело. Решил написать функцию сканирования доступных сетей и подключаться, если есть ссид из моего списка. Вроде все сканирует, но не подключается, ну или по крайней мере не выводит полученный айпишник.
#include <ESP8266WiFi.h> // Библиотека для создания Wi-Fi подключения (клиент или точка доступа) #include <WiFiClient.h> char* array_ssid[] = {"ssid1", "ssid2"}; // Массив необходимых ссидов char* array_pass[] = {"pass1", "pass2"}; // Массив необходимых паролей к этим ссидам int count_ssid = sizeof(array_ssid) / sizeof(array_ssid[0]); // Размер массива ссидов // Функция скарирования и подключения к найденной известной сети из нашего списка, другие будут игнорится void conekt_to_wifi(int networksFound) { // for (int i = 0; i < networksFound; i++) { for (int j = 0; j < count_ssid; j++) { if (WiFi.SSID(i)==array_ssid[j]) { Serial.println("One of ouer ssid was found = " +WiFi.SSID(i)); WiFi.begin(array_ssid[j], array_pass[j]); // Инициализируем подключение к указанной вайфай сети WiFi.setHostname("Host_MDNS"); // Устанавливаем новое имя нашего клиента Serial.println(WiFi.hostname()); // Распечатываем имя клиента while (WiFi.status() != WL_CONNECTED) { // Зупускаем ожидание поднятия вайфай сервера Serial.println("waiting..."); delay(1000); Serial.println(WiFi.localIP()); // Выводим в монитор порта айпишник нашей платы } } } } } void setup() { Serial.begin(9600); while (!Serial) { // ждём, пока не откроется монитор последовательного порта // для того, чтобы отследить все события в программе } WiFi.mode(WIFI_OFF); // Останавливаем вайфай delay(1000); WiFi.mode(WIFI_STA); // Запускаем вайфай Serial.println("Ouer mac = " +WiFi.macAddress()); // Выводим мак адрес WiFi.scanNetworksAsync(conekt_to_wifi); // Сканируем вайфай сети и подклоючаемся, если есть из нашего списка } void loop() {}
Блок "else" тут не приводил, смысла нет, потому что зацикливается на подключении и выдает что-то типа этого:
(IP unset) waiting... --------------- CUT HERE FOR EXCEPTION DECODER --------------- Soft WDT reset >>>stack>>> ctx: sys sp: 3fffec40 end: 3fffffb0 offset: 01a0 3fffede0: 00000000 00000002 3ffe8889 4020299a 3fffedf0: 00000000 00000002 3ffe8889 40204557 3fffee00: 3ffe888a 00000001 00000020 3ffee638 3fffee10: 3fffee70 3ffe85d8 3ffee638 3ffee638 3fffee20: 40201cac 3ffe8888 3ffee638 40201cb8 3fffee30: 40201cac 3ffe8888 3ffee638 40201fec
всё давно придумано до нас - wifimulti
Забиваешь все известные тебе точки и будет тебе счастье
всё давно придумано до нас - wifimulti
Забиваешь все известные тебе точки и будет тебе счастье
Да уж... счастье получил... спасибо.
Но все же хотелось понять, почему мой код не работает. Понятно, что надо бы подправить массивы, сделать парными ссид-пароль, но не думаю, что в этом проблема. Ведь сеть сканируется. Нужная находится. Но вот почему не подключается?
И все же хотелось бы знать/понять, почему мой вариант не работает. Дело в том, что предложенный "стандартный", "давно придуманный до нас" способ имеет одну, на мой взгляд не очень хорошую штуку. Возможно я ошибаюсь, но мне не нравится, когда пары логин-пароль вбивают в самой функции. По идее такие списки должны корректироваться вне функции. А тут они в сетапе указаны.
У меня тоже способ не самый лучший с разбивкой на отдельные массивы ссидов и паролей. Но соединить их теоретически можно. Тут ведь работает многоуровневый массив. Значит можно и соединить.
Таки сделал один способ без использования доп библиотеки мультивайфай. И без метода стандартной билиотеки вайфай WiFi.scanNetworksAsync(), которую я использовал в первый раз. Получилось что-то типа такого:
В таком виде плата не отчитывается о других сетях, только пробует подключиться к существующему списку, перебирая его по кругу, пока не найдет сеть из списка.
По идее по такому же принципу можно переделать и мой первый вариант.
Да потому шта... Выведи в терминал значение networksFound, после десятой строки. И сам все поймешь.
Да потому шта... Выведи в терминал значение networksFound, после десятой строки. И сам все поймешь.
Да, тут мой косяк. Сделал по инерции... Тут же показывает число найденных сетей и отсчет идет с единицы, а не с нуля. Но я переделал вот так:
И ничего не поменялось