工作模式
ESP8266的wifi模块包含了三种工作模式
- AP(Wireless Access Point):无线接入点;该模式下,ESP8266类似于一部开启热点的手机,可以允许别的设备对其发起连接请求。该模式下,8266是一个服务端,是一个无线网络的创建者。
- STA(Wireless Station):无线终端模式;该模式下8266可以连接一个路由器或者其它AP模式下的设备,作为客户端向服务端发起连接请求,可以连接互联网。
- STA+AP:两种模式共存,既可以通过路由器连接到互联网,也可以作为WiFi热点,使其他设备连接到这个模块,实现广域网与局域网的无缝切换。
依赖库
#include <ESP8266WiFi.h>
STA模式
示例代码
/*
ESP8266-NodeMCU无线终端模式连接WiFi
*/
#include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi库
const char* ssid = "TP-LINK_3DF2"; // 需要连接到的WiFi名
const char* password = "123454321"; // 连接的WiFi密码
void setup() {
Serial.begin(115200); // 初始化串口通讯波特率为115200
WiFi.mode(WIFI_STA); // 设置Wifi工作模式为STA,默认为AP+STA模式
WiFi.begin(ssid, password); // 通过wifi名和密码连接到Wifi
Serial.print("\r\nConnecting to "); // 串口监视器输出网络连接信息
Serial.print(ssid); Serial.println(" ..."); // 显示NodeMCU正在尝试WiFi连接
int i = 0; // 检查WiFi是否连接成功
while (WiFi.status() != WL_CONNECTED) // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。
{ // 如果WiFi连接成功则返回值为WL_CONNECTED
delay(1000); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
Serial.print("waiting for ");
Serial.print(i++); Serial.println("s...");
}
Serial.println(""); // WiFi连接成功后
Serial.println("WiFi connected!"); // NodeMCU将通过串口监视器输出"连接成功"信息。
Serial.print("IP address: "); // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。
}
void loop() {
}
运行效果
通过Arduino软件,工具=>串口监视器=>选择115200的波特率,否则打印信息将会乱码
代码运行效果
可以通过串口打印的IP地址,通过路由器管理界面或者与设备连接同一局域网的设备ping该设备
AP模式
示例代码
IPAddress
类型是 Arduino 中用于表示和处理 IP 地址的类。它允许你创建、设置、和管理设备的 IP 地址,适用于动态和静态 IP 配置
- WiFi.softAP(用户名, 密码, 通道, 最大连接数);
参数为可选参数,可单独设置用户名表示开放AP,默认通道数为1,默认最大连接数为4
#include <ESP8266WiFi.h>
#define AP_SSID "ESP8266_wang" //SSID
#define AP_PSW "12345678" //PASSWD 8位以上
IPAddress local_IP(192,168,11,1); //IP地址
IPAddress gateway(192,168,11,255); //网关IP地址
IPAddress subnet(255,255,255,0); //子网掩码
void setup() {
Serial.begin(115200);
delay(2000);
Serial.print("配置AP网络信息。。。。。。");
WiFi.mode(WIFI_AP); //设置WIFI模式为AP模式
delay(2000);
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "网络信息成功" : "网络信息失败");
Serial.print("设置AP......");
bool result = WiFi.softAP(AP_SSID, AP_PSW); //设置账号和密码
if(result){
Serial.println("账号密码设置成功");
Serial.println(String("Soft-AP IP 地址是: ") + String(WiFi.softAPIP().toString()));
Serial.println(String("MAC 地址是: ") + WiFi.softAPmacAddress().c_str());
}else{
Serial.println("账号密码设置失败");
}
Serial.println("设置完成");
}
void loop() {
//循环打印当前的station个数
int i=WiFi.softAPgetStationNum();
Serial.println(String("SAT连接数: ") +String(i));
delay(5000);
}
运行效果
打开win的WiFi列表,可查到ESP8266的WiFi信息,输入密码后,连接数变为1
STA+AP模式
示例代码
网上能查到的文章一般是直接下载的固件,使用串口调试助手和AT指令进行通信
#include<ESP8266WiFi.h>
#include<WiFiUdp.h>
WiFiUDP udp;
IPAddress Client_IP(192,168,11,100);
//连接AP的设备的IP地址(可先手动连接一次后,
//查看设备ip,一般不会发生变化)
IPAddress local_IP(192,168,11,1); //IP地址
IPAddress gateway(192,168,11,255); //网关IP地址
IPAddress subnet(255,255,255,0); //子网掩码
unsigned int localPort=9999;//本地端口
unsigned int remoteport=9999;//远程端口
const char* ssid="TP-LINK_3DF2";//连接到远程AP的名字
const char* password="123454321";//连接到远程AP的密码
const char* ssid1="ESP8266";//建立AP名字
const char* password1="123456789";//建立AP的密码
char buff[255];//收发缓冲区
void setup()
{
Serial.begin(115200);
delay(5000);
WiFi.disconnect();
WiFi.mode(WIFI_AP_STA);
WiFi.softAPConfig(local_IP, gateway, subnet);//设置AP网络参数
WiFi.softAP(ssid1,password1,1);//设置AP账号密码
WiFi.begin(ssid,password);//连接到指定路由
Serial.println("please wait");
while(WiFi.status()!=WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
udp.begin(localPort);//建立UDP Server ,监听指定端口
Serial.print("Local ip:");
Serial.println(WiFi.localIP());
Serial.print("AP ip:");
Serial.println(WiFi.softAPIP());
}
void loop()
{
if(udp.parsePacket())
{
udp.read(buff,255);//读取数据
udp.beginPacket(Client_IP,remoteport);
udp.write(buff,255);
udp.endPacket();
Serial.print(buff);
memset(buff,0,255);//清除缓冲器数据
}
}
程序烧写入ESP8266后,手动连接开发板的AP热点,并设置串口调试助手参数
- 选择工作模式UDP
- 设置程序中的远端端口9999(PC相对于MCU来说,为远端设备)
- 设置目的IP,即local_IP,端口号localPort
- 点击打开
- 在发送信息框输入信息,MCU可读取信息并向PC发送同样的命令
- 查看路由器的连接设备中是否包含该设备
运行效果
文中所使用的串口助手下载链接如下: