esp8266设置sta失败_博哥零基础教你玩转ESP8266(六) STA连接 —— 我想连上你

本帖最后由 单片机菜鸟 于 2019-7-4 09:43 编辑

帖子导航:

博哥零基础教你玩转ESP8266(一) 重识ESP8266

博哥零基础教你玩转ESP8266(二) 认识一下Arduino core for ESP8266

博哥零基础教你玩转ESP8266(三) 详解ESP8266 工作模式

博哥零基础教你玩转ESP8266(四) 认识一下ESP8266WiFi库

博哥零基础教你玩转ESP8266(五) ESP8266开发硬件搭建

博哥零基础教你玩转ESP8266(六) STA连接 —— 我想连上你

博哥零基础教你玩转ESP8266(七) Soft AP —— 谁想连上我

博哥零基础教你玩转ESP8266(八) Scan —— 扫描周边网络

博哥零基础教你玩转ESP8266(九) STA + Soft-AP联合出品

博哥零基础教你玩转ESP8266(十) SmartConfig —配置网路

博哥零基础教你玩转ESP8266(十一) Tcp client博哥零基础教你玩转ESP8266(十二) Tcp Server

博哥零基础教你玩转ESP8266(十三) ESP8266WiFiGeneric库

博哥零基础教你玩转ESP8266(十四) ESP8266HTTPClient 连接世界

博哥零基础教你玩转ESP8266(十五) ESP8266WebServer 服务端

个人免费交流群:ESP物联网开发之旅 622368884

一、前言在前面几篇里,楼主跟大家讲解ESP8266的开发软件配置部分以及硬件开发平台搭建部分,目的就是想让大家有个大概的开发概念。并且,楼主一直重申ESP8266 WiFi模块有三种工作模式:

1.Station模式,也叫站点模式;

2.Soft-Access Point模式,也叫Soft-AP模式,可以理解为WiFi热点模式;

3.以上两种的集合模式,Station 兼Soft-Access Point,也是Mesh NetWork的实现基础;任何的ESP8266开发,都是基于以上一种工作模式来开发,所以楼主重点先带大家认识一下这三种模式,本章先主要介绍第一种Station模式。

二、Station模式

Station模式又叫做站点工作模式,类似于无线终端,有图有真相:

esp8266-station.png (119.04 KB, 下载次数: 60)

2018-9-1 07:51 上传

处于Station模式下的ESP8266,可以连接到AP。通过Station(简称为“STA”)模式,ESP8266作为客户端连接到路由的wifi信号。以下黑色字体内容摘录于楼主自建qq群里面在arduino 联网.pdf文件,楼主觉得讲得挺生动,故分享给大家:

首先AP发出信标帧(beacon),意思就是我在这里,谁来泡我啊,移动工作站也会发出探(probe)帧,意思是有谁我可以泡啊,每隔一定时间发出一次。(后面会讲到Scan功能)。

所以,根据这一点,可以产生很多有价值的应用。比如你的带WiFi功能的手机,即使在不连接wifi的情况下,只要打开WiFi功能,就可以被路由器截获这帧信息,路由器收集之后,你的信息就会被一个审计的东西发到服务器上,你手机号xxx上线时间xxx下线时间xxx都浏览了哪些网页,WiFi建立连接过程都一目了然,你的位置也全都暴露了,这就叫WiFi探针。具体流程如下所示:

1. STA -------->  Probe Request  ----------> AP

2. STA

接下来是身份验证过程,可以使用诸如WEP、WEP2、WPA等加密方式应用到认证请求上:

3.STA -------->  Authentication Request  ----------> AP

认证请求中包含认证Auth类型,OpenSystem,sharedKey等信息,路由器返回认证结果:

4.STA

连接请求:

5.STA -------->AssociationRequest----------> AP

请求与AP建立关联,从而可以进行数据交互;

认证通过连接请求OK返回。

6.STA

所以说,不要轻易连接不明WiFi连接。

