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

Решено Настройка station mode, продолжение плясок с бубном

Garmin

Member
Первый положительный тест работы с флешем и конфигурации ESP8266 с перезагрузкой.
Для тех, кому интересно - помогло окружение вызова программ записи и стирания сектора запретом на прерывания UART:
Код:
ETS_UART_INTR_DISABLE();
spi_flash_erase_sector (user_num_sector);    // стираем сектор
ETS_UART_INTR_ENABLE();
 

de1m

New member
А вы начните, а я вам помогу. Тем более, что я свою ещё не закончил.
Для учёбы было бы не плохо, что-то такое написать. Я пока ещё очень слаб в програмировании и некоторые моменты мне не очень ясны.
От определения размера памяти и назначения сектора записи
С этим вроде бы понятно

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

Garmin

Member
Вначале определите, какие данные и как часто вы будете записывать. Остальное получится из первоначального задания.
 

de1m

New member
Пока мне много писать не надо - ssid и пароль два раза (для sta и когда клиент). И ещё надо как-то html страницу с для настроек сохранить.
 

Garmin

Member
Там с резервированием, возможно слишком сложно для первого раза.
 

Garmin

Member
Вопрос с записью настроек решён положительно, всё работает как задумывалось.
Менеджер памяти читает блок и находит последнюю действительную запись. Сверяет контрольную сумму и загружает настройки. При изменении настроек эта запись делается недействительной, и записывается кусок данных в следующую запись. Стирание блока только после его заполнения.
Теперь у меня есть задача сконфигурировать модуль согласно настройкам.
В user_unit вначале читаются настройки из флеш, затем заполняются данными служебные структуры.
После этого в зависимости от режима (Access Point или Station) вызываются различные программы конфигурации.
В программе wifi_config_ap вроде бы всё нормально.
Задаётся режим, имя и пароль сети, MAC адрес и IP адрес, он сам себя устанавливает гейтвеем, назначается маска IP. Все эти данные при проверке вручную AT командами соответствуют настройкам. WiFi видит эту точку за заданном канале с нужным именем и MAC адресом.
Вот немного упрощённая программа:
Код:
/*******************************************************************************
* конфигурация ESP8266 в режиме Access point
* вызывается в user_init ()
*******************************************************************************/
bool ICACHE_FLASH_ATTR wifi_config_ap (void)
{
     // режим точки доступа
    if (wifi_get_opmode () != SOFTAP_MODE)
    {
        wifi_set_opmode (SOFTAP_MODE);
     }
    // Установка имени сети и пароля
    wifi_softap_set_config (&user_softap_config);
    // установка MAC адреса
    wifi_set_macaddr (SOFTAP_IF, g.mac_main);
    // остановить DHCPS, IP жёстко заданы
    wifi_softap_dhcps_stop ();        
    // задать ip адреса и маски
    wifi_set_ip_info (SOFTAP_IF, &g.ip_main);
    // регистрация обработчика событий WiFi
    wifi_set_event_handler_cb (wifi_user_ap_event_cb);

    espconn_create (&g.user_udp_struct);   // create udp
     return (true);
}
А второй режим - Station настраивается с ошибками.
Режим сети, имя и MAC адрес задаются верно, но статический IP назначаться не хочет, хоть тресни. Примеры в сети смотрел, но везде получается динамический IP, а я хочу статику. Вот код, который у меня сейчас:
Код:
/*******************************************************************************
* конфигурация ESP8266 в режиме Station
*******************************************************************************/
bool ICACHE_FLASH_ATTR wifi_config_sta (void)
{
     if (wifi_get_opmode () != STATION_MODE)
    {
        wifi_set_opmode (STATION_MODE);
    }
    // отключение службы назначения IP адресов
    wifi_station_dhcpc_stop ();
    wifi_softap_dhcps_stop ();
    // установка текущей конфигурации
    wifi_station_set_config (&user_sta_config);    //
    wifi_set_macaddr (STATION_IF, g.mac_main);
    // задать ip адреса и маски
    wifi_set_ip_info (STATION_IF, &g.ip_main);
    wifi_set_ip_info (SOFTAP_IF, &g.ip_main);
    // запись коллбэка по событиям WiFi
    wifi_set_event_handler_cb (wifi_user_sta_event_cb);

    wifi_station_set_hostname ("TEST1");
    espconn_create (&g.user_udp_struct);   // create udp    return (true);
}
При проверке этого кода AT командами параметры wifi соответствуют заданным, а IP, GW, MASK все нули. И для SOFT_AP, и для STATION, хотя они явно заданы в программе.
Версия SDK 1.5.0
Может кто-нибудь подсказать, ЧЯДНТ?
 

Garmin

Member
Пляски с бубном выяснили следующий трабл:

Преамбула.
Есть функции SDK [inline]wifi_get_ip_info[/inline] и [inline]wifi_set_ip_info[/inline].
Также есть АТ команды [inline]AT+CIPAP?[/inline] и [inline]AT+CIPSTA?[/inline].

Амбула.
Если я устанавливаю режим Soft AP и записываю адрес командой [inline]wifi_set_ip_info (SOFTAP_IF, &g.ip_main)[/inline]
То при чтении изнутри программы функцией [inline]wifi_get_ip_info (SOFTAP_IF, &get_ip)[/inline] и проверке по терминалу [inline]AT+CIPAP?[/inline] результаты совпадают

А в режиме Station я также записываю адрес командой [inline]wifi_set_ip_info (STATION_IF, &g.ip_main)[/inline]
То чтение изнутри программы функцией [inline]wifi_get_ip_info (STATION_IF, &get_ip)[/inline] выдаёт правильный результат
А проверка по терминалу [inline]AT+CIPSTA?[/inline] выдаёт нули.

Вопрос:
Это баг SDK 1.5.0 или мои проблемы?
 

Garmin

Member
Да, почитал немного, после конфигурации модуля в режиме Soft AP добавил включение dhcps.
После этого второй блок в режиме Station подключился к первому, получил свои же назначенные адреса, и связь установилась.
Зачем они так программы пишут? :(
Потеряны четыре дня...
 
Сверху Снизу