ESP8266的WIFI连接

  • Post author:
  • Post category:其他


大家好,在这里我将要给大家介绍一下如何将自己的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(){}



版权声明:本文为qq_34988341原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。