同时,学过网络的同学都知道,每台设备都会有个一个IP地址,用来在整个网络环境下的唯一标识。

而处于Station模式下的ESP8266,可以使用DHCP Client的方式,由上级路由分配的ip,或者设置成静态ip。

如果是采用DHCP分配的方式,获取的ip是动态的,在一些需要知道设备ip才能通信的场合下,就需要其他手段来获取ip;

如果是采用设置静态ip的方式,那么就有一个要求前提,要求连接AP设置的网段和静态的要一致,在不能固定AP网段的情况下,这种方式不可取。

Station模式下的WiFi模块,有几个特点,以便用来管理WiFi连接:

1.当最近使用的可接入点连接断开,但后面重新可用,那么ESP8266会自动去重新连接它;

2.第一点说到的情况,对于ESP8266模块重新启动也一样适用;

(名词解析,最近使用的可接入点,就是ESP8266 最后连接的WiFi热点)

这两点实现的原理就是:

ESP8266会把最近使用的可接入点的校验信息(ssid账号和psw密码)会存到flash 存储中。使用保存在flash中的校验信息,ESP8266就可以重新连接到最近使用的可接入点,尽管你再次改变代码烧写进去,只要你不改变WiFi原来的工作模式和校验信息。

三、详解ESP8266WiFiSTA库有了前面的理论基础,那么我们开始详解一下ESP8266 station模式的专用库——ESP8266WiFiSTA库,大家使用的时候不需要#include ,只需要引入 #include,至于原因,敬请回去看看我写的帖子博哥零基础教你玩转ESP8266(四) 认识一下ESP8266WiFi库。首先,对于STA类库的描述,可以拆分为四个部分:

1. 第一部分方法,和一个接入点(Access Point,wifi热点)建立连接;

2. 第二部分方法,管理第一部分方法建立的连接;

3. 第三部分方法,提供一些关于这个连接的信息,包括MAC地址、IP地址等;

4. 第四部分方法,提供一些备用方法去连接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig);

那么现在开始,先上一个楼主整理的百度脑图,让大家有个整体的认识:

ESP8266WiFiSTA库.png (157.55 KB, 下载次数: 59)

2018-9-1 10:05 上传

3.1. 第一部分方法,和一个接入点(Access Point,wifi热点)建立连接;

(1)建立连接,ESP8266模块切换工作模式为Station模式

)CS~C6P$ZO{6~V]{2QX~89E.png (25.67 KB, 下载次数: 55)

2018-9-1 21:53 上传

下面是函数详解:

[mw_shl_code=c,true]/**

* 切换工作模式到STA模式,并自动连接到最近接入的wifi热点

* @param void

* @return void

* @note 调用这个方法就会切换到STA模式,并且连接到最近使用的接入点(会从flash中读取之前存储的配置信息)

*       如果没有配置信息,那么这个方法基本上没有什么用。

*/

wl_status_t begin()

/**

* 切换工作模式到STA模式,并根据connect属性来判断是否连接wifi

* @param ssid       wifi热点名字

* @param password   wifi热点密码

* @param channel    wifi热点的通道号,用特定通信通信,可选参数

* @param bssid      wifi热点的mac地址,可选参数

* @param connect    boolean参数,默认等于true,当设置为false,不会去连接wifi热点,会建立module保存上面参数

* @return wl_status_t  wifi状态

* @note 调用这个方法就会切换到STA模式。

*       如果connect等于true,会连接到ssid的wifi热点。

*       如果connect等于false,不会连接到ssid的wifi热点,会建立module保存上面参数。

*/

wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true)[/mw_shl_code]

注意点:

------ 如果ESP8266模块之前处于AP模式,那么当你调用begin()有可能进入到STA+softAP模式;

