在前面的篇章中,博主给你们讲解了ESP8266的软硬件配置以及基本功能使用,目的就是想让你们有个初步认识。而且,博主一直重点强调 ESP8266 WiFi模块有三种工做模式:web
任何基于ESP8266的WiFi功能开发,都是基于上面其中一种工做模式来进行开发。因此,它们是咱们WiFi基础学习的重点。
本篇章将讲解Station模式。数组
Station模式又叫作站点工做模式,相似于无线终端,有图有真相:
Station模式又叫作站点工做模式,相似于无线终端,有图有真相:
处于Station模式下的ESP8266,能够链接到AP。经过Station(简称为“STA”)模式,ESP8266做为客户端链接到路由的wifi信号。 如下黑色字体内容摘录于博主自建qq群里面在arduino 联网.pdf文件,博主以为讲得挺生动,故分享给你们:服务器
经过这个链接过程分析,也证实了咱们常常听到的一句话,不要轻易链接不明WiFi热点,各类盗取信息层出不穷。
同时,学过网络的同窗都知道,每台设备都会有个一个IP地址,用来在整个网络环境下的惟一标识。
而处于Station模式下的ESP8266,可使用DHCP Client的方式,由上级路由分配的ip,或者设置成静态ip。
若是是采用DHCP分配的方式,获取的ip是动态的,在一些须要知道设备ip才能通讯的场合下,就须要经过其余手段来获取ip(一种思路是经过访问webserver去获取模块信息);
若是是采用设置静态ip的方式,那么就有一个要求前提,要求链接AP设置的网段和静态的要一致,在不能固定AP网段的状况下,这种方式不可取。
Station模式下的WiFi模块,有几个特色,以便用来管理WiFi链接:网络
有了前面的理论基础,那么咱们开始详解一下ESP8266 station模式的专用库——ESP8266WiFiSTA库,你们使用的时候不须要函数
#include <ESP8266WiFiSTA.h>
只须要引入oop
#include<ESP8266WiFi.h>
至于缘由,敬请回顾 ESP8266开发之旅 网络篇② ESP8266 工做模式与ESP8266WiFi库。
首先,对于STA类库的描述,能够拆分为四个部分:学习
讲解以前,先浏览一下博主整理的百度脑图,以便有个总体认识:
字体
创建链接,ESP8266模块切换工做模式为Station模式。
会用到如下方法:ui
class ESP8266WiFiSTAClass { // ---------------------------------------------------------------------------------------------- // ---------------------------------------- STA function ---------------------------------------- // ---------------------------------------------------------------------------------------------- ....... public: wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true); wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true); wl_status_t begin(); ....... };
下面是函数详解:google
/** * 切换工做模式到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
注意点:
/** * 禁止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; */ bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
注意点:
函数讲解:
/** * 断开链接而且从新链接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("."); }
函数讲解:
/** * 断开wifi链接,设置当前配置SSID和pwd为null * @param wifioff 可选参数,设置为true,那么就会关闭Station模式 * @return false or true 返回wl_status_t状态 */ bool disconnect(bool wifioff = false);
注意点:
/** * Disconnect from the network * @param wifioff * @return one value of wl_status_t enum */ bool ESP8266WiFiSTAClass::disconnect(bool wifioff) { bool ret; struct station_config conf; /**如下两步为清除最近链接点信息*/ *conf.ssid = 0; *conf.password = 0; ETS_UART_INTR_DISABLE(); if(WiFi._persistent) { wifi_station_set_config(&conf); } else { wifi_station_set_config_current(&conf); } ret = wifi_station_disconnect(); ETS_UART_INTR_ENABLE(); if(wifioff) { WiFi.enableSTA(false); } return ret; }
函数讲解:
/** * 判断STA模式下是否链接上AP * @return 若是STA链接上AP,那么就返回true */ bool isConnected();
函数讲解:
/** * 当电源启动后,设置ESP8266在STA模式下是否自动链接flash中存储的AP * @param autoConnect bool 默认是自动链接 * @return 返回保存状态 true or false */ bool setAutoConnect(bool autoConnect);
函数讲解:
/** * 检测ESP8266 station模式下是否启动自动链接 * @return 返回自动链接状态 true or false */ bool getAutoConnect();
函数讲解:
/** * 设置当断开链接的时候是否自动重连 * @param autoConnect bool * @return 返回保存状态 true or false */ bool setAutoReconnect(bool autoReconnect);
注意点:
函数讲解:
/** * 等待直到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模式 */ uint8_t waitForConnectResult();
提供一些关于这个链接的信息,包括MAC地址、IP地址等;
获取mac地址有2个函数,请看函数讲解:
/** * 获取ESP station下的Mac地址 * @param mac uint8_t数组的指针,数组长度为Mac地址的长度,这里为6 * @return 返回uint8_t数组的指针 */ uint8_t * macAddress(uint8_t* mac); /** * 获取ESP station下的Mac地址 * @return 返回String的Mac地址 */ String macAddress();
应用实例:
//实例代码1 这只是部分代码 不能直接使用 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 } //实例代码2 这只是部分代码 不能直接使用 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 }
函数讲解:
/** * 返回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 }
函数讲解:
/** * 获取子网掩码的地址 * @return 返回子网掩码的IP地址 */ IPAddress subnetMask();
应用实例:
//实例代码 这只是部分代码 不能直接使用 Serial.print("Subnet mask: "); Serial.println(WiFi.subnetMask()); //Subnet mask: 255.255.255.0
函数讲解:
/** * 获取网关IP地址 * @return 返回网关IP地址 */ IPAddress gatewayIP();
应用实例:
//实例代码 这只是部分代码 不能直接使用 Serial.printf("Gataway IP: %s\n", WiFi.gatewayIP().toString().c_str()); //Gataway IP: 192.168.1.9
函数讲解:
/** * 获取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
函数讲解:
/** * 获取ESP8266 station DHCP的主机名 * @return 主机名 */ String hostname();
设置host名字,有3个可用函数,请看函数讲解:
/** * 设置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
函数讲解:
/** * 返回wifi的链接状态 * @return 返回wl_status_t中定义的其中一值,wl_status_t在 wl_definitions.h中定义 */ wl_status_t status();
函数讲解:
/** * 返回当前通讯网络的SSID * @return SSID */ String SSID() const;
应用实例:
//实例代码 这只是部分代码 不能直接使用 Serial.printf("SSID: %s\n", WiFi.SSID().c_str()); //SSID: sensor-net
函数讲解:
/** * 返回当前通讯网络的密码 * @return psk */ String psk() const;
函数讲解:
/** * 返回当前通讯网络的mac地址 * @return bssid uint8_t * */ uint8_t * BSSID(); String BSSIDstr();
应用实例:
//实例代码 这只是部分代码 不能直接使用 Serial.printf("BSSID: %s\n", WiFi.BSSIDstr().c_str()); //BSSID: 00:1A:70E:C1:68
函数讲解:
/** * Return the current network RSSI.返回当前通讯网络的信号强度,单位是dBm * @return RSSI value */ int32_t RSSI();
应用实例:
//实例代码 这只是部分代码 不能直接使用 Serial.printf("RSSI: %d dBm\n", WiFi.RSSI()); //RSSI: -68 dBm
第四部分方法,提供一些备用远程配置方法去链接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig);
bool beginWPSConfig(void); /** * 启动 SmartConfig */ bool beginSmartConfig(); /** * 中止 SmartConfig */ bool stopSmartConfig(); /** * 查找SmartConfig状态来决定是否中止配置 * @return smartConfig Done */ bool smartConfigDone();
这部分不是本篇的重点,暂时忽略,后续章节会详细讲解。
上面博主讲了一堆方法理论的知识,下面咱们开始讲解操做实例,博主尽可能都在代码中注释,直接看代码就好。
statin模式下,建立一个链接到可接入点(wifi热点),而且打印IP地址。
源码:
/** * Demo1: * statin模式下,建立一个链接到可接入点(wifi热点),而且打印IP地址 * @author 单片机菜鸟 * @date 2019/09/02 */ #include <ESP8266WiFi.h> #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() { }
操做结果:
statin模式下,配置IP地址,网关地址,子网掩码,而且打印IP地址。
源码:
/** * Demo2: * statin模式下,配置IP地址,网关地址,子网掩码,而且打印IP地址 * @author 单片机菜鸟 * @date 2019/09/02 */ #include <ESP8266WiFi.h> #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() { }
操做结果:
statin模式下,建立一个链接到可接入点(wifi热点),而且打印station信息。
源码:
/** * Demo3: * statin模式下,建立一个链接到可接入点(wifi热点),而且打印station信息 * @author 单片机菜鸟 * @date 2019/09/02 */ #include <ESP8266WiFi.h> #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("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() { }
操做结果:
注意点:
ESP8266WiFiClass WiFi;
//举个例子 WiFi.SSID() 改为 WiFi.SSID().toString()
本节主要是基于ESP8266WiFiSTA库来说解Station模式下的函数使用,而且给你们提供了三个实例,至于更多例子我就不继续举例,只能说引导你们入门使用。