• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Переподключение к wifi точке (ESP 12e)

DanSV

New member
Всем доброго времени суток!

Есть ESP 12e на ней стоит моя прошивка (среда Arduino IDE).
Логика программы на контроллере:
1. Программа смотрит конфиг на flash, читает параметры моей wifi сети (sidd,pass), далее осуществляет подключение к моей wifi точке.
2. Если в контроллере не заданы первичные настройки моей точке (sidd,pass) или он не может подключиться к заданной wifi точке (моя wifi точка отключена или неправленые данные подключения), контроллер автоматически переходит в режим собственной wifi точки.

Суть вопроса: Как сделать проверку на появление заданной сети (sidd,pass) и в случае ее появления отключить собственную wifi точку и подключится к ней. Вообще вроде можно работать в двух режимах (где то читал об этом). Понятно, что можно по таймеру (каждые 5-10 мин) делать попытки переподключения, но мне этот вариант не очень нравится.

Пример:
Мой контроллер подключен к моей wifi точке, я отключаю свою wifi точку , контроллер переходит в режим собственной wifi точки, включаю свою wifi точку, контроллер автоматически отключает свою wifi точку и подключается к майей wifi точке . Надеюсь понятно написал.
 

kab

New member
Всем доброго времени суток!

Есть ESP 12e на ней стоит моя прошивка (среда Arduino IDE).
Логика программы на контроллере:
1. Программа смотрит конфиг на flash, читает параметры моей wifi сети (sidd,pass), далее осуществляет подключение к моей wifi точке.
2. Если в контроллере не заданы первичные настройки моей точке (sidd,pass) или он не может подключиться к заданной wifi точке (моя wifi точка отключена или неправленые данные подключения), контроллер автоматически переходит в режим собственной wifi точки.

Суть вопроса: Как сделать проверку на появление заданной сети (sidd,pass) и в случае ее появления отключить собственную wifi точку и подключится к ней. Вообще вроде можно работать в двух режимах (где то читал об этом). Понятно, что можно по таймеру (каждые 5-10 мин) делать попытки переподключения, но мне этот вариант не очень нравится.

Пример:
Мой контроллер подключен к моей wifi точке, я отключаю свою wifi точку , контроллер переходит в режим собственной wifi точки, включаю свою wifi точку, контроллер автоматически отключает свою wifi точку и подключается к майей wifi точке . Надеюсь понятно написал.
А чем, собственно таймер плох?
Хотя проще другой вариант - поставить в loop инкрементальный счетчик. Прошло, скажем 1000 или 10000 циклов loop - пару раз (цикл с настраиваемым числом ) проверили доступность wifi...
"Как сделать проверку на появление заданной сети (sidd,pass)?" - абсолютно так же как уже сделано в setup - попытка подключения и проверка успешности подключения.
Единственный нюанс, после обнаружения успешного подключения к wifi - в первую очередь собственную точку закрыть, что-то типа "server.close". Точную команду на память не помню. Посмотрите в примерах...
ЗЫ. Не забыть сделать флаг, что-бы после перехода в режим станции больше не проверять "появления сети"
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
"Как сделать проверку на появление заданной сети (sidd,pass)?" - абсолютно так же как уже сделано в setup - попытка подключения и проверка успешности подключения.
Есть сканирование сети, нет необходимости отключаться от текущей сети, если искомая сеть недоступна.

Понятно, что можно по таймеру (каждые 5-10 мин) делать попытки переподключения, но мне этот вариант не очень нравится.
А другого варианта и нет, сканируете и если сеть доступна подключаетесь.

Очень часто менять сети не стоит, вроде каждый раз(sidd,pass) записывается в память, затрется до дыр.
 
Последнее редактирование:

kab

New member
Есть сканирование сети, нет необходимости отключаться от текущей сети, если искомая сеть недоступна.
Согласен, не учел, что для попытки переподключения надо сменить режим wifi, и, следовательно, закрыть текущее соединение. Действительно необходимо использовать сканирование.
 

DanSV

New member
Есть сканирование сети, нет необходимости отключаться от текущей сети, если искомая сеть недоступна.


А другого варианта и нет, сканируете и если сеть доступна подключаетесь.

Очень часто менять сети не стоит, вроде каждый раз(sidd,pass) записывается в память, затрется до дыр.
Доброй ночи, спасибо!
 

DanSV

New member
Вопрос номер два :)
У меня в сети будет 3-5 контроллеров, как их можно находить не зная их IP (динамическое присвоение на уровне роутера). Можно ли присвоит имя по которому можно будет обращаться к каждому из устройств (я понимаю, что назначением имен занимается DNS server).
Пробовал назначить через WiFi.hostname( "TEST") не помогает (http:\\TEST\index.html - не видит, ping TEST тоже болт), но на уровне роутера в таблице клиентов DHCP имя поменялось с ESP XXXX на TEST :)
Программа которая будет работать с контроллерами пишу на С#.
Какие предложения/варианты будут по поиску данных контроллеров в сети?
Заранее благодарю.
 

DanSV

New member
По первому вопросу, решил проверкой на конект if (WiFi.status() != WL_CONNECTED and millis() - OnTimecon > 10000) без таймера не обошлось :), если условие верно подымаю WiFi точку в режиме WIFI_AP_STA и устанавливаю флаг, далее если связь с моим роутером восстанавливается и флаг на равен 1 делаю ребут контроллера для последующего переподключения только в режиме клиента.
Отрыл еще описание состояний подключения, может кому то будет полезно Arduino - WiFiStatus
 

