ESP8266的AP/STA模式
AP: 也就是无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就一个AP。
STA: 每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。
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
接下来就是通过软件定时器查看连接这个WiFi的情况了【这部分代码写在timer.c里面】
手机连接AP服务器的效果
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
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");
}