Код для создания точки доступа будет делаться на основе кода для станции, опишем изменения:
В файле user_config.h добавим дефайны
//------------------------------------------------------
#define WiFi_Client_SSID "SSID1"
#define WiFi_Client_Password "123456789"
#define WIFI_AP_SSID "SSID1"
#define WIFI_AP_PASSWORD "123456789"
#define WIFI_AP_IP "192.168.0.1" //ip
#define WIFI_AP_GW "192.168.0.1" //gateway - шлюз
#define WIFI_AP_NETMASK "255.255.255.0" //маска подсети
//пул адресов
#define WIFI_AP_IP_CLIENT_START "192.168.0.100"
#define WIFI_AP_IP_CLIENT_END "192.168.0.105"
Перейдем в файл wifi.c, допишем функции для callback указателей
//
//Записываем в переменные-указатели на функции
//
//Код, написанный ранее....
//------------------------------------------------
void ICACHE_FLASH_ATTR set_on_client_connect(wifi_state_cb_t cb)
{
on_client_connect = cb;
}
//------------------------------------------------
void ICACHE_FLASH_ATTR set_on_client_disconnect(wifi_state_cb_t cb)
{
on_client_disconnect = cb;
}
- Допишем функции коннекта и дисконнекта
//
//Функции коннекта и дисконнекта
//
//Код, написанный ранее....
//------------------------------------------------
LOCAL void ICACHE_FLASH_ATTR on_wifi_client_connect()
{
os_printf("on_wifi_client_connect();\n");
uint32 station_num = wifi_softap_get_station_num(); //получаем кол-во станций
os_printf("number station: %d\n", station_num);
GPIO_OUTPUT_SET(GPIO_LED, 0); //если кто-то подключен - вкл светодиод
}
//------------------------------------------------
LOCAL void ICACHE_FLASH_ATTR on_wifi_client_disconnect()
{
os_printf("client disconnect\n");
uint32 station_num = wifi_softap_get_station_num(); //получаем кол-во станций
os_printf("number station: %d\n", station_num);
if (!station_num) GPIO_OUTPUT_SET(GPIO_LED, 1); //если никто не подключен - выкл светодиод
}
- Напишем функцию запуска в режиме точки доступа и добавим ее прототип в wifi.h
//
//Запуск в режиме точки доступа
//
//------------------------------------------------
bool ICACHE_FLASH_ATTR start_wifi_ap(const char * ssid, const char * pass)
{
uint32_t ip;
char ip_char[15];
uint8 macadr[6];
if(!wifi_set_mode(SOFTAP_MODE)) //проверка что установился требуемый режим (точка доступа)
{
os_printf("Failed to enable Access Point mode!\n");
return false;
}
//Выделяем память под структуру конфигурации
struct softap_config *config = (struct softap_config *)zalloc(sizeof(struct softap_config));
wifi_get_macaddr(SOFTAP_IF, macadr);
wifi_softap_get_config(config);
//очищаем память и заполняем структуры
memset(config->ssid, 0, sizeof(config->ssid));
sprintf(config->ssid, WIFI_AP_SSID);
memset(config->password, 0, sizeof(config->password));
sprintf(config->password, WIFI_AP_PASSWORD);
if (wifi_get_opmode() == SOFTAP_MODE) //задаем настройки канала и тд.
{
os_printf("SOFTAP_MODE\n");
config->authmode = AUTH_WPA_WPA2_PSK;
config->channel = 7;
config->max_connection = 255;
config->ssid_hidden = 0;
wifi_softap_set_config(config); //сохраняем настройки
}
if (wifi_get_opmode() == SOFTAP_MODE) //выводим в терминал информацию (для отладки)
{
wifi_softap_get_config(config);
os_printf("OPMODE: %u, SSID: %s, PASSWORD: %s, CHANNEL: %d, AUTHMODE: %d, MACADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n",
wifi_get_opmode(),
config->ssid,
config->password,
config->channel,
config->authmode,
macadr[0],macadr[1],macadr[2],macadr[3],macadr[4],macadr[5]);
}
free(config); //освобождаем память
wifi_set_sleep_type(NONE_SLEEP_T); //отключаем пониженное потребление
wifi_softap_dhcps_stop(); //останавливаем DHCP и заносим данные в структуры
struct ip_info ipinfo;
snprintf(ip_char, sizeof(ip_char), "%s", WIFI_AP_IP);
ip = ipaddr_addr(ip_char);
memcpy(&ipinfo.ip, &ip, 4);
snprintf(ip_char, sizeof(ip_char), "%s", WIFI_AP_GW);
ip = ipaddr_addr(ip_char);
memcpy(&ipinfo.gw, &ip, 4);
snprintf(ip_char, sizeof(ip_char), "%s", WIFI_AP_NETMASK);
ip = ipaddr_addr(ip_char);
memcpy(&ipinfo.netmask, &ip, 4);
wifi_set_ip_info(SOFTAP_IF, &ipinfo); //сохраняем данные модуль
struct dhcps_lease dhcp_lease;
snprintf(ip_char, sizeof(ip_char), "%s", WIFI_AP_IP_CLIENT_START);
ip = ipaddr_addr(ip_char);
memcpy(&dhcp_lease.start_ip, &ip, 4);
snprintf(ip_char, sizeof(ip_char), "%s", WIFI_AP_IP_CLIENT_END);
ip = ipaddr_addr(ip_char);
memcpy(&dhcp_lease.end_ip, &ip, 4);
wifi_softap_set_dhcps_lease(&dhcp_lease); //сохраняем данные модуль
wifi_softap_dhcps_start(); //запускаем DHCP сервер
if(wifi_get_phy_mode() != PHY_MODE_11N) wifi_set_phy_mode(PHY_MODE_11N);
return true;
}
Напишем функцию остановки точки доступа
//------------------------------------------------
bool ICACHE_FLASH_ATTR stop_wifi_station()
{
WIFI_MODE mode = wifi_get_opmode();
mode &= ~STATION_MODE;
if(!wifi_set_mode(mode))
{
os_printf("Failed to disable STA mode!\n");
return false;
}
return true;
}
- Перепишем функцию инициализации:
//------------------------------------------------
WIFI_MODE ICACHE_FLASH_ATTR init_esp_wifi()
{
//Записываем в переменные-указатели на функции
set_on_client_connect(on_wifi_client_connect);
set_on_client_disconnect(on_wifi_client_disconnect);
//"прописываем" Callback функцию
wifi_set_event_handler_cb(wifi_event_handler_cb);
WIFI_MODE mode = wifi_get_opmode_default(); //определяем текущий режим работы
wifi_set_mode(mode);
stop_wifi_station(); //отключение режима "станция"
return mode;
}
В файле main.c проинициализируем модуль wifi и создадим точку доступа
//------------------------------------------------------
void ICACHE_FLASH_ATTR user_init()
{
UART_SetBaudrate(UART0,BIT_RATE_115200);
UART_SetBaudrate(UART1,BIT_RATE_115200);
//Init_something();
init_esp_wifi();
start_wifi_ap(WIFI_AP_SSID, WIFI_AP_PASSWORD);
}