kab

New member
У меня в сети будет 3-5 контроллеров, как их можно находить не зная их IP (динамическое присвоение на уровне роутера).
Если речь пойдет об Arduino IDE и автоматическом появлении устройств и папке "Сеть" компьютера из локальной сети (и возможности увидеть динамический IP и войти на HTML-страницу устройства просто кликнув мышкой), то решение есть - использовать SSDP:

ESP8266, ARDUINO IDE,Примеры

Текст скетча из примеров Arduino IDE - ESP - SSDP. С учетом замечания из приведенного поста.

Если разберётесь, как через SSDP найти устройство не "глазами", а в программе другой ESP - будет здорово!

Кстати, большинство IP роутеров позволяют несложным образом привязать статический IP адрес к МАС-адресу устройства.
 
Последнее редактирование:

DanSV

New member
Если речь пойдет об Arduino IDE и автоматическом появлении устройств и папке "Сеть" компьютера из локальной сети (и возможности увидеть динамический IP и войти на HTML-страницу устройства просто кликнув мышкой), то решение есть - использовать SSDP:

ESP8266, ARDUINO IDE,Примеры

Текст скетча из примеров Arduino IDE - ESP - SSDP. С учетом замечания из приведенного поста.

Если разберётесь, как через SSDP найти устройство не "глазами", а в программе другой ESP - будет здорово!

Кстати, большинство IP роутеров позволяют несложным образом привязать статический IP адрес к МАС-адресу устройства.
Доброе утро! Спасибо за Ваш ответ. SSDP использую, в сети устройство публикуется, по нажатию переходит на заданный сайт (в моем случае index.html- страница управления контроллером). Думал уже об этом, буду изучать поиск на C#, результаты выложу.
Пример как использую в IDE (в сети много примеров):
void SSDP_init(void) {
HTTP.on("/description.xml", HTTP_GET, []() {
SSDP.schema(HTTP.client());
});
SSDP.setDeviceType("upnp:rootdevice");
SSDP.setSchemaURL("description.xml");
SSDP.setHTTPPort(80);
SSDP.setName(SSDP_Name);
SSDP.setSerialNumber("YYYYYY");
SSDP.setURL("/index.html");
SSDP.setModelName("TEST1");
SSDP.setModelNumber("ZZZZZZZ");
SSDP.setModelURL("xxxx.ru");
SSDP.setManufacturer("XXXXXXX");
SSDP.setManufacturerURL("xxxxxx.ru - Этот веб-сайт продается - это наилучший источник информации по теме Xxx.");
SSDP.begin();
}
 

DanSV

New member
Всем доброго времени суток!
Вот что получилось по SSDP и поиск в C#.
1. Все знают проблему с Win 10 "возникновения ошибки при нажатие на иконку", откопал решение, ссылку прилагаю (Is esp8266ssdp/ssdp working? · Issue #2283 · esp8266/Arduino · GitHub)
В двух словах - умный парень переписал библиотеку, во вложение сама библиотека и пример ее использования (обратите внимание есть отличие от стандартных примерах, имеется публикация в void loop()).
2. Нашёл пример поиска SSDP на С# мой рабочий код приведен ниже:
public async void SearchForDevices()
{
int i=0;

while (i<100) {
// This code goes in a method somewhere.
using (var deviceLocator = new SsdpDeviceLocator())
{
var foundDevices = await deviceLocator.SearchAsync("urn:schemas-upnp-org:device:BinaryLight:1"); // Can pass search arguments here (device type, uuid). No arguments means all devices.

foreach (var foundDevice in foundDevices)
{
// Device data returned only contains basic device details and location ]
// of full device description.

try
{
// Can retrieve the full device description easily though.
var fullDevice = await foundDevice.GetDeviceInfo();
String a = fullDevice.Manufacturer;
if (fullDevice.Manufacturer == "MY_ESP")
{
string name = fullDevice.FriendlyName;
string ip = foundDevice.DescriptionLocation.DnsSafeHost.ToString();
int flag = 0;
for (int sr = 0; sr < dataGridView1.RowCount; sr++)
{

if (dataGridView1.Rows[sr].Cells[1].Value.ToString().Contains(ip))
{
flag=1;
}

}
if (flag == 0) dataGridView1.Rows.Add(name, ip);

}
i=i+1;
}
catch (Exception ex)
{
// richTextBox1.AppendText("Ошибка: " + ex.Message + "\r\n");
}
}
}
}
}

Теперь о проблемах:
По п.1 вроде идеальное решение :).
По п.2 поиск идет долго, с первого раза не все устройства находятся, специально запускал 5 контроллеров одновременно, приходится ставить в цикл (while (i<100) и обработчик ошибок, так как они возникают %( ), в течение 2-3 минут все контроллеры находятся. Я планирую вынести данную процедуру в отдельный процесс и обновлять список в фоне.
Также для использования в VS данного кода необходимо ставить библиотеку "Rssdp" залить ее можно с сайта Rssdp 3.5.6 (для установки нужно ставить плагин NuGET Package Мenager - с того же сайта).
Если кто-то сможет оптимизировать процесс поиска или будут дельные предложения пишите.

P.S. еще нашел красявое системное обозначение для вашего SSDP устройства "SSDPDevice.setDeviceType("urn:schemas-upnp-org:device:BinaryLight:1");", по нему и делаю поиск в примере выше.
 

Вложения

  • Like
Реакции: kab
Сверху Снизу