首先先来解决上一讲留下的问题,如何检测芯片是否获取了ip,这个问题其实很简单。
先定义一个结构体变量struct ip_info pTempIp;
用来获取连接状况,然后调用两个函数,
wifi_get_ip_info(STATION_IF, &pTempIp);
if(wifi_station_get_connect_status() == STATION_GOT_IP)
{
os_printf("ip:%d\r\nip:%X",pTempIp.ip.addr,pTempIp.ip.addr);
}
先读取芯片的ip信息,然后判断是否获得ip,是则将刚刚保存的ip串口输出显示。
这里顺便说一下上一节struct station_config和struct ip_info这两个结构体,在ide中也可以很方便地用F3跳转到定义处查看。
struct station_config {
uint8 ssid[32]; //要连接的wifi的账号
uint8 password[64]; //对应的密码
uint8 bssid_set; //这个位置1则只会连接ssid和bssid相匹配的路由器,比如两个名字一样的路由器,要区分只能通过mac不同
uint8 bssid[6];
};
//这是一个结构体嵌套,没什么好讲解的,ip_info分别存了ip、子网掩码和网关信息。
struct ip_addr {
u32_t addr;
};
struct ip_info {
struct ip_addr ip;
struct ip_addr netmask;
struct ip_addr gw;
};
我们用的是NONOS_SDK开发,它不支持任务调度,也不支持基于优先级的抢占,程序从入口顺序执行,就跟51单片机类似,也因为它执行一条语句的速度很快,当我们按照上一节配置好wifi后直接判断时候获取到ip,这时芯片可能还没反应过来就已经判断完了,这样不是我们想要的结果,因此引入定时器的用法。玩过51的朋友可能会问,那为什么不用for循环延时的方法?这里作为一个小作业,大家可以去找一下资料顺便锻炼一下自己百度的能力,也可以试一下用for循环延时个10秒,再试试延时个几分钟看看会不会出问题。
首先要先定义一个定时器LOCAL os_timer_t ip_timer;
用来检测ip,然后这次我们会用到3个函数,这里我先给出代码再解释。
//关闭定时器
//参数一:要关闭的定时器
os_timer_disarm(&ip_timer);
//设置定时器
//参数一:要设置的定时器;参数二:定时器到时间要执行的回调函数;参数三:回调函数的参数
os_timer_setfn(&ip_timer, (os_timer_func_t *)user_check_ip, NULL);
//使能(启动)定时器
//参数一:要使能的定时器;参数二:定时时间(单位:ms);参数三:是否重复执行,即执行完1次就停止还是一直执行下去
os_timer_arm(&ip_timer, 5000, 1); //1:重复 0:只一次
另外要注意的是,定时时间并不是无限长,具体时间范围可以参考API文档,学会看文档也是程序猿必备的技能之一。
这样在配置好wifi设置后,就可以启动执行该定时器用于检测是否获取到ip,把本讲第一部分内容放到一个函数里,让定时器调用就好了,最后附上我的测试图。
测试图