ESP8266 WIFI事件处理
之前用ESP8266判读wifi状态使用定时器回调调用wifi_station_get_connect_status()获取。这种不方便及时处理某些事情,比如WIFI断开。
现在使用
wifi_set_event_handler_cb(wifi_handle_event_cb);
注册wifi事件处理函数,这里面进行WIFI状态改变的一些操作。
比如在EVENT_STAMODE_GOT_IP里进行MQTT连接。
在EVENT_STAMODE_DISCONNECTED里进行切换WIFI。
void wifi_handle_event_cb(System_Event_t *evt)
{
//os_printf("event %x\n", evt->event);
switch (evt->event) {
case EVENT_STAMODE_CONNECTED:
os_printf("connect to ssid %s, channel %d\n",
evt->event_info.connected.ssid,
evt->event_info.connected.channel);
break;
case EVENT_STAMODE_DISCONNECTED:
os_printf("disconnect from ssid %s, reason %d\n",
evt->event_info.disconnected.ssid,
evt->event_info.disconnected.reason);
break;
case EVENT_STAMODE_AUTHMODE_CHANGE:
os_printf("mode: %d -> %d\n",
evt->event_info.auth_change.old_mode,
evt->event_info.auth_change.new_mode);
break;
case EVENT_STAMODE_GOT_IP: //WIFI连接成功,
os_printf("ip:" IPSTR ",mask:" IPSTR ",gw:" IPSTR,
IP2STR(&evt->event_info.got_ip.ip),
IP2STR(&evt->event_info.got_ip.mask),
IP2STR(&evt->event_info.got_ip.gw));
INFO("MQTT:start connect mqtt...\r\n");
update_verify(); //WiFi连接成功更新证书
MQTT_Connect(&mqttClient);
creat_web_servser(); //建立TCP侦听
creat_root_server(); //创建设备服务端,一个店里的设备全部连到这里,通过无线通讯控制店内设备
os_printf("\n");
break;
case EVENT_SOFTAPMODE_STACONNECTED:
os_printf("station: " MACSTR "join, AID = %d\n",
MAC2STR(evt->event_info.sta_connected.mac),
evt->event_info.sta_connected.aid);
break;
case EVENT_SOFTAPMODE_STADISCONNECTED:
os_printf("station: " MACSTR "leave, AID = %d\n",
MAC2STR(evt->event_info.sta_disconnected.mac),
evt->event_info.sta_disconnected.aid);
break;
default:
break;
}
}
附上原来处理WIFI状态的方法:
/*连接WiFi*/
void ICACHE_FLASH_ATTR
wifi_connect()
{
os_timer_disarm(&wifi_connect_timer);
wifi_state = wifi_station_get_connect_status();
INFO("wifi_state = %d \r\n",wifi_state);
if(wifi_state == STATION_GOT_IP)
{
INFO("WIFI CONNECTED!\r\n");
update_verify(); //WiFi连接成功更新证书
MQTT_Connect(&mqttClient);
creat_web_servser(); //建立TCP侦听
creat_root_server(); //创建设备服务端,一个店里的设备全部连到这里,通过无线通讯控制店内设备
return;
}
os_timer_arm(&wifi_connect_timer,2000,0);
}
void ICACHE_FLASH_ATTR
WIFI_CONNECT()
{
wifi_set_opmode(STATIONAP_MODE); //设置模式
wifi_station_set(NORMAL); //配置wifi,station和softap信息
wifi_station_connect();
os_timer_setfn(&wifi_connect_timer,wifi_connect,NULL); //开始连接wifi
os_timer_arm(&wifi_connect_timer,1000,0);
}