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

скетч с конфигуратором в eeprom, сервер и клиент

Evgeniy

New member
Круто стало что можно отключить точку что бы не захламлять WiFi эфир, но правда теперь и не включить, так как, кнопка сохранить доступна только если подключиться к точке напрямую, но если точка уже отключена и в режими клиента вдруг нужно её включить, что бы, перейти на другой WiFi, то нужно править скетч.
Но это мелочи, так как, скетч все ровно крут!
 

Vitaly

Member
Так если надо перейти на другую точку, то обычно старой рядом уже нет.
А на время отладки просто надо оставить настройку с любых адресов.
 

sav-13

Member
Подскажите, кто разобрался, пожалуйста.
Как сделать страничку настроек с HTTP авторизацией?
Пароль хотелось бы возможность менять и записывать в EEPROM
 

Vitaly

Member
Имеется в виду защитить страницу настроек http паролем? Можно посмотреть, не должно быть ничего сложного.
 

Vitaly

Member
на ардуино нет, только найти на чем-то другом и переделать
как будет время я попробую
 

sav-13

Member
на ардуино нет, только найти на чем-то другом и переделать
как будет время я попробую
В принципе можно в GET запросе к странице настроек добавить user=xxx&pass=yyy
И проверять, если не совпадает с тем что лежит в EEPROM заворачивать на страничку с формой ввода имени и пароля.
Только вот GET все в открытом виде передает. (((
Но лучше чем ничего все таки
 

Vitaly

Member
Добавил http basic auth на страницу конфигурации
клиенты зашедшие через softap модуля идут мимо всех проверок

остается только неясно что делать с нестабильной работой softap при неподключенном, но настроенном sta
может вообще выключать клиента если не подключился за какое-то время
 

kod.begemot

New member
Загрузил, прошил - всё работает!
Спасибо большое, очень неплохая заготовочка, уверен что многие будут Вам благодарны!
Попытаюсь сейчас прикрутить к ней свои наработки в плане управления шаговым движком :)
 

Vitaly

Member
Из-за проблем с одновременной работой неподключенного клиента и ап, добавил отключалку режима клиента.

Минуту пытается, потом на пять минут гасим клиента, идем в режим точки доступа для настроек и т.д.
 

pvvx

Активный участник сообщества
Из-за проблем с одновременной работой неподключенного клиента и ап, добавил отключалку режима клиента.

Минуту пытается, потом на пять минут гасим клиента, идем в режим точки доступа для настроек и т.д.
А либу из SDK libnet80211.a: wl_cnx.o не пропатчить? :)
Код:
 Disasm SDK libnet80211.a: wl_cnx.o по поводу reconnect каждые 1 s
 Первый кусок во вложенной процедуре cnx_start_handoff_cb():
 ... Выводит сообщение "no %s found, reconnect after 1s\n"
 ... проверяет, вклюсен или нет флаг wifi_station_get_reconnect_policy() 
 ... далее:
 mov.n           a2, a12
 l32r            a0, a_ets_timer_disarm
 callx0          a0
 l32r            a3, a_cnx_connect_timeout
 mov.n           a2, a12
 movi.n          a4, 0
 l32r            a0, a_ets_timer_setfn
 callx0          a0
 mov.n           a2, a12
 movi            a3, 1000    -> задает новую попытку сединения через 1000 ms 
 movi.n          a4, 0
 movi.n          a5, 1
 l32r            a0, a_ets_timer_arm_new
 callx0          a0

 Второй (идентичный) кусок во вложенной процедуре cnx_start_handoff_cb():
 mov.n           a2, a12
 l32r            a0, a_ets_timer_disarm
 callx0          a0
 l32r            a3, a_cnx_connect_timeout
 mov.n           a2, a12
 movi.n          a4, 0
 l32r            a0, a_ets_timer_setfn
 callx0          a0
 mov.n           a2, a12
 movi            a3, 1000    -> задает новую попытку сединения через 1000 ms 
 movi.n          a4, 0
 movi.n          a5, 1
 l32r            a0, a_ets_timer_arm_new
 callx0          a0
 

Vitaly

Member
А либу из SDK libnet80211.a: wl_cnx.o не пропатчить?
Мне в принципе пока непонятно, что отрубает АП при попытках соединений. Каждая попытка подключится реинитит АП?
Изменение таймаута на 10-20-60-... секунд проблему не решит. Настроить все равно не успеешь, а АП уже клиента скинула.
 

pvvx

Активный участник сообщества
Мне в принципе пока непонятно, что отрубает АП при попытках соединений. Каждая попытка подключится реинитит АП?
Изменение таймаута на 10-20-60-... секунд проблему не решит. Настроить все равно не успеешь, а АП уже клиента скинула.
Там какая-то заминка в переключении приемника/передатчика на разные MAC и функции (глубоко не лез, но AP не отключается, а просто тормозит - занято всё ST).
На Web-свалке приводит к большим таймаутов пинга и потере пакетов, но AP пашет, спотыкаясь :) Если увеличить время паузы, сделать регулируемую паузу - то потянет. Позже попробую... Но в дурино это всё равно не будет, только в моем meSDK :)
Надо на китайцев давить, чтобы изменили ситуацию и поставили регулируемую паузу запросов соединения ST. А счас только авто-отключение есть в wifi_station_set_reconnect_policy()... Вместо флага, лучше в секундах до 256, всё равно флаг тот хранится в байте...
 
Последнее редактирование:

Vitaly

