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

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

Garmin

Member
Пишу свою прошивку на основе примера AT в среде UDK.
Столкнулся с проблемой конфигурации модуля ESP-12 в режиме STATION MODE
Что я делаю:
- В программе user_init я останавливаю модуль обращением к
wifi_set_opmode_current (NULL_MODE);
до поступления пользовательской команды конфигурации.
- После получения команды с режимом работы (пользовательская AT команда) я вызываю
wifi_set_opmode_current (STATION_MODE);
- затем конфигурирую
struct station_config user_sta_config;
и вызываю установку режима ESP командой
wifi_station_set_config_current (&user_sta_config);
wifi_station_connect ();


Вот здесь и проблема. Станция не работает. Как я это понял:
Подавая команду AT+CWJAP? - в ответ все нули.

Если же я вручную задам команду
AT+CWJAP_CUR=“abc”,“0123456789”,”ca:d7:19:d8:a6:44” (типа этого)
То соединение устанавливается.
Причём в режиме ACCES POINT всё управляется и создаётся точка wifi.

Очевидно, что я что-то не так делаю. Сталкивался ли кто - нибудь с таким, и как это победить?
 

de1m

New member
Не совсем понял, что именно вы пытаетесь сделать, но вот эта функция у меня работает, тоже на esp12e
Код:
static void ICACHE_FLASH_ATTR user_set_softap_config(void) {
   struct softap_config config;

   os_memset(config.ssid, 0, 32);
   os_memset(config.password, 0, 64);

   os_memcpy(config.ssid, "CO2", 3);
   os_memcpy(config.password, "co2passw", 8);
   config.ssid_len = 0;
   config.channel = 1;
   config.authmode = AUTH_WPA2_PSK;
   config.ssid_hidden = 0;
   config.max_connection = 1;
   config.beacon_interval = 100;

   wifi_softap_set_config(&config);// Set ESP8266 softap config

   if(wifi_softap_set_config(&config))
    {
        #ifdef DEBUG
              os_printf("\nRunning as AP. \nSSID: %s\nPass: %s\n\n", config.ssid, config.password);
        #endif
    } else {
        #ifdef DEBUG
            os_printf("\nERR: Cannot connect...\n");
        #endif
    }
}
 

de1m

New member
Забыл, там ещё надо в user_init добавить "wifi_set_opmode(SOFTAP_MODE)" и ещё в документации написано, что конфигурацию нельзя делать в "user_init"
 

Garmin

Member
У меня вот так, вызывается из AT функции, но не работает:
Код:
/*******************************************************************************
* конфигурация ESP8266 в режиме Station
*******************************************************************************/
bool ICACHE_FLASH_ATTR wifi_config_sta (void)
{
    static struct station_config    user_sta_config;
    uint8    bssid[6]        = {0x01, 0x38, 0xd0, 0xa4, 0xdd, 0x1a};
 
    if (false == wifi_set_opmode_current (STATION_MODE))// режим станции
    {
        ets_uart_printf ("error config station mode\r\n"); 
    }
 
    // запись IP адресов, жёстко заданных в программе
    ip4_addr (&g.ip_main.ip, 192, 168, 0, 30);
    ip4_addr (&g.ip_main.gw, 192, 168, 0, 20);
    ip4_addr (&g.ip_main.netmask, 255, 255, 255, 0);
    ip4_addr (&g.ip_other, 192, 168, 0, 20);
    os_memcpy (g.bssid_main, bssid, 6);
    os_memcpy (g.bssid_other, bssid, 6);
    g.bssid_main[0] = g.group_no * 16 + 1;
    g.bssid_other[0] = g.group_no * 16 + 14;

    // отключение службы назначения IP адресов
    wifi_station_dhcpc_stop ();

    // запись имени сети, пароля и MAC
    os_memcpy (user_sta_config.ssid, g.ssid, 32);
    os_memcpy (user_sta_config.password, g.password, 64);
    user_sta_config.bssid_set = 1;
    os_memcpy (user_sta_config.bssid, g.bssid_main, 6);

    // запись коллбэка по событиям WiFi
    wifi_set_event_handler_cb (wifi_user_sta_event_cb);
 
    // установка текущей конфигурации
    wifi_station_set_config_current (&user_sta_config);
    wifi_station_connect ();
 
//    тестовая печать параметров
    ets_uart_printf ("ssid = %s\r\n", user_sta_config.ssid);
    ets_uart_printf ("password = %s\r\n", user_sta_config.password);
    ets_uart_printf ("mac = %x:%x:%x:%x:%x:%x\r\n", user_sta_config.bssid[5], user_sta_config.bssid[4],
                        user_sta_config.bssid[3], user_sta_config.bssid[2],
                        user_sta_config.bssid[1], user_sta_config.bssid[0]);
    return true;
}
 

de1m

New member
Помоему у вас вот тут несколько не то, что надо