------ 当你发现一些操作异常,那么你就检测一下当前处于什么模式(WiFi.mode());(2)配置IP地址                [mw_shl_code=c,true]/**

* 禁止DHCP client,设置station 模式下的IP配置

* @param  local_ip    station固定的ip地址

* @param  gateway     网关

* @param  subnet      子网掩码

* @param  dns1,dns2  可选参数定义域名服务器(dns)的ip地址,这些域名服务器

*                     维护一个域名目录(如www.google.co.uk),并将它们翻译成ip地址

* @return boolean值,如果配置成功,返回true;

*         如果配置没成功(模块没处于station或者station+soft AP模式),返回false;

* @note   有着固定IP配置地址的station,通常会更快连接上网络,原因是通过DHCP client获得IP配置这一步被跳过了。

*         如果你把三个参数(local_ip, gateway and subnet)设置为0.0.0.0,那么它会重新启动DHCP,这时你需要重新连接wifi以拿到最新的IP

*/

bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)[/mw_shl_code]3.2. 第二部分方法,管理第一部分方法建立的连接

(1)重新连接网络

[mw_shl_code=c,true]/**

* 断开连接并且重新连接station到同一个AP

* @param void

* @return false or true

*         返回false,意味着ESP8266不处于STA模式或者说Station在此之前没有连接到一个可接入点。

*         返回true,意味着已经成功重新启动连接,但是用户仍应该去检测网络连接状态指导WL_CONNECTED。

*/

bool reconnect()

/**

* 使用案例

*/

WiFi.reconnect();

while (WiFi.status() != WL_CONNECTED)

{

delay(500);

Serial.print(".");

}[/mw_shl_code]

(2)断开网络连接

[mw_shl_code=c,true]/**

* 断开wifi连接,设置当前配置SSID和pwd为null

* @param wifioff 可选参数,设置为true,那么就会关闭Station模式

* @return false or true 返回wl_status_t状态

*/

bool disconnect(bool wifioff = false);[/mw_shl_code]

(3)是否连接网络[mw_shl_code=c,true]/**

* 判断STA模式下是否连接上AP

* @return 如果STA连接上AP,那么就返回true

*/

bool isConnected();[/mw_shl_code]

(4)设置是否自动连接到最近接入点

[mw_shl_code=c,true]/**

* 当电源启动后,设置ESP8266在STA模式下是否自动连接flash中存储的AP

* @param autoConnect bool 默认是自动连接

* @return 返回保存状态 true or false

*/

bool setAutoConnect(bool autoConnect);[/mw_shl_code]

(5)判断是否设置了自动连接

[mw_shl_code=c,true]/**

* 检测ESP8266 station模式下是否启动自动连接

* @return 返回自动连接状态 true or false

*/

bool getAutoConnect();[/mw_shl_code]

(6)设置是否自动重新连接到最近接入点

[mw_shl_code=c,true]/**

* 设置当断开连接的时候是否自动重连

* @param autoConnect bool

* @return 返回保存状态 true or false

* @note 如果在网络已经断开了之后才去设置setAutoReconnect(true),这是无效的

*/

bool setAutoReconnect(bool autoReconnect);[/mw_shl_code]

(7)等待网络连接结果

[mw_shl_code=c,true]/**

* 等待直到ESP8266连接AP返回结果

* @return uint8_t 连接结果

*         1.WL_CONNECTED 成功连接

*         2.WL_NO_SSID_AVAIL  匹配SSID失败(账号错误)

*         3.WL_CONNECT_FAILED psw错误

*         4.WL_IDLE_STATUS 当wi-fi正在不同的状态中变化

*         5.WL_DISCONNECTED 这个模块没有配置STA模式

* @note 如果在网络已经断开了之后才去设置setAutoReconnect(true),这是无效的

*/

uint8_t waitForConnectResult();[/mw_shl_code]3.3. 第三部分方法,提供一些关于这个连接的信息,包括MAC地址、IP地址等;(1)获取mac地址

[mw_shl_code=c,true]/**

* 获取ESP station下的Mac地址

* @param mac   uint8_t数组的指针,数组长度为Mac地址的长度,这里为6

* @return      返回uint8_t数组的指针

*/

uint8_t * macAddress(uint8_t* mac);