Member
Ага, вот и получается, что для ардуины проще оставить костыльчик с выключением/выключением пока нет возможности каждому менять эти таймауты.
не будешь же юзеру ардуино этот файл патчить

С таймаутом в 1с у меня винда успевает потерять ап и убежать на другую точку. Вероятно с бОльшим таймаутом все будет нормально отрабатывать.

Disasm SDK это кстати что?
 

pvvx

Активный участник сообщества
Ага, вот и получается, что для ардуины проще оставить костыльчик с выключением/выключением пока нет возможности каждому менять эти таймауты.
не будешь же юзеру ардуино этот файл патчить
Дык патчится либа из SDK, до сборки ардуино. И это относится к писателям ардуины.
С таймаутом в 1с у меня винда успевает потерять ап и убежать на другую точку. Вероятно с бОльшим таймаутом все будет нормально отрабатывать.
AP не должна теряться. Она просто ответить не может, т.к. всё время WiFi занято поиском другой AP станции для подключения ST.
А при смене режима WiFi, при отключении ST, у вас возможно отключение и AP. Тут надо смотреть как реализовано...
Disasm SDK это кстати что?
Дизассемблер закрытых библиотек китайской SDK.
 

Vitaly

Member
AP не должна теряться. Она просто ответить не может, т.к. всё время WiFi занято поиском другой AP станции для подключения ST.
А при смене режима WiFi, при отключении ST, у вас возможно отключение и AP. Тут надо смотреть как реализовано...
Так раз АП ответить не может винда решает, что точка неактивна и уходит на другую.
Сменить настройки не успеваешь.

Когда STA уже подключено или режим только AP никаких проблем нет.

В любом случае спасибо за подробности.
 

pvvx

Активный участник сообщества
Так раз АП ответить не может винда решает, что точка неактивна и уходит на другую.
Сменить настройки не успеваешь.
У меня такого нет ни на одном устройстве, включая телефоны.
ВОт так пашет совcем хорошо, без всяких патчей:
C:
int st_disconn_count DATA_IRAM_ATTR;
os_timer_t st_disconn_timer DATA_IRAM_ATTR;

/******************************************************************************
******************************************************************************/
void ICACHE_FLASH_ATTR station_connect_timer(void)
{
    if(st_disconn_count != 0 && (wifi_get_opmode() & STATION_MODE)) {
#if DEBUGSOO > 1
            os_printf("New connect ST\n");
#endif
            st_disconn_count = 2;
//            wifi_station_set_auto_connect(1);
            wifi_station_connect();
    }
}
/******************************************************************************
* FunctionName : wifi_handle_event_cb
******************************************************************************/
void ICACHE_FLASH_ATTR wifi_handle_event_cb(System_Event_t *evt)
{
#if DEBUGSOO > 1
    os_printf("WiFi event %x\n", evt->event);
#endif
    switch (evt->event) {
        case EVENT_STAMODE_CONNECTED:
        {
#if DEBUGSOO > 1
            os_printf("Connect to ssid %s, channel %d\n",
                    evt->event_info.connected.ssid,
                    evt->event_info.connected.channel);
#endif
            st_disconn_count = 0;
            break;
        }
        case EVENT_STAMODE_DISCONNECTED:
        {
            st_disconn_count++;
#if DEBUGSOO > 1
            os_printf("Disconnect from ssid %s, reason %d, count %d\n",
                    evt->event_info.disconnected.ssid,
                    evt->event_info.disconnected.reason, st_disconn_count);
#endif
            if(st_disconn_count >= 3) {
                uint8 opmode = wifi_get_opmode();
#if DEBUGSOO > 1
                    os_printf("Opmode: %d\n", opmode);
#endif
                if(opmode & STATION_MODE) {
#if DEBUGSOO > 1
                    os_printf("Set reconnect after 10s\n");
#endif
                    wifi_station_set_auto_connect(0);
                    wifi_station_disconnect();
                    ets_timer_disarm(&st_disconn_timer);
                    os_timer_setfn(&st_disconn_timer, (os_timer_func_t *)station_connect_timer, NULL);
                    ets_timer_arm_new(&st_disconn_timer, 10000, 0, 1);
                }
            }
            break;
        }
        case EVENT_STAMODE_AUTHMODE_CHANGE:
        {
#if DEBUGSOO > 1
            os_printf("New AuthMode: %d -> %d\n",
                    evt->event_info.auth_change.old_mode,
                    evt->event_info.auth_change.new_mode);
#endif
            st_disconn_count = 0;
            break;
        }
        case EVENT_STAMODE_GOT_IP:
        {
#if DEBUGSOO > 1
            os_printf("Station ip:" IPSTR ", mask:" IPSTR ", gw:" IPSTR "\n",
                    IP2STR(&evt->event_info.got_ip.ip),
                    IP2STR(&evt->event_info.got_ip.mask),
                    IP2STR(&evt->event_info.got_ip.gw));
#endif
            st_disconn_count = 0;
            break;
        }
    }
}
Если 3 раза не удалось соединиться ST, тогда следующая проба соединения произойдет через 10 секунд.
Пример не доработан на все случаи, а как направление что надо сделать...
Всё пашет по событиям... Никаких циклов :) Дурина в пролете?
 
Последнее редактирование:

random1st

New member
Автор, ты молодец. Но Си ты не знаешь, чуть более, чем полностью. Во-первых, and и or -это плохо, лучше && и ||. Во-вторых, не пиши if (a==true). Достаточно if(a). Дальше, не надо писать if(c) d= true else d=false, можно просто - d =c.
 
Сверху Снизу