• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
А вы начните, а я вам помогу. Тем более, что я свою ещё не закончил.
 
Сверху Снизу