ESP8266_08----------------AP和STATION模式配置

一.AP模式:(可以把ESP8266看作一个路由器)

AP (Access Point)模式,即 ESP8266 产生一个 WiFi,可供其他设备进行连接,那么一个 WiFi 我们必须对他进行一些必要的设置,如 WiFi 名称、WiFi 密码,这两个是我们大家都知道的,但是真正的一个 WiFi 热点其实还需要有其他的一些相关设置,对于我们的 ESP8266 产生一个 WiFi 的话还需要配置 WiFi 名长度、通道号、加密方式、是否隐藏 WiFi、允许最大连接的设备数量以及信标间隔时间。

1.需要用到的函数:

 1.设置 WiFi 的工作模式:
bool wifi_set_opmode (uint8 opmode)
//opmode:
//0x01: Station 模式;
//0x02:SoftAP 模式;
//0x03:Station+SoftAP 模式
//返回值:true:成功;false:失败;
2.设置 WiFi SoftAP 模式,并保存到 flash:
bool wifi_softap_set_config(struct softap_config *config)
/*
参数结构体如下:
struct softap_config 
{
    uint8 ssid[32];//WiFi名称
    uint8 password[64]; //密码
    uint8 ssid_len; //WiFi名长度
    uint8 channel; //通道号1 ~ 13
    AUTH_MODE authmode;//加密方,softAP模式不支持AUTH_WEP加密方式。
    uint8 ssid_hidden; //是否隐藏 WiFi,默认为 0 不隐藏网络
    uint8 max_connection; //最大连接设备数,最大设备数为 4
    uint16 beacon_interval;//信标间隔时间,支持 100-60000ms(信标间隔时间即 
                              SSID 广播包发送的间距),默认为 100ms
}
返回值:true:成功;false:失败;
注意:使用此函数前必须设置 ESP8266 为 AP 模式;此函数其实是在内核中
完成的,不会调用立即生效;注意配置的 WiFi 密码不少于 8 位!!!
*/
3.查询 WiFi Station 模式或者 AP 模式的 IP 地址,确认模式是否配置成功:
bool wifi_get_ip_info(uint8 if_index, struct ip_info *info)
/*
uint8 if_index:选择是查询 AP 模式的还是 Station 模式的,0x00:Station 模
                式;0x01:AP 模式,我们也可以使用宏,在 SDK 包内定义了两个宏:
#define STATION_IF 0x00
#define SOFTAP_IF 0x01
struct ip_info *info:用于存储获取到的 IP 信息结构体;
返回值:true:成;false:失败。
*/
4.  获取 AP 模式下接入此 WiFi 的设备数量:
uint8 wifi_softap_get_station_num(void)
//返回值:返回 AP 模式下接入 WiFi 的设备数量

2.程序的编写:

    程序的功能:将我们的ESP8266设置为AP模式,供其他无线设备连接。
    程序编写流程:
       1.配置AP模式的工作参数。
       2.每个500ms调用一次定时器回调函数,在回调函数内获取ESP8266的IP和连接AP的station数量。

我们直接拷贝软件定时器的工程,然后新建wifi.cwifi.h文件,然后将他们分别添加到app/driverapp/include/driver下,刷新工程。

1.wifi.h:

#ifndef __WIFI_H
#define __WIFI_H

#include "ets_sys.h"
#include "osapi.h"   //系统函数
#include "user_interface.h"

#define WIFI_SSID  "ESP_WIFI_TEST"//WIFI名称
#define WIFI_PASS  "12345678"//WIFI密码

void ICACHE_FLASH_ATTR WIFI_AP_MODE_Init(void);//AP模式初始化函数

#endif

2.wifi.c:

#include "./driver/wifi.h"

//AP模式初始化
void ICACHE_FLASH_ATTR WIFI_AP_MODE_Init(void)
{
	struct softap_config  APConfig_Structure;
	wifi_set_opmode(0x02);//配置WiFi为AP模式

	/* AP结构体配置 */
	os_strcpy(APConfig_Structure.ssid,WIFI_SSID);    //WIFI名称
	os_strcpy(APConfig_Structure.password,WIFI_PASS);//WIFI密码
	APConfig_Structure.ssid_len = sizeof(WIFI_SSID);//WIFI名称长度
	APConfig_Structure.authmode = AUTH_WPA2_PSK;    //WIFI加密方式
	APConfig_Structure.beacon_interval = 100;       //WIFI信标间隔时间
	APConfig_Structure.channel = 1;                 //WIFI通道号
	APConfig_Structure.max_connection = 4;          //WIFI最大连接数量
	APConfig_Structure.ssid_hidden = 0;             //WIFI是否隐藏

	wifi_softap_set_config(&APConfig_Structure);
}