//实例代码

if (WiFi.status() == WL_CONNECTED)

{

uint8_t macAddr[6];

WiFi.macAddress(macAddr);

Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);

//Connected, mac address: 5C:CF:7F:08:11:17

}

/**

* 获取ESP station下的Mac地址

* @return  返回String的Mac地址

*/

String macAddress();

//实例代码

if (WiFi.status() == WL_CONNECTED)

{

Serial.printf("Connected, mac address: %s\n", WiFi.macAddress().c_str());

Connected, mac address: 5C:CF:7F:08:11:17

}[/mw_shl_code]

(2)获取IP地址

[mw_shl_code=c,true]/**

* 返回ESP8266 STA模式下的IP地址

* @return IP地址

*/

IPAddress localIP();

//实例代码

if (WiFi.status() == WL_CONNECTED)

{

Serial.print("Connected, IP address: ");

Serial.println(WiFi.localIP());

//Connected, IP address: 192.168.1.10

}[/mw_shl_code]

(3)获取子网掩码

[mw_shl_code=c,true]/**

* 获取子网掩码的地址

* @return 返回子网掩码的IP地址

*/

IPAddress subnetMask();

//实例代码

Serial.print("Subnet mask: ");

Serial.println(WiFi.subnetMask());

//Subnet mask: 255.255.255.0[/mw_shl_code]

(4)获取网关地址

[mw_shl_code=c,true]/**

* 获取网关IP地址

* @return 返回网关IP地址

*/

IPAddress gatewayIP();

//实例代码

Serial.printf("Gataway IP: %s\n", WiFi.gatewayIP().toString().c_str());

//Gataway IP: 192.168.1.9[/mw_shl_code]

(5)获取dns地址

[mw_shl_code=c,true]/**

* 获取DNS ip地址

* @param dns_no dns序列号

* @return 返回DNS服务的IP地址

*/

IPAddress dnsIP(uint8_t dns_no = 0);

//实例代码

Serial.print("DNS #1, #2 IP: ");

WiFi.dnsIP().printTo(Serial);

Serial.print(", ");

WiFi.dnsIP(1).printTo(Serial);

Serial.println();

//DNS #1, #2 IP: 62.179.1.60, 62.179.1.61[/mw_shl_code]

(6)获取host名字

[mw_shl_code=c,true]/**

* 获取ESP8266 station DHCP的主机名

* @return 主机名

*/

String hostname();[/mw_shl_code]

(7)设置host名字

[mw_shl_code=c,true]/**

* 设置ESP8266 station DHCP的主机名

* @param aHostname 最大长度:32

* @return ok

*/

bool hostname(char* aHostname);

bool hostname(const char* aHostname);

bool hostname(String aHostname);

//实例代码

Serial.printf("Default hostname: %s\n", WiFi.hostname().c_str());

WiFi.hostname("Station_Tester_02");

Serial.printf("New hostname: %s\n", WiFi.hostname().c_str());

//Default hostname: ESP_081117

//New hostname: Station_Tester_02[/mw_shl_code]

(8)获取当前wifi连接状态

[mw_shl_code=c,true]/**

* 返回wifi的连接状态

* @return 返回wl_status_t中定义的其中一值,wl_status_t在 wl_definitions.h中定义

*/

wl_status_t status();[/mw_shl_code]

(9)获取wifi网络的名字

[mw_shl_code=c,true]/**

* 返回当前通信网络的SSID

* @return SSID

*/

String SSID() const;

//实例代码

Serial.printf("SSID: %s\n", WiFi.SSID().c_str());

//SSID: sensor-net[/mw_shl_code]

(10)获取wifi网络密码

[mw_shl_code=c,true]/**

* 返回当前通信网络的密码

* @return psk

*/

String psk() const;[/mw_shl_code]

(11)获取wifi网络macaddress

[mw_shl_code=c,true]/**

* 返回当前通信网络的mac地址

* @return bssid uint8_t *

*/

uint8_t * BSSID();

