ESP8266的AP/STA模式

AP: 也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就一个AP。

esp8266 ap模式连接数 esp8266开启ap模式_esp8266 ap模式连接数


STA: 每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。

esp8266 ap模式连接数 esp8266开启ap模式_esp8266 ap模式连接数_02

1 ESP8266的AP模式

1.1 ESP8266创建AP模式步骤

① 构建WiFi结构体参数

struct softap_config {
	uint8 ssid[32];			// wifi账号
	uint8 password[64];		// WiFi密码
	uint8 ssid_len;			// WiFi账号长度
	uint8 channel;			// 支持通道1至通道13
	AUTH_MODE authmode;		// AP模式下不支持WEP
	uint8 ssid_hidden;		// Note: default 0
	uint8 max_connection;     // Note: default 4, max 4
	uint16 beacon_interval;   // Note: support 100 ~ 60000 ms, default 100
};

② 设置ESP8266为AP模式

wifi_set_opmode(0x02);				// 设置为AP模式,并保存到Flash 详见文档6.2.1.3章节
	0x01:STA模式
	0x02:AP模式
	0x03:STA + AP模式

③ 设置WiFi相关参数,将对应参数一一赋值

os_memset(&APConfig, 0, sizeof(struct softap_config));	// 将结构体清零
os_strcpy(APConfig.ssid, WiFiName);						// 设置WiFi名称
os_strcpy(APConfig.password, WiFiPassWord);				//设置WiFi密码
APConfig.ssid_len=os_strlen(WiFiName);					// 设置ssid长度(和SSID的长度一致)
APConfig.channel=1;                      				// 通道号1~13
APConfig.authmode=AUTH_WPA2_PSK;           				// 设置加密模式
APConfig.ssid_hidden=0;                  				// 不隐藏SSID
APConfig.max_connection=4;               				// 最大连接数
APConfig.beacon_interval=100;            				// 信标间隔时槽100~60000 ms

④ 将参数数据保存到Flash空间

wifi_softap_set_config(&APConfig);						// 设置soft-AP,并保存到Flash

esp8266 ap模式连接数 esp8266开启ap模式_回调函数_03


接下来就是通过软件定时器查看连接这个WiFi的情况了【这部分代码写在timer.c里面】

esp8266 ap模式连接数 esp8266开启ap模式_esp8266 ap模式连接数_04


手机连接AP服务器的效果

esp8266 ap模式连接数 esp8266开启ap模式_回调函数_05

1.2 参考代码

//apMode.c
#include "driver/apMode.h"

void ICACHE_FLASH_ATTR WifiSetAPModeInit(void)
{
	struct softap_config APConfig;		// AP参数结构体
	wifi_set_opmode(0x02);				// 设置为AP模式,并保存到Flash 详见文档6.2.1.3章节

	os_memset(&APConfig, 0, sizeof(struct softap_config));	// 将结构体清零
	os_strcpy(APConfig.ssid, WiFiName);						// 设置WiFi名称
	os_strcpy(APConfig.password, WiFiPassWord);				//设置WiFi密码
	APConfig.ssid_len = os_strlen(WiFiName);				// 设置ssid长度(和SSID的长度一致)
	APConfig.channel = 1;                      				// 通道号1~13
	APConfig.authmode = AUTH_WPA2_PSK;           			// 设置加密模式
	APConfig.ssid_hidden = 0;                  				// 不隐藏SSID
	APConfig.max_connection = 4;               				// 最大连接数
	APConfig.beacon_interval = 100;            				// 信标间隔时槽100~60000 ms

	wifi_softap_set_config(&APConfig);						// 设置soft-AP,并保存到Flash
}
//timer.c
#include "driver/delay.h"
#include "driver/led.h"
#include "driver/key.h"
#include "driver/uart.h"
#include "driver/timer.h"
#include "driver/dht11.h"
#include "driver/apMode.h"

/*
 * 函数名称:void TimerInitConfig(uint32_t DelayMs,bool repeat_flag)
 * 函数功能:定时器初始化函数
 * 函数形参:
 *       uint32_t DelayMs   延时时间
 *       bool repeat_flag   是否重复
 *       		1:重复   0:不重复
 * 返回值:
 * */
os_timer_t os_timer_500ms;//定义一个定时器名称
void TimerInitConfig(uint32_t DelayMs, bool repeat_flag)
{
	os_timer_disarm(&os_timer_500ms);//关闭定时器
	os_timer_setfn(&os_timer_500ms, (os_timer_func_t *)TimerBackFunction, NULL);//设置定时器回调函数
	os_timer_arm(&os_timer_500ms, DelayMs, repeat_flag);
}

/*
 * 函数名称:void TimerBackFunction(void)
 * 函数功能:定时器回调函数
 * 函数形参:无
 * 返回值:   无
 * */
void TimerBackFunction(void)
{
	struct ip_info ipESP8266;	// IP信息结构体
	u8  ESP8266_IP[4];		// 点分十进制形式保存IP

	// 查询并打印ESP8266的工作模式
	switch (wifi_get_opmode())	// 输出工作模式
	{
		case 0x01:	os_printf("\nESP8266_Mode = Station\n");		break;
		case 0x02:	os_printf("\nESP8266_Mode = SoftAP\n");			break;
		case 0x03:	os_printf("\nESP8266_Mode = Station+SoftAP\n");	break;
	}

	// 获取ESP8266_AP模式下的IP地址
	//【AP模式下,如果开启DHCP(默认),并且未设置IP相关参数,ESP8266的IP地址=192.168.4.1】
	wifi_get_ip_info(SOFTAP_IF, &ipESP8266);	// 参数2:IP信息结构体指针

	// ESP8266_AP_IP.ip.addr==32位二进制IP地址,将它转换为点分十进制的形式
	ESP8266_IP[0] = ipESP8266.ip.addr;			// 点分十进制IP的第一个数 <==> addr低八位
	ESP8266_IP[1] = ipESP8266.ip.addr >> 8;		// 点分十进制IP的第二个数 <==> addr次低八位
	ESP8266_IP[2] = ipESP8266.ip.addr >> 16;		// 点分十进制IP的第三个数 <==> addr次高八位
	ESP8266_IP[3] = ipESP8266.ip.addr >> 24;		// 点分十进制IP的第四个数 <==> addr高八位

	// 打印ESP8266的IP地址
	os_printf("ESP8266_IP = %d.%d.%d.%d\n", ESP8266_IP[0], ESP8266_IP[1], ESP8266_IP[2], ESP8266_IP[3]);
	// 查询并打印接入此WIFI的设备数量
	os_printf("Number of devices connected to this WIFI = %d\n", wifi_softap_get_station_num());
}
//user_init函数
void ICACHE_FLASH_ATTR user_init(void)
{
	int i;
	os_DelayMs(1000);
	uart_init(115200, 115200);//设置串口波特率
	WifiSetAPModeInit();//wifi AP模式设置
	TimerInitConfig(500, 1);//软件定时器500毫秒延时  -- 回调函数在timer.c

	os_printf("=============================================\r\n");
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n嵌入式陈工个人编辑资料\r\n未经本人同意请勿私自传播\r\n");
	os_printf("\r\nESP8266创建局域网服务器\r\n");
	os_printf("\r\n带看门狗\r\n");
	os_printf("\r\nSPI Flash 的 ID 号:%d\r\n", spi_flash_get_id());
	os_printf("=============================================\r\n");
}

2 ESP8266的STA模式

2.1 创建ESP8266 STA模块步骤

① 创建WiFi结构体

struct station_config staConfig;	// STA参数结构体
struct station_config {
	uint8 ssid[32];
	uint8 password[64];
	uint8 bssid_set;    // Note: If bssid_set is 1, station will just connect to the router
						// with both ssid[] and bssid[] matched. Please check about this.
	uint8 bssid[6];
	wifi_fast_scan_threshold_t threshold;
};

② 设置WiFi模块为STA模式

wifi_set_opmode(0x01);				// 设置为STA模式,并保存到Flash 详见文档6.2.1.3章节
    0x01:STA模式
	0x02:AP模式
	0x03:STA + AP模式

③ 配置连接的路由器信息

// 结构体赋值,配置STA模式参数
os_memset(&staConfig, 0, sizeof(struct station_config));	// STA参数结构体 = 0
os_strcpy(staConfig.ssid, staWiFiName);						// 设置WIFI名
os_strcpy(staConfig.password, staWiFiPassWord);				// 设置WIFI密码

④ 将WiFi的配置信息保存到Flash

wifi_station_set_config(&staConfig);	// 设置STA参数,并保存到Flash

esp8266 ap模式连接数 esp8266开启ap模式_IP_06

2.2 参开代码

//staMode.c
#include "driver/staMode.h"

void ICACHE_FLASH_ATTR WifiSetSTAModeInit(void)
{
	/*
	 * 配置ESP8266为STA模式连接路由器步骤
	 * ① 创建WiFi结构体
	 * ② 设置WiFi模块为STA模式
	 * ③ 配置连接的路由器信息
	 * ④ 将WiFi设置保存到Flash
	 * */
	struct station_config staConfig;	// STA参数结构体

	wifi_set_opmode(0x01);				// 设置为STA模式,并保存到Flash 详见文档6.2.1.3章节
	// 结构体赋值,配置STA模式参数
	os_memset(&staConfig, 0, sizeof(struct station_config));	// STA参数结构体 = 0
	os_strcpy(staConfig.ssid, staWiFiName);						// 设置WIFI名
	os_strcpy(staConfig.password, staWiFiPassWord);				// 设置WIFI密码

	wifi_station_set_config(&staConfig);	// 设置STA参数,并保存到Flash
}
//timer.c
/*
 * 函数名称:void TimerInitConfig(uint32_t DelayMs,bool repeat_flag)
 * 函数功能:定时器初始化函数
 * 函数形参:
 *       uint32_t DelayMs   延时时间
 *       bool repeat_flag   是否重复
 *       		1:重复   0:不重复
 * 返回值:
 * */
os_timer_t os_timer_500ms;//定义一个定时器名称
void TimerInitConfig(uint32_t DelayMs, bool repeat_flag)
{
	os_timer_disarm(&os_timer_500ms);//关闭定时器
	os_timer_setfn(&os_timer_500ms, (os_timer_func_t *)TimerBackFunction, NULL);//设置定时器回调函数
	os_timer_arm(&os_timer_500ms, DelayMs, repeat_flag);
}

/*
 * 函数名称:void TimerBackFunction(void)
 * 函数功能:定时器回调函数
 * 函数形参:无
 * 返回值:   无
 * */
void TimerBackFunction(void)
{
	u8 WIFI_STA_Connect;			// WIFI接入状态标志
	u8 ipWIFI[4] = { 0 };				// 保存WiFi模块的IP地址信息
	struct ip_info ipESP8266;	// ESP8266的IP信息

	WIFI_STA_Connect = wifi_station_get_connect_status();
	/*
		STATION_IDLE = 0,			//STATION闲置
		STATION_CONNECTING,			//正在连接WIFI
		STATION_WRONG_PASSWORD,		//WIFI密码错误
		STATION_NO_AP_FOUND,		//未发现指定WIFI
		STATION_CONNECT_FAIL,		//连接失败
		STATION_GOT_IP		    	//获得IP,连接成功
	 */
	switch (WIFI_STA_Connect)
	{
		case STATION_IDLE:			os_printf("STATION闲置\r\n");		break;
		case STATION_CONNECTING:		os_printf("正在连接WIFI\r\n");		break;
		case STATION_WRONG_PASSWORD:	os_printf("WIFI密码错误\r\n");		break;
		case STATION_NO_AP_FOUND:		os_printf("未发现指定WIFI\r\n");	break;
		case STATION_CONNECT_FAIL:		os_printf("连接失败\r\n");			break;
		case STATION_GOT_IP:			os_printf("获得IP,连接成功\r\n");	break;
	}

	if (WIFI_STA_Connect == STATION_GOT_IP)//已连接到路由器,获取IP地址
	{
		// ① 获取IP地址  DHCP-Client是默认开启的
		wifi_get_ip_info(STATION_IF, &ipESP8266);// 查询WiFi的IP参数   详见文档6.2.1.46章节
		// ② 获取WiFi地址
		ipWIFI[0] = ipESP8266.ip.addr;		// IP地址高八位 == addr低八位
		ipWIFI[1] = ipESP8266.ip.addr >> 8;	// IP地址次高八位 == addr次低八位
		ipWIFI[2] = ipESP8266.ip.addr >> 16;	// IP地址次低八位 == addr次高八位
		ipWIFI[3] = ipESP8266.ip.addr >> 24;	// IP地址低八位 == addr高八位
		//③ 输出WiFi的IP地址
		os_printf("ip地址 = %d.%d.%d.%d\r\n", ipWIFI[0], ipWIFI[1], ipWIFI[2], ipWIFI[3]);
		//④ 退出定时器回调函数
		os_timer_disarm(&os_timer_500ms);		// 关闭定时器
	}
}
//user_init函数
void ICACHE_FLASH_ATTR user_init(void)
{
	int i;
	os_DelayMs(1000);
	uart_init(115200, 115200);//设置串口波特率
	WifiSetSTAModeInit();//wifi AP模式设置
	TimerInitConfig(500, 1);//软件定时器500毫秒延时  -- 回调函数在timer.c

	os_printf("=============================================\r\n");
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n嵌入式陈工个人编辑资料\r\n未经本人同意请勿私自传播\r\n");
	os_printf("\r\nESP8266 STA模式连接路由器\r\n");
	os_printf("\r\n带看门狗\r\n");
	os_printf("\r\nSPI Flash 的 ID 号:%d\r\n", spi_flash_get_id());
	os_printf("=============================================\r\n");
}