3.os_timer.h:

#ifndef __OS_TIMER_H
#define __OS_TIMER_H

#include "ets_sys.h"
#include "osapi.h"   //系统函数
#include "user_interface.h"
#include "./driver/wifi.h"

void OS_Timer_1_Cb(void);//定时器回调函数
void OS_Timer_Init(uint32_t ms,bool repeat_flag);//定时器初始化

#endif /* OS_TIMER_H */

4.os_timer.c:

#include "./driver/os_timer.h"

os_timer_t os_timer_1;//定义软件定时器结构体变量

//软件定时器回调函数
void OS_Timer_1_Cb(void)
{
	uint8_t IP[4]={0};//存放获得的IP地址
	struct ip_info AP_IP_Info;//IP结构体信息

	if(wifi_get_ip_info(SOFTAP_IF,&AP_IP_Info)==true)//获取ESP8266的IP
	 {
		IP[0]=AP_IP_Info.ip.addr;
		IP[1]=AP_IP_Info.ip.addr>>8;
		IP[2]=AP_IP_Info.ip.addr>16;
		IP[3]=AP_IP_Info.ip.addr>>24;
		os_printf("AP的IP:%d.%d.%d.%d\n",IP[0],IP[1],IP[2],IP[3]);
		os_printf("接入的station数量=%d\n",wifi_softap_get_station_num());
	 }
}

//软件定时器配置初始化
void OS_Timer_Init(uint32_t ms,bool repeat_flag)
{
	os_timer_disarm(&os_timer_1);//关闭软件定时器
	os_timer_setfn(&os_timer_1,(os_timer_func_t*)OS_Timer_1_Cb,NULL);//注册软件定时器回调函数
	os_timer_arm(&os_timer_1,ms,repeat_flag);//打开软件定时器,设置定时周期,设置是否自动重装
}

5.user_main.c:

#include "ets_sys.h"
#include "user_config.h"//用户配置
#include "eagle_soc.h"//GPIO函数,宏定义
#include "c_types.h" //变量类型
#include "osapi.h"   //系统函数
#include "user_interface.h"
#include "./driver/os_timer.h"//软件定时器
#include "./driver/wifi.h"


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
            rf_cal_sec = 1024 - 5;
            break;
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}

//毫秒延时函数
void ICACHE_FLASH_ATTR delay_ms(u32 ms)
{
	for(;ms>0;ms--){
		os_delay_us(1000);//1ms
	}
}
/*
---------------------------------
        程序逻辑:
  *1.配置AP模式的工作参数
  *2.每个500ms调用一次定时器回调函数,在回调函数内获取AP的IP和连接AP的station数量
---------------------------------
*/

/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR user_init(void)
{
  uart_init(9600,9600);
  os_printf("\r\nESP8266——AP模式\r\n");
  WIFI_AP_MODE_Init();//AP模式初始化
  OS_Timer_Init(500,1);//每隔500ms调用一次回调函数,打印ESP8266设备信息和连接ESP8266设备数量
}

3.运行结果:

手机可以搜索到ESP8266的热点信息 :

 

串口调试助手打印的信息: 

二.Station模式:(ESP8266是一个接入点)

Station  模式,即我们的 ESP8266 可以接入现有的 WiFi 网络,就像我们的手机接入到我们家里的 WiFi 一样,那么大家回想一下我们手机连接一个 WiFi 热点的情况大家就可以知道,对于 STA 模式,我们肯定要配置需要接入的 WiFi WiFi名称、WiFi 密码,当你所在的位置有相同名字的 WiFi 热点时,我们还需要对其MAC 地址进行验证以确定我们需要连接的是哪一个 WiFi 热点。而当我们的设备接入 WiFi 之后每台设备在这个局域网中都将会有一个唯一的 IP 地址,相应的我
们可以通过查询设备的 IP 地址知道我们是否成功的接入到了此 WiFi 网络。

1.需要用到的函数:

1.设置 WiFi 的工作模式:
bool wifi_set_opmode (uint8 opmode)
//opmode:
//0x01::Station 模式;
//0x02:SoftAP 模式;
//0x03:Station+SoftAP 模式
//返回值:true:成功;false:失败;
2.设置 WiFi Station 模式并保存到 flash:
bool wifi_station_set_config(struct station_config*config)
/*
struct station_config *config:Wi-Fi Station 接口配置参数指针
参数结构体如下:
struct station_config 
{
    uint8 ssid[32];//需要连接的 WiFi 的名称
    uint8 password[64];//需要连接的 WiFi 的密码
    uint8 bssid_set; //当一个局域网中有多个同名 WiFi 时使用
                     // bssid_set 为 1 时连接 WiFi 还将校验 MAC 地址
    uint8 bssid[6];//需要连接 WiFi 的 MAC 地址
    wifi_fast_scan_threshold_t threshold;//结构体,包含了 WiFi 的加密方
                                         //式和信号强度两个变量
};
注意:WiFi 名和 WiFi 密码赋值需要使用 os_strcpy 而不能直接使用=;如果
此 API 函数在 user_init 函数中调用则系统在初始化完成之后会自动连接 AP(路
由),不需要用户再调用 wifi_station_connectAPI 函数。
例: os_strcpy(STA_Config_Struct.ssid,ESP8266_SSID);
os_strcpy(STA_Config_Struct.password,ESP8266_PASS);
wifi_station_set_config(&STA_Config_Struct);
*/
3.查询 ESP8266 Wi-Fi Station 接口连接 AP 的状态。
uint8 wifi_station_get_connect_status(void)
/*
返回值:enum{
STATION_IDLE = 0,//空闲

STATION_CONNECTING,//正在连接

STATION_WRONG_PASSWORD,//密码错误

STATION_NO_AP_FOUND,//没有发现 AP

STATION_CONNECT_FAIL,//连接失败

STATION_GOT_IP //获取到 IP

};
*/
4.查询 WiFi Station 模式或者 AP 模式的 IP 地址,确认模式是否配置成功:
bool wifi_get_ip_info(uint8 if_index, struct ip_info *info)
/*
uint8 if_index:选择是查询 AP 模式的还是 Station 模式的。
0x00:Station 模式
0x01:AP 模式

我们也可以使用宏,在 SDK 包内定义了两个宏:
#define STATION_IF 0x00
#define SOFTAP_IF 0x01

struct ip_info *info:用于存储获取到的 IP 信息结构体;

返回值:true:成;false:失败。
*/

2.程序的编写:

程序的功能:将我们的ESP8266设置为Station模式,连接路由器。
    程序编写流程:
       1.配置Station模式的工作参数。
       2.每个500ms调用一次定时器回调函数,在回调函数内获取ESP8266的状态信息和IP。 

我们直接拷贝软件定时器的工程,然后新建wifi.cwifi.h文件,然后将他们分别添加到app/driverapp/include/driver下,刷新工程。

1.wifi.h:

#ifndef __WIFI_H
#define __WIFI_H

#include "ets_sys.h"
#include "osapi.h"   //系统函数
#include "user_interface.h"

#define WIFI_SSID  "HuaWei"//要连接的WIFI名称
#define WIFI_PASS  "12345678"//要连接的WIFI密码

void ICACHE_FLASH_ATTR WIFI_STATION_MODE_Init(void);

#endif

2.wifi.c:

#include "./driver/wifi.h"

//STATION模式初始化
void ICACHE_FLASH_ATTR WIFI_STATION_MODE_Init(void)
{
	struct station_config STATION_Config_Structure;
	struct ip_info station_ip_info;
	wifi_set_opmode(0x01);      //配置WIFI为STATION模式
	os_strcpy(STATION_Config_Structure.ssid,WIFI_SSID);//要连接的WIFI名称
	os_strcpy(STATION_Config_Structure.password,WIFI_PASS);//WIFI要连接的密码
	wifi_station_set_config(&STATION_Config_Structure);
}

3.os_timer.h:

