18. ESP8266 AP (точка доступа) RTOS

Код для создания точки доступа будет делаться на основе кода для станции, опишем изменения:

В файле 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);
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *