大家好,在这里我将要给大家介绍一下如何将自己的ESP8266设置成Station模式,并且去连接别的wifi;废话不多说,直接开干.
在这里因为要进行串口输出采集的信息,所以我们先初始化串口;
调用uart_init(115200,115200);来进行初始化
首先我们先获取我们ESP8266当前的模式;
获取完以后,我们调用这个函数去设置我们的ESP8266的模式;
这个函数设置的模式不会被保存到FLASH中,你要是想要每次上电以后自动设置成station模式的话你可以调用wifi_set_opmode(0x01)函数;好了,到了这一步我们这是设置好我们的ESP8266的station模式了。
因为要连接wifi,所以我们先要去扫描一下现在周边的WiFi有什么,
这个就是扫描WiFi所用到的函数,在这个函数中有两个参数,一个是struct scan_config *config这个就是你要设置的WiFi的结构体,另一个是一个回调函数;scan_done_cb_t cb: cb;所以在这里我们需要去设置一个回调函数去调用我们这个scan 函数
写完这个回调函数以后我们去写scan函数,
scan 函数里面有两个结构体,在这里我们用到bss_info这个结构体,首先我们将bss_link 指向下一个bss_link,如果下一个不是NULL,那么我们就判断一下扫描的WiFi的名字长度,如果小于33就copy过去,大于33就copy前33个名字;这里讲一下os_memset();这个函数是将你的数组全部置为一个数(这里我们用其来初始化我们的数组);os_memcoy()这个函数我们是用来复制我们扫描到的WiFi的名字的,然后就开始打印扫描到的WiFi的参数,ssid(名字),rssi(Received Signal Strength Indication接收的信号强度指示);bssd(BSSID就是被桥接的无线网络的MAC地址);authmode;因为要连接WiFi所以我们还要配置下ESPstation模式的结构体
这里有四个参数,ssid是你要连接的WiFi的名字,password是你要连接的WiFi的密码;
然后要连接所以调用下面这个函数
调用这个connect函数;
因为你不确定是不是真的连接上了没有,接下来我们设置一个定时器的函数,去定时的扫描一下是不是真的连上了吗;设置一个conned函数;
这里只要进入这个函数,我们就先把定时器关掉,因为如果定时器的时间太短的话,我们的程序就会卡死在这个了,他会无限的递归了.然后我们去看看他的状态是什么,如果是成功的话,就把定时器关掉,不在打开了,如果不是的话,我们就将count(用来记录连接一个WiFi尝试的次数 的一个计数值);然后在else里面打开定时器,如果记录的次数大于7的话,我们就printf()失败了,然后也将定时器关掉。配置好这些,我们在user_init()里最后加一个系统的回调函数
这个函数必须调用(只要你使用station模式);
好了这里我们就配置成功了,上一个结果图;
代码在下面
///*
// * user_main.c
// *
// * Created on: 2015年6月9日
// * Author: zailushang
// */
#include "driver/uart.h"
#include "user_main.h"
ETSTimer Timer;//定时器的一个结构体参数
void ICACHE_FLASH_ATTR Wifi_conned(void *arg)
{
static uint8 count=0;//记录不成功的次数
uint8 status;//记录连接状态
os_timer_disarm(&Timer);//将定时器关闭
count++;
status=wifi_station_get_connect_status();//获得连接的状态
if(status == STATION_GOT_IP)
{
os_printf("Wifi Connected successfully");//如果成功打印信息
os_timer_disarm(&Timer);//关闭定时器
}
else
{
os_timer_arm(&Timer,2000,NULL);//不成功的话,打开定时器进行下一次的查看是否连接上
if(count>=7)
{
os_printf("Wifi Connected failly");//如果查看了7次还没连接上的话,就打印连接失败
os_timer_disarm(&Timer);//关掉定时器,不在去查看连接状态了
}
}
}
void ICACHE_FLASH_ATTR scan_done(void *arg,STATUS status)
{
uint8 ssid[33];//WiFi名字的一个数组
struct station_config stationConf;//这个station的一个配置的结构体
if(status == OK)//如果状态是NULL
{
struct bss_info *bss_link = (struct bss_info *)arg;//将其强制转换成bss_inf的结构体
bss_link = bss_link->next.stqe_next;//bss_info之指向下一个wifi
while(bss_link != NULL)
{
os_memset(ssid,0,33);//初始化ssid这个是数组
if(os_strlen(bss_link->ssid)<= 33)//名字下小于33
{
os_memcpy(ssid,bss_link->ssid,os_strlen(bss_link->ssid));//直接copy过去
}
else
{
os_memcpy(ssid,bss_link->ssid,33);//大于33只将前33个字copy过去
}
os_printf("+CWLAP:(%d,\"%s\",%d,\""MACSTR"\",%d)\r\n",
bss_link->authmode,ssid,bss_link->rssi,
MAC2STR(bss_link->bssid),bss_link->channel);//打印输出获得WiFi的各个参数
bss_link = bss_link->next.stqe_next;//指向下一个wifi
}
os_memcpy(&stationConf.ssid,"MX5",os_strlen("HelloWord"));//配置你要连接的WiFi的名字
os_memcpy(&stationConf.password,"1234567890",os_strlen("0123456789"));//你要连接的WiFi的密码
wifi_station_set_config_current(&stationConf);//配置你刚才设置的wifi配置
wifi_station_connect();//连接那个wifi
os_timer_disarm(&Timer);//不使能定时器
os_timer_setfn(&Timer,Wifi_conned,NULL);//将回调函数绑定
os_timer_arm(&Timer,2000,NULL);//初始化定时器的时间以及使能定时器
}
}
void to_scan(void)
{
wifi_station_scan(NULL,scan_done);//扫描WiFi函数
}
void user_init()
{
uint8 mode=0;
uart_init(115200,115200);//初始化串口(波特率是115200);
mode = wifi_get_opmode();//获得当前的模式
os_printf("当前的工作模式是:%d\r\n",mode);//打印出来
wifi_set_opmode_current(0x01);//设置成station模式
mode = wifi_get_opmode();//获得当前模式
os_printf("当前工作模式是:%d\r\n",mode);//打印出模式看看是否设置成功了没
system_init_done_cb(to_scan);//这个回调函数必须在station模式配置成功下才可以调用
}
void user_rf_pre_init(){}