#ifndef __OS_TIMER_H
#define __OS_TIMER_H

#include "ets_sys.h"
#include "osapi.h"   //系统函数
#include "user_interface.h"

void OS_Timer_1_Cb(void);
void OS_Timer_Init(uint32_t ms,bool repeat_flag);

#endif /* OS_TIMER_H */

4.os_timer.c:

#include "./driver/os_timer.h"
#include "./driver/wifi.h"
os_timer_t os_timer_1;//定义软件定时器结构体变量

//软件定时器回调函数
void OS_Timer_1_Cb(void)
{
	uint8_t station_status=0;
	struct ip_info STATION_IP_Info;//IP结构体信息
	uint8_t IP[4]={0};
	station_status=wifi_station_get_connect_status();
	switch(station_status)
	{
	case STATION_IDLE://空闲
		os_printf("空闲!\n");
		break;
	case STATION_CONNECTING://正在连接
			os_printf("正在连接!\n");
			break;
	case STATION_CONNECT_FAIL://连接失败
			os_printf("连接失败!\n");
			break;
	case STATION_WRONG_PASSWORD://密码错误
			os_printf("密码错误!\n");
			break;
	case STATION_NO_AP_FOUND://没发现AP
			os_printf("没发现AP!\n");
			break;
	case STATION_GOT_IP://获取到IP
			os_printf("获取到IP!\n");
			wifi_get_ip_info(STATION_IF,&STATION_IP_Info);
					IP[0]=STATION_IP_Info.ip.addr;
					IP[1]=STATION_IP_Info.ip.addr>>8;
					IP[2]=STATION_IP_Info.ip.addr>16;
					IP[3]=STATION_IP_Info.ip.addr>>24;
					os_printf("IP:%d.%d.%d.%d\n",IP[0],IP[1],IP[2],IP[3]);
			break;
	}
}

//软件定时器配置初始化
void OS_Timer_Init(uint32_t ms,bool repeat_flag)
{
	os_timer_disarm(&os_timer_1);//关闭软件定时器
	os_timer_setfn(&os_timer_1,(os_timer_func_t*)OS_Timer_1_Cb,NULL);//注册软件定时器回调函数
	os_timer_arm(&os_timer_1,ms,repeat_flag);//打开软件定时器,设置定时周期,设置是否自动重装
}

5.user_main.c:

#include "ets_sys.h"
#include "user_config.h"//用户配置
#include "eagle_soc.h"//GPIO函数,宏定义
#include "c_types.h" //变量类型
#include "osapi.h"   //系统函数
#include "user_interface.h"
#include "./driver/os_timer.h"//软件定时器
#include "./driver/wifi.h"


/******************************************************************************
 * FunctionName : user_rf_cal_sector_set
 * Description  : SDK just reversed 4 sectors, used for rf init data and paramters.
 *                We add this function to force users to set rf cal sector, since
 *                we don't know which sector is free in user's application.
 *                sector map for last several sectors : ABCCC
 *                A : rf cal
 *                B : rf init data
 *                C : sdk parameters
 * Parameters   : none
 * Returns      : rf cal sector
*******************************************************************************/
uint32 ICACHE_FLASH_ATTR
user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 5;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
            rf_cal_sec = 512 - 5;
            break;
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
            rf_cal_sec = 1024 - 5;
            break;
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        case FLASH_SIZE_64M_MAP_1024_1024:
            rf_cal_sec = 2048 - 5;
            break;
        case FLASH_SIZE_128M_MAP_1024_1024:
            rf_cal_sec = 4096 - 5;
            break;
        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

void ICACHE_FLASH_ATTR
user_rf_pre_init(void)
{
}

//毫秒延时函数
void ICACHE_FLASH_ATTR
delay_ms(u32 ms)
{
	for(;ms>0;ms--){
		os_delay_us(1000);//1ms
	}
}
/*-------------------------
 *程序流程:
 *1.初始化STATION模式
 *2.在回调函数内打印相关信息
 */

/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
  uart_init(9600,9600);
  os_printf("\r\nESP8266——STATION模式\r\n");
  WIFI_STATION_MODE_Init();//STATION模式初始化
  OS_Timer_Init(500,1);//500ms,重装载
}

3.运行结果:

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值