完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 城东 于 2016-12-11 15:17 编辑
在前面的两次文章都有提到注册了一个定时器test_timer,这个定时器的回调函数就是user_esp_platform_check_ip,如下: os_timer_disARM(&test_timer); os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL); os_timer_arm(&test_timer, 1000, 0); 这个函数负责监测IP的状态,也就是是否获得了IP,该函数如下: user_esp_platform_check_ip(void) { static et_uint32 time = 0; et_uint32 connect_error_flag=0; struct ip_info ipconfig; os_timer_disarm(&test_timer); //get ip info of ESP8266 station wifi_get_ip_info(STATION_IF, &ipconfig); if (wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0) { os_printf("got ip !!! rn"); if (user_main_start_flag == 0) { user_main_start_flag = 1; xTaskCreate(et_user_main, "et_user_main", 1024, NULL, 2, NULL); } wifi_reconnect_start_flag = 1; } else { if(wifi_station_get_connect_status() == STATION_WRONG_PASSWORD) { if ((system_get_time() - time) >= 5000000) { os_printf("connect fail, wrong password!!! rn"); time = system_get_time(); } connect_error_flag = 1; } else if(wifi_station_get_connect_status() == STATION_NO_AP_FOUND) { if ((system_get_time() - time) >= 5000000) { os_printf("connect fail, no AP found!!! rn"); time = system_get_time(); } connect_error_flag = 1; } else if(wifi_station_get_connect_status() == STATION_CONNECT_FAIL) { if ((system_get_time() - time) >= 5000000) { os_printf("connect fail, connect fail!!! rn"); time = system_get_time(); } connect_error_flag = 1; } if(connect_error_flag == 1) { if (air_kiss_start_flag == 1) { wifi_station_set_reconnect_policy(false); smartconfig_stop(); air_kiss_start_flag = 0; if(work_mode == WORK_MODE_OLED) { OLED_clear(); OLED_show_chn(0, 0, 15); //show 小e: OLED_show_str(18, 0, "e:", 2); OLED_show_chn(0, 2, 8); //show 网络配置失败 OLED_show_chn(18, 2, 9); OLED_show_chn(36, 2, 10); OLED_show_chn(54, 2, 11); OLED_show_chn(72, 2, 24); OLED_show_chn(90, 2, 25); OLED_show_str(108, 2, " ", 2); } } } //re-arm timer to check ip os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL); os_timer_arm(&test_timer, 1000, 0); } } 下面我们就来分析一下这个函数的具体内容: os_timer_disarm(&test_timer); //get ip info of ESP8266 station wifi_get_ip_info(STATION_IF, &ipconfig); 首先是关掉test_timer定时器,然后获取ip信息,ip信息结构体如下: struct ip_info { struct ip_addr ip; /**< IP address */ struct ip_addr netmask; /**< netmask */ struct ip_addr gw; /**< gateway */ };这里包括了IP地址,屏蔽位和网关(路由器)地址,下来的内容如下: 下来的内容就是判断IP和wifi的状态: if (wifi_station_get_connect_status() == STATION_GOT_IP && ipconfig.ip.addr != 0) { os_printf("got ip !!! rn"); if (user_main_start_flag == 0) { user_main_start_flag = 1; xTaskCreate(et_user_main, "et_user_main", 1024, NULL, 2, NULL); } wifi_reconnect_start_flag = 1; } 这个苦如果WIFI已经进入到了获取IP的状态,并且IP地址有效,则会单例创建et_user_main任务,这个也是用户的主任务,同时也会标明下次如果重启就会自动连接。如果判断没有连接上AP或者没有获得有效的地址就会进入到另外一种状态,这里首先会判断是否是连接密码错误,如果是这里就会置位连接错误标志connect_error_flag如下: if(wifi_station_get_connect_status() == STATION_WRONG_PASSWORD) { if ((system_get_time() - time) >= 5000000) { os_printf("connect fail, wrong password!!! rn"); time = system_get_time(); } connect_error_flag = 1; } 下来就判断是否是没有发现AP: else if(wifi_station_get_connect_status() == STATION_NO_AP_FOUND) { if ((system_get_time() - time) >= 5000000) { os_printf("connect fail, no AP found!!! rn"); time = system_get_time(); } connect_error_flag = 1; } 下来还会判断是否是连接AP的时候发生了错误: else if(wifi_station_get_connect_status() == STATION_CONNECT_FAIL) { if ((system_get_time() - time) >= 5000000) { os_printf("connect fail, connect fail!!! rn"); time = system_get_time(); } connect_error_flag = 1; } 在上面这三种错误中都会置位连接错误标志connect_error_flag,而且这三种错误都是有一个时间限制的,只有在5s内连接成功就算成功,超过了5s之后就认为是连接失败。最后当连接失败的时候会通过OLED显示出来,并停止掉smart配置: if(connect_error_flag == 1) { if (air_kiss_start_flag == 1) { wifi_station_set_reconnect_policy(false); smartconfig_stop(); air_kiss_start_flag = 0; if(work_mode == WORK_MODE_OLED) { OLED_clear(); OLED_show_chn(0, 0, 15); //show 小e: OLED_show_str(18, 0, "e:", 2); OLED_show_chn(0, 2, 8); //show 网络配置失败 OLED_show_chn(18, 2, 9); OLED_show_chn(36, 2, 10); OLED_show_chn(54, 2, 11); OLED_show_chn(72, 2, 24); OLED_show_chn(90, 2, 25); OLED_show_str(108, 2, " ", 2); } } }并且下次开机的时候也不会重新连接 这个函数分析到这里,总体而已这里最主要的作用就是在连接成功之后创建et_user_main应用 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
[小e体验板] 【小体积大智慧】关于体验板的技术问题,看这一篇就够了
2881 浏览 4 评论
【小e1开发板试用体验】分析程序架构四~/Share/SDK/makefile分析
3648 浏览 1 评论
6767 浏览 19 评论
29276 浏览 59 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 10:37 , Processed in 0.586878 second(s), Total 68, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号