Код:
    if (false == wifi_set_opmode_current (STATION_MODE))// режим станции
    {
        ets_uart_printf ("error config station mode\r\n");
    }
Попробуйте поменять на "wifi_set_opmode(SOFTAP_MODE)"
 

Garmin

Member
Попробуйте поменять на "wifi_set_opmode(SOFTAP_MODE)"
Как раз в режиме SoftAP система работает как нужно. Проблема в режиме Station.
Для опыта я взял две ESP-12. Одна конфигурируется как AP, её видно в списке станций. Вторая конфигурируется как Station. Вот с ней проблемы.
В любом случае благодарю.
 

de1m

New member
Как раз в режиме SoftAP система работает как нужно. Проблема в режиме Station.
Для опыта я взял две ESP-12. Одна конфигурируется как AP, её видно в списке станций. Вторая конфигурируется как Station. Вот с ней проблемы.
В любом случае благодарю.
Не знаю точно, как это у вас происходит, в документации написано, что "wifi_set_opmode_current" активно только до следующего рестарта, так как в данном случае ничего не пишется во флэшь.
При "wifi_set_opmode" происодит запись в память. Возможно у вас происходит где-то рестарт и поэтому сбрасываются настройки.
 

Garmin

Member
Есть некоторые успехи. Я заменил wifi_station_set_config_current на wifi_station_set_config и порядок вызозов функций:
Код:
bool ICACHE_FLASH_ATTR wifi_config_sta (void)
{
    static struct station_config    user_sta_config;
    uint8    bssid[6]        = {0x01, 0xdd, 0xd6, 0x34, 0xfe, 0x1a};
  
    if (false == wifi_set_opmode_current (STATION_MODE))// режим станции - на поясе
    {
        ets_uart_printf ("error config station mode\r\n");  
    }
  
    // установка текущей конфигурации
    wifi_station_set_config (&user_sta_config);    //_current
    wifi_station_connect ();

    // отключение службы назначения IP адресов
    wifi_station_dhcpc_stop ();

    // запись коллбэка по событиям WiFi
    wifi_set_event_handler_cb (wifi_user_sta_event_cb);

    return true;
}
Два модуля успешно нашли друг друга.
Коллбек срабатывает.

Начал вручную устанавливать параметры модуля и появился ещё один вопрос:
В режиме Station я могу задать MAC адрес вызовом wifi_station_set_config (), в котором указывается mac (bssid).
Это успешно происходит, проверял AT командой AT+CIPSTAMAC?

Но в режиме Softap я не вижу в SDK команды управления MAC адресом, даже в структурах нет bssid.
Соответственно, по запросу AT+CIPSTAMAC? мне приходит белиберда.
Существует ли функция назначения mac адреса для режима SoftAP?
 

Garmin

Member

Victor

Administrator
Команда форума
Но это не функции SDK, а AT команды. Я хочу настраивать параметры внутри ESP.
Пользоваться AT командами только для передачи конфигурации и управления началом / остановкой передачи.
Код:
52. wifi_set_macaddr
Function:
Sets MAC address
Note:
• This API can only be called in user_init.
• ESP8266 soft-AP and station have different MAC addresses, please do not set them to be
the same.
• The bit 0 of the first byte of ESP8266 MAC address can not be 1. For example, MAC
address can be "1a:XX:XX:XX:XX:XX", but can not be "15:XX:XX:XX:XX:XX".
Prototype:
bool wifi_set_macaddr(
uint8 if_index,
uint8 *macaddr
)
Parameter:
uint8 if_index : set station MAC or soft-AP mac
#define STATION_IF 0x00
#define SOFTAP_IF 0x01
uint8 *macaddr : MAC address
Example:
wifi_set_opmode(STATIONAP_MODE);
System APIs
char sofap_mac[6] = {0x16, 0x34, 0x56, 0x78, 0x90, 0xab};
char sta_mac[6] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab};
wifi_set_macaddr(SOFTAP_IF, sofap_mac);
wifi_set_macaddr(STATION_IF, sta_mac);
Return:
true: Success
false: Failure
 

Garmin

Member
Как же я их не заметил!!! :rolleyes:
Кстати, какая версия мануала у вас?
У меня 1,5,1 и это пункт 50, а не 52
 

Garmin

Member
Благодарю!
Пойду писать дальше...
Кстати, у меня работает связка ESP8266-STM32 по полудуплексному SPI со скоростью 20Мбит/с.
ESP в slave режиме, размер блоков 64 байта.
 

Garmin