String BSSIDstr();

//实例代码

Serial.printf("BSSID: %s\n", WiFi.BSSIDstr().c_str());

//BSSID: 00:1A:70

E:C1:68

[/mw_shl_code]

(12)获取wifi网络的信号强度

[mw_shl_code=c,true]/**

* Return the current network RSSI.返回当前通信网络的信号强度,单位是dBm

* @return  RSSI value

*/

int32_t RSSI();

//实例代码

Serial.printf("RSSI: %d dBm\n", WiFi.RSSI());

//RSSI: -68 dBm[/mw_shl_code]

3.4. 第四部分方法,提供一些备用远程配置方法去连接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig);

[mw_shl_code=c,true]bool beginWPSConfig(void);

/**

* 启动 SmartConfig

*/

bool beginSmartConfig();

/**

* 停止 SmartConfig

*/

bool stopSmartConfig();

/**

* 查找SmartConfig状态来决定是否停止配置

* @return smartConfig Done

*/

bool smartConfigDone();[/mw_shl_code]

这部分不是本贴的重点,暂时忽略,后续章节会详细说道。

四、上手操作ESP8266WiFiSTA库

上面讲了一堆方法理论的东西,下面我们开始讲解操作实例,楼主尽量都在代码中注释,直接看代码就好。

(1)操作实例1:statin模式下,创建一个连接到可接入点(wifi热点),并且打印IP地址[mw_shl_code=c,true]/**

* Demo1:

*    statin模式下,创建一个连接到可接入点(wifi热点),并且打印IP地址

* @author 单片机菜鸟

* @date 2019/09/02

*/

#include

#define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字

#define AP_PSW  "6206908you11011010"//这里改成你的wifi密码

//以下三个定义为调试定义

#define DebugBegin(baud_rate)    Serial.begin(baud_rate)

#define DebugPrintln(message)    Serial.println(message)

#define DebugPrint(message)    Serial.print(message)

void setup(){

//设置串口波特率,以便打印信息

DebugBegin(115200);

//延时2s 为了演示效果

delay(2000);

DebugPrintln("Setup start");

//启动STA模式,并连接到wifi网络

WiFi.begin(AP_SSID, AP_PSW);

DebugPrint(String("Connecting to ")+AP_SSID);

//判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程

//笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现

while (WiFi.status() != WL_CONNECTED){

delay(500);

DebugPrint(".");

}

DebugPrintln("");

DebugPrint("Connected, IP address: ");

//输出station IP地址,这里的IP地址由DHCP分配

DebugPrintln(WiFi.localIP());

DebugPrintln("Setup End");

}

void loop() {

}[/mw_shl_code]

操作结果:

ESP8266WiFiSTABegin.png (24 KB, 下载次数: 42)

2018-9-2 11:35 上传

(2)操作实例2:statin模式下,配置IP地址,网关地址,子网掩码,并且打印IP地址

[mw_shl_code=c,true]/**

* Demo2:

*    statin模式下,配置IP地址,网关地址,子网掩码,并且打印IP地址

* @author 单片机菜鸟

* @date 2019/09/02

*/

#include

#define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字

#define AP_PSW  "6206908you11011010"//这里改成你的wifi密码

//以下三个定义为调试定义

#define DebugBegin(baud_rate)    Serial.begin(baud_rate)

#define DebugPrintln(message)    Serial.println(message)

#define DebugPrint(message)    Serial.print(message)

IPAddress staticIP(192,168,1,22);//固定IP地址

IPAddress gateway(192,168,1,9);//网关地址

IPAddress subnet(255,255,255,0);//子网掩码地址

void setup(){

//设置串口波特率,以便打印信息

DebugBegin(115200);

//延时2s 为了演示效果

delay(2000);

DebugPrintln("Setup start");

//启动STA模式,并连接到wifi网络

WiFi.begin(AP_SSID, AP_PSW);

DebugPrint(String("Connecting to ")+AP_SSID);

//配置网络

WiFi.config(staticIP,gateway,subnet);

//判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程

//笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现

while (WiFi.status() != WL_CONNECTED){

delay(500);

DebugPrint(".");

}

DebugPrintln("");

DebugPrint("Connected, IP address: ");

//输出station IP地址,这里的IP地址理论上就是上面配置的

DebugPrintln(WiFi.localIP());

DebugPrintln("Setup End");

}

