11. Wi-Fi STA (станция/клиент)

Настроим соединение по UDP протоколу и произведем ping контроллера.

Контроллер поддерживает 3 режима работы:

  1. Аппаратный режим станции (он подключается к какой-то сети)
  2. Программный режим точки доступа (контроллер создает сеть)
  3. Совмещенный режим (1+2)

Посмотрим на примере как подключиться к существующей сети.

В файле main.c
Добавим глобальные переменные:

//------------------------------------------------------
//User_Variables
//------------------------------------------------------
static os_timer_t os_timer01;
static uint8_t led_state=0;
static uint8_t WiFi_status=STATION_IDLE;
static uint8_t Connect_status=0;

//Напишем Callback функцию для программного таймера
static void ICACHE_FLASH_ATTR wifi_check_ip(void *arg)
{
	struct ip_info IpConfig;		//структура, в которую "складируются" данные о текущем соединении
	os_timer_disarm(&os_timer01); 	        //деинициализировать (обнулить) структуру / отключаем таймер

	WiFi_status=wifi_station_get_connect_status(); //проверяем статус соединения

	if(WiFi_status==STATION_GOT_IP && IpConfig.ip.addr!=0)
	{
		os_timer_setfn(&os_timer01, (os_timer_func_t*)wifi_check_ip, NULL); //указываем структура и функцию обратного вызова
		os_timer_arm(&os_timer01, 2000, 0); 	//инициализировать (обнулить) структуру

		if(Connect_status==0){os_printf("WiFi connected\r\n");	Connect_status=1;}
		else {led_state=(led_state==0) ? 1:0;	GPIO_OUTPUT_SET(2,led_state);	}
	}
	else
	{
		os_printf("WiFi NOT connected\r\n");
		Connect_status=0;

		switch (WiFi_status)
		{
			case STATION_WRONG_PASSWORD:
				os_printf("STATION_WRONG_PASSWORD\r\n");
				wifi_station_connect();
			break;

			case STATION_NO_AP_FOUND:
				os_printf("STATION_NO_AP_FOUND\r\n");
				wifi_station_connect();
			break;

			case STATION_CONNECT_FAIL:
				os_printf("STATION_CONNECT_FAIL\r\n");
				wifi_station_connect();
			break;

			default:
				os_printf("STATION_IDLE\r\n");
			break;

		}

		os_timer_setfn(&os_timer01, (os_timer_func_t*)wifi_check_ip, NULL); //указываем структура и функцию обратного вызова
		os_timer_arm(&os_timer01, 500, 0); 	//инициализировать (обнулить) структуру
	}

}

В файле user_config.h напишем дефайны для точки доступа

#define WiFi_Client_SSID "qwe1" //в SSID обязательно должны быть цифры!!!!
#define WiFi_Client_Password "12345678"

В функции main (ICACHE_FLASH_ATTR user_init()) создаем и инициализируем структуру:

struct station_config stationConf; //структура для настроек wifi
os_memset(&stationConf,0,sizeof(struct station_config)); //зануляем структуру
os_sprintf(stationConf.ssid, "%s", WiFi_Client_SSID);
os_sprintf(stationConf.password, "%s", WiFi_Client_Password);

Далее выбираем режим станции и инициализируем ее настройки

wifi_set_opmode(STATION_MODE); //режим станции (настройка м.б. изменена "на лету")
wifi_station_set_config_current(&stationConf); //инициализируем настройки wifi структурой (настройка м.б. изменена "на лету")

В самом конце настраиваем программный таймер и присоединяемся к wifi

//используем програмный таймер
os_timer_disarm(&os_timer01); //деинициализировать (обнулить) структуру
os_timer_setfn(&os_timer01, (os_timer_func_t*)wifi_check_ip, NULL); //указываем структура и функцию обратного вызова
os_timer_arm(&os_timer01, 1000, 0); //инициализируем структуру
//0-однократно, 1-циклический

wifi_station_connect(); //присоединяемся к wifi

На основе полученного IP можно «пропинговать» м/к
в windows 7 нажать ctrl+R ввести cmd и потом ввести ping «ip»
По умолчанию в микроконтроллере включен «режим пониженного потребления» и поэтому соединение с сетью происходит весьма долго, поэтому разумно дописать:

wifi_set_sleep_type(NONE_SLEEP_T); //отключаем пониженное энергопотребление
wifi_station_connect();            //присоединяемся к wifi

В дальнейшем можно использовать функцию wifi_get_sleep_type(); для получения текущего режима энергопотребления.

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

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