Member
Нет, что-то у меня с каменным цветком не то...
В user_init успешно устанавливается MAC и читается с проверкой:
Код:
void ICACHE_FLASH_ATTR user_init (void)
{   
    u8 mac[6];
    // Configure the UART
    uart_init (BIT_RATE_115200, BIT_RATE_115200);
   
    data_init ();
   
    // проверка на соответствие MAC адресов
    wifi_get_macaddr (STATION_IF, mac);
    if (compare_mac (g.sta_mac, mac) == false)
    {
        ets_uart_printf ("setup station mac:" MACSTR, MAC2STR (g.sta_mac));
        ets_uart_printf ("\n");
        if (wifi_set_macaddr (STATION_IF, g.sta_mac) == false)
        {
            ets_uart_printf ("error setup station MAC\n");
        }
        wifi_get_macaddr (STATION_IF, mac);
        ets_uart_printf ("read station mac:" MACSTR, MAC2STR (mac));
        ets_uart_printf ("\n");   
    }
    wifi_get_macaddr (SOFTAP_IF, mac);
    if (compare_mac (g.softap_mac, mac) == false)
    {
        ets_uart_printf ("setup soft ap mac:" MACSTR, MAC2STR (g.softap_mac));
        ets_uart_printf ("\n");
        if (wifi_set_macaddr (SOFTAP_IF, g.softap_mac) == false)
        {
            ets_uart_printf ("error setup soft ap MAC\n");
        }
        wifi_get_macaddr (SOFTAP_IF, mac);
        ets_uart_printf ("read soft ap mac:" MACSTR, MAC2STR (mac));
        ets_uart_printf ("\n");   
    }
   
    at_init ();                    // init AT commands
    at_cmd_array_regist (&at_custom_cmd[0], sizeof (at_custom_cmd) / sizeof (at_custom_cmd[0]));    // setup user AT commands
    spi_init ();    // init spi1
    wifi_set_opmode_current (NULL_MODE);    // вначале выключаем WiFi до получения конфигурации
   
    system_init_done_cb (init_done);
}
На терминале результат успешной записи:

setup station mac:1a:fe:34:d6:dd:01
read station mac:1a:fe:34:d6:dd:01
setup soft ap mac:1a:fe:34:d6:dd:0e
read soft ap mac:1a:fe:34:d6:dd:0e


После этой операции я выключаю wifi до определения режима работы:[inline]wifi_set_opmode_current (NULL_MODE);[/inline]

Потом я с терминала устанавливаю режим SoftAP, и вызывается программа настройки этого режима.
Вот здесь поджидает меня засада. После включения wifi проверка MAC выдаёт совсем не то, что хочется:
Код:
bool ICACHE_FLASH_ATTR wifi_config_ap (void)
{
    uint8    mac[6]        = {0x1a, 0xfe, 0x34, 0xd6, 0xdd, 0x0e};
   
    wifi_set_opmode (SOFTAP_MODE);                    //_current режим точки доступа - на пульте

    wifi_get_macaddr (SOFTAP_IF, mac);
    if (compare_mac (g.mac_main, mac) == false)    // если МАС адрес не совпадает, перезапустить ESP
    {
        ets_uart_printf ("real mac:" MACSTR "\n", MAC2STR (mac));
        ets_uart_printf ("need mac:" MACSTR, MAC2STR (g.mac_main));
        ets_uart_printf ("\n");
        system_restart ();
    }
}
На терминале:
real mac:70:ae:28:40:44:af
need mac:1a:fe:34:d6:dd:2e

Опять я делаю что-то не то.
Вызвать wifi_set_macaddr я могу только в user_init.

Опишу задачу, которую я хочу выполнить:
Я хочу соединить по UDP два модуля ESP8266 и передавать данные.
Модули могут быть как SoftAP, так и Station в зависимости от настроек.
Настройки передаются снаружи через AT команды.
Поэтому я устанавливаю MAC, режим, IP адреса в зависимости от режима.
IP и режимы у меня получились, а с MAC проблема.
 

Garmin

Member
Сам пью, сам гуляю.
Начитал, что функции смены режима работы [inline]wifi_set_opmode ()[/inline] стирают флеш. Соответственно, стирают мои настройки.
Придётся мне тоже писать пользовательские настройки во флеш и читать их при старте.
- "Пилите Шура, пилите, они золотые ". :)
 

Garmin

Member
Довольно грустно на нашем берегу...
Для того, чтобы записывать настройки во флеш пришлось писать целую либу.
От определения размера памяти и назначения сектора записи до диспетчера записи данных внутри сектора (чтобы не тереть сектор каждый раз).
Опять я изобретаю велосипед просто потому, что не нашёл примеров в сети. :(
 

de1m

New member
Довольно грустно на нашем берегу...
Для того, чтобы записывать настройки во флеш пришлось писать целую либу.
От определения размера памяти и назначения сектора записи до диспетчера записи данных внутри сектора (чтобы не тереть сектор каждый раз).
Опять я изобретаю велосипед просто потому, что не нашёл примеров в сети. :(
Вам хорошо, вы можете хотя бы либу написать, я так не могу, но хочу.
Можно мне вашу получить? Тоже надо писать память, а я не знаю как
 

Garmin

Member
А вы начните, а я вам помогу. Тем более, что я свою ещё не закончил.
 
Сверху Снизу