void loop() {

}[/mw_shl_code]

操作结果:

ESP8266WiFiSTAConfigIP.png (24.03 KB, 下载次数: 42)

2018-9-2 11:35 上传

(3)操作实例3:statin模式下,创建一个连接到可接入点(wifi热点),并且打印station信息

[mw_shl_code=c,true]/**

* Demo3:

*    statin模式下,创建一个连接到可接入点(wifi热点),并且打印station信息

* @author 单片机菜鸟

* @date 2019/09/02

*/

#include

#define AP_SSID "TP-LINK_5344" //这里改成你的wifi名字

#define AP_PSW  "6206908you11011010" //这里改成你的wifi密码

//以下三个定义为调试定义

#define DebugBegin(baud_rate)    Serial.begin(baud_rate)

#define DebugPrintln(message)    Serial.println(message)

#define DebugPrint(message)    Serial.print(message)

void setup(){

//设置串口波特率,以便打印信息

DebugBegin(115200);

//延时2s 为了演示效果

delay(2000);

DebugPrintln("Setup start");

//启动STA模式,并连接到wifi网络

WiFi.begin(AP_SSID, AP_PSW);

//设置自动连接

WiFi.setAutoConnect(true);

//设置自动重连

WiFi.setAutoReconnect(true);

DebugPrint(String("Connecting to ")+AP_SSID);

//判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程

//笔者扩展:加入网络一直都连不上 是否可以做个判断,由你们自己实现

while (WiFi.status() != WL_CONNECTED){

delay(500);

DebugPrint(".");

}

DebugPrintln("");

DebugPrintln(&quot

rint Network Info:");

if (WiFi.status() == WL_CONNECTED){

//输出mac地址

DebugPrintln(String("Connected, mac address: ")+WiFi.macAddress().c_str());

//输出station IP地址,这里的IP地址由DHCP分配

DebugPrintln(String("Connected, IP address: ")+WiFi.localIP().toString());

//输出子网掩码地址

DebugPrintln(String("Subnet mask: ")+WiFi.subnetMask().toString());

//输出网关 IP地址

DebugPrintln(String("Gataway IP: ")+WiFi.gatewayIP().toString());

//输出hostname

DebugPrintln(String("Default hostname: ")+WiFi.hostname());

//设置新的hostname

WiFi.hostname("Station_host_博哥");

DebugPrintln(String("New hostname: ")+WiFi.hostname());

//输出SSID

DebugPrintln(String("SSID: ")+WiFi.SSID());

//输出psk

DebugPrintln(String("psk: ")+WiFi.psk());

//输出BSSID

DebugPrintln(String("BSSID: ")+WiFi.BSSIDstr());

//输出RSSI

DebugPrintln(String("RSSI: ") + WiFi.RSSI() + " dBm");

}

DebugPrintln("Setup End");

}

void loop() {

}[/mw_shl_code]

操作结果:

ESP8266WiFiSTAIpInfo.png (35.96 KB, 下载次数: 35)

2018-9-2 11:35 上传

注意点:方法里面都是使用WiFi.xxxx,那么这个WiFi是什么鬼呢?楼主翻阅了源码,给大家找到了它的定义地方:

ESP8266WiFi.cpp文件的最后一行。

[mw_shl_code=c,true]ESP8266WiFiClass WiFi;[/mw_shl_code]

可以看到,它就是集成了大部分功能的ESP8266WiFi。

五、总结

本节主要是基于ESP8266WiFiSTA库来讲解Station模式下的函数使用,并且给大家提供了三个实例,至于更多例子我就不继续举例,只能说引导大家入门使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值