Station模式又叫做站点工作模式,类似于无线终端
处于Station模式下的ESP8266,可以连接到AP。通过Station(简称为“STA”)模式,ESP8266作为客户端连接到路由的wifi信号
 
1. 首先AP发出信标帧(beacon),意思就是我在这里,谁来泡我啊,移动工作站也会发出探(probe)帧,意思是有谁我可以泡啊,每隔一定时间发出一次。(后面会讲到Scan功能)。
2. 所以,根据这一点,可以产生很多有价值的应用。比如你的带WiFi功能的手机,即使在不连接wifi的情况下,只要打开WiFi功能,就可以被路由器截获这帧信息,路由器收集之后,你的信息就会被一个审计的东西发到服务器上,你手机号xxx上线时间xxx下线时间xxx都浏览了哪些网页,WiFi建立连接过程都一目了然,你的位置也全都暴露了,这就叫WiFi探针。具体流程如下所示:
STA --------> Probe Request ----------> AP
STA <-------- Probe Response <---------- AP,这个是由wifi返回的应答帧; 接下来是身份验证过程,可以使用诸如WEP、WEP2、WPA等加密方式应用到认证请求上
STA --------> Authentication Request ----------> AP 认证请求中包含认证Auth类型,OpenSystem,sharedKey等信息,路由器返回认证结果
STA <-------- Authentication Response <---------- AP 连接请求
STA --------> Association Request ----------> AP 请求与AP建立关联,从而可以进行数据交互; 认证通过连接请求OK返回
STA <-------- Association Response <---------- AP 
通过这个连接过程分析,也证明了我们经常听到的一句话,不要轻易连接不明WiFi热点,各种盗取信息层出不穷。
同时,学过网络的同学都知道,每台设备都会有个一个IP地址,用来在整个网络环境下的唯一标识。
而处于Station模式下的ESP8266,可以使用DHCP Client的方式,由上级路由分配的ip,或者设置成静态ip。
如果是采用DHCP分配的方式,获取的ip是动态的,在一些需要知道设备ip才能通信的场合下,就需要通过其他手段来获取ip(一种思路是通过访问webserver去获取模块信息);
如果是采用设置静态ip的方式,那么就有一个要求前提,要求连接AP设置的网段和静态的要一致,在不能固定AP网段的情况下,这种方式不可取。
Station模式下的WiFi模块,有几个特点,以便用来管理WiFi连接:
1. 当最近使用的可接入点连接断开,但后面重新可用,那么ESP8266会自动去重新连接它(名词解析,最近使用的可接入点,就是ESP8266 最后连接的WiFi热点);
2. 第一点说到的情况,对于ESP8266模块重新启动也一样适用;
3. 这两点实现的原理就是:ESP8266会把最近使用的可接入点的校验信息(ssid账号和psw密码)会存到flash 存储中。使用保存在flash中的校验信息,ESP8266就可以重新连接到最近使用的可接入点,尽管你再次改变代码烧写进去,只要你不改变WiFi原来的工作模式和校验信息(说简单点就是,如果你烧写代码不擦除所有flash空间并且设置了自动连接,那么在仍然是station模式下就会自动连接wifi热点,不过在这里,博主建议大家在begin之前先调用 WiFi.disconnect(),可以避免一些奇怪的连接问题)
ESP8266WiFiSTA库
有了前面的理论基础,那么我们开始详解一下ESP8266 station模式的专用库——ESP8266WiFiSTA库,大家使用的时候不需要 #include <ESP8266WiFiSTA.h>
只需要引入   #include<ESP8266WiFi.h> 
 
首先,对于STA类库的描述,可以拆分为四个部分:
1. 第一部分方法,和一个接入点(Access Point,wifi热点)建立连接;
2. 第二部分方法,管理第一部分方法建立的连接;
3. 第三部分方法,提供一些关于这个连接的信息,包括MAC地址、IP地址等;
4. 第四部分方法,提供一些备用方法去连接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig)
 

WiFi.mode(WIFI_STA);     //设置模式为STA

第一部分方法——建立连接
语法:

wl_status_t begin(char* ssid, char *password = NULL, int32_t channel = 0, const uint8_t* bssid = NULL,bool connect = true) 
//启动STA模式,并连接wifi网络
返回值:wl_status_t           wifi状态
ssid                                     wifi热点名字
password                           wifi热点密码
channel                              wifi热点的通道号,用特定通道通信,可选参数
bssid                                  wifi热点的mac地址,可选参数
connect                              bool参数,默认等于true,当设置为false,不会去连接wifi热点,会建立module保存上面参数 
注意点:如果ESP8266模块之前处于AP模式,那么当你调用begin()有可能进入到STA+softAP模式;当你发现一些操作异常,那么你就检测一下当前处于什么模式(WiFi.mode()); 
 
 
 

配置IP地址
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 =(uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
 local_ip      station固定的ip地址 
gateway     网关
subnet      子网掩码 
dns1,dns2      可选参数定义域名服务器(dns)的ip地址,这些域名服务器,维护一个域名目录(如www.google.co.uk),并将它们翻译成ip地址
返回值:  bool值,如果配置成功,返回true;
注意点:有着固定IP配置地址的station,通常会更快连接上网络,原因是通过DHCP client获得IP配置这一步被跳过了。如果你把三个参数(local_ip, gateway and subnet)设置为0.0.0.0,那么它会重新启动DHCP,这时你需要重新连接wifi以拿到最新的IP
 

第二部分方法——管理连接
 
bool WiFi.reconnect()     重新连接网络
返回值:

返回false,意味着ESP8266不处于STA模式或者说Station在此之前没有连接到一个可接入点
返回true,意味着已经成功重新启动连接,但是用户仍应该去检测网络连接状态指导WL_CONNECTED
案例:
WiFi.reconnect();
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
 
 
bool disconnect(bool wifioff = false);     断开网络连接,设置当前配置SSID和pwd为null
wifioff    可选参数,设置为true,那么就会关闭Station模式
返回值:false or true    返回wl_status_t状态
注意点:调用该函数将会清掉之前最近一个连接点信息(wifi热点信息)
对于STA模式下如果出现WiFi账号密码正确的前提下仍然连接不上WiFi热点,可以尝试在begin方法之前调用该方法。当然,博主建议在begin之前都尽量调用该方法
 
bool isConnected();         是否已经连接上网络
判断STA模式下是否连接上AP,如果STA连接上AP,那么就返回true
bool setAutoConnect(bool autoConnect);    设置是否自动连接到最近接入点
当电源启动后,设置ESP8266在STA模式下是否自动连接flash中存储的AP
autoConnect      bool 默认是自动连接
返回值:返回保存状态 true or false
bool getAutoConnect();     判断是否设置了自动连接
返回值:返回自动连接状态 true or false
 
bool setAutoReconnect(bool autoReconnect);      设置是否自动重新连接到最近接入点
设置当断开连接的时候是否自动重连
autoConnect bool

返回值:返回保存状态 true or false

注意点:如果在网络已经断开了之后才去设置setAutoReconnect(true),这是无效的
 
uint8_t waitForConnectResult();    等待网络连接结果
等待直到ESP8266连接AP返回结果
返回值:
1.WL_CONNECTED                     成功连接
2.WL_NO_SSID_AVAIL                匹配SSID失败(账号错误) 
3.WL_CONNECT_FAILED           psw密码错误
4.WL_IDLE_STATUS                   当wi-fi正在不同的状态中变化
5.WL_DISCONNECTED              这个模块没有配置STA模式
第三部分方法——连接信息
提供一些关于这个连接的信息,包括MAC地址、IP地址等;
String macAddress();            获取本机mac地址
 
实例:

if (WiFi.status() == WL_CONNECTED)
{
uint8_t macAddr[6];
WiFi.macAddress(macAddr);     获取本机mac地址
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());          //获取本机mac地址
//Connected, mac address: 5C:CF:7F:08:11:17
 
IPAddress localIP();        获取IP地址
返回ESP8266 STA模式下的IP地址
实例
if (WiFi.status() == WL_CONNECTED)
{
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
//Connected, IP address: 192.168.1.10
 
 
IPAddress subnetMask();     获取子网掩码的地址
实例
Serial.print("Subnet mask: ");
Serial.println(WiFi.subnetMask());
//Subnet mask: 255.255.255.0 
IPAddress gatewayIP();      获取网关地址

实例

Serial.printf("Gataway IP: %s\n", WiFi.gatewayIP().toString().c_str());
//Gataway IP: 192.168.1.9 
 
 
IPAddress dnsIP(uint8_t dns_no = 0);       获取dns地址
dns_no         dns序列号

实例

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
String hostname();      获取host名字
获取ESP8266 station DHCP的主机名
设置host名字:
bool hostname(char* aHostname);
bool hostname(const char* aHostname); 
bool hostname(String aHostname);
aHostname 最大长度:32

实例

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 
wl_status_t status();       获取当前wifi连接状态
返回wl_status_t中定义的其中一值,wl_status_t在 wl_definitions.h中定义
String SSID() const;      获取wifi网络的名字
例子:Serial.printf("SSID: %s\n", WiFi.SSID().c_str()); 

String psk()       获取wifi网络密码

String BSSIDstr();     返回当前通信网络的mac地址--获取热点机子的mac地址
实例:
Serial.printf("BSSID: %s\n", WiFi.BSSIDstr().c_str());
//BSSID: 00:1A:70E:C1:68
int32_t RSSI();       获取wifi网络的信号强度,单位是dBm
实例:

Serial.printf("RSSI: %d dBm\n", WiFi.RSSI());
//RSSI: -68 dBm 
信号强度说明:
信号强度的值是越大越好,这里说的越大符合数学的逻辑,也就是在负数的情况下,这个数字越小,那么这个值就越大,信号也就越好
dbm含义:dbm是一个纯粹的比值,只表示两个量的相对大小关系。因为Wi-Fi信号的能量通常为mw级,因此业界将Wi-Fi信号大小表示为与1mw的强度比,用dbm来表示
随着信号的传播,受到障碍物和距离的影响,能量会逐渐衰弱,因此我们在接收端通常看见的是强度为负的数值,它代表比1mw还弱的能量
#include <ESP8266WiFi.h>  //导入库
#define AP_SSID "jia" //这里改成你的wifi名字
#define AP_PSW "lm654321"//这里改成你的wifi密码
void setup() {
Serial.begin();
WiFi.mode(WIFI_STA);     //设置模式为STA
delay();
Serial.println("setu开始运行");
WiFi.begin(AP_SSID, AP_PSW); //启动STA模式,并连接wifi网络
Serial.print(String("连接到:")+AP_SSID); ////判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
while (WiFi.status() != WL_CONNECTED){ //判断wifi是否连接成功
delay();
Serial.print(".");
}
Serial.println(""); //连接成功后换行
Serial.println("连接的IP地址是:");
Serial.println(WiFi.localIP());//WiFi.localIP() 返回本地的IP地址
Serial.println("setup结束"); }
void loop() { }
//statin模式下,配置IP地址,网关地址,子网掩码,并且打印IP地址
#include <ESP8266WiFi.h> //导入库
#define AP_SSID "jia" //这里改成你的wifi名字
#define AP_PSW "lm654321"//这里改成你的wifi密码
IPAddress staticIP(192,168,1,22);//固定IP地址
IPAddress gateway(192,168,1,9);//网关地址
IPAddress subnet(255,255,255,0);//子网掩码地址 void setup() {
Serial.begin(115200);
delay(2000);
Serial.println("setu开始运行");
WiFi.begin(AP_SSID, AP_PSW); //启动STA模式,并连接wifi网络
WiFi.config(staticIP,gateway,subnet);//配置网络
Serial.print(String("连接到:")+AP_SSID); ////判断网络状态是否连接上,没连接上就延时500ms,并且打出一个点,模拟连接过程
while (WiFi.status() != WL_CONNECTED){ //判断wifi是否连接成功
delay(500);
Serial.print(".");
}
Serial.println(""); //连接成功后换行
Serial.println("连接的IP地址是:");
Serial.println(WiFi.localIP());//WiFi.localIP() 返回本地的IP地址
Serial.println("setup结束"); }
void loop() { }
//statin模式下,创建一个连接到可接入点(wifi热点),并且打印station信息
#include <ESP8266WiFi.h>
#define AP_SSID "jia"
#define AP_PSW "lm654321" void setup() {
Serial.begin(115200);
delay(2000);
Serial.println("setu开始运行");
WiFi.begin(AP_SSID, AP_PSW);
WiFi.setAutoConnect(true); //设置是否自动连接到最近接入点
WiFi.setAutoReconnect(true); //设置是否自动重新连接到最近接入点 Serial.print(String("连接到:")+AP_SSID); while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println(""); Serial.println("网络信息: ");
Serial.println("连接的IP地址是:"); Serial.println(WiFi.localIP()); //获取本机IP地址 Serial.println(String("mac地址是: ")+WiFi.macAddress().c_str()); // 获取本机mac地址
//mac地址是: CC:50:E3:60:E3:41 Serial.println(String("子网掩码地址: ")+WiFi.subnetMask().toString());
//子网掩码地址: 255.255.255.0 Serial.println(String("网关IP: ")+WiFi.gatewayIP().toString());
//网关IP: 192.168.188.253 Serial.println(String("默认hostname: ")+WiFi.hostname()); WiFi.hostname("host_明哥"); //设置新的hostname Serial.println(String("新的hostname: ")+WiFi.hostname());
//新的hostname: host_明哥 Serial.println(String("WIFI账号: ")+WiFi.SSID());
//WIFI账号: jia Serial.println(String("WIFI密码psk: ")+WiFi.psk());
//WIFI密码psk: lm654321 Serial.println(String("当前通信网络的mac地址: ")+WiFi.BSSIDstr());//返回当前通信网络的mac地址---获取热点机子的mac地址
//当前通信网络的mac地址: 78:D3:8D:CA:6E:28 Serial.println(String("网络的信号强度: ") + WiFi.RSSI() + " dBm"); //获取wifi网络的信号强度,单位是dBm Serial.println("setup结束"); }
void loop() { }

天子骄龙

ESP8266-Station模式--我想连上谁的更多相关文章

  1. ESP8266 station模式下建立client、server TCP连接

    程序实现内容: 1.在station模式下,ESP8266作为client.server进行TCP连接2.实现数据的发送.接收(同时回传)实现思路:TCP网络通信分层为:应用层.网络层.数据链路层.物 ...

  2. ESP8266-Soft AP模式 —— 谁想连上我

    AP是Access Point简称,也就是访问接入点,是网络的中心节点.一般家庭的无线路由器就是一个AP,众多站点(STA)加入到它所组成的无线网络,网络中的所有的通信都通过AP来转发完成. 软AP也 ...

  3. ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库

        在网络篇①中,博主主要讲解了Arduino上开发ESP8266的插件库 Arduino Core For ESP8266.但是,并没有讲到关于这个模块的工作模式,所以本篇讲着重讲解ESP826 ...

  4. FL2440 rt3070模块station模式移植

    ---------------------------------------------------------------------------------------------------- ...

  5. CentOS下VMware用桥接模式,静态ip上外网

    15年的时候,写过一篇博客:VMware中网络设置之Bridged  也是关于linux下vmware桥接模式.静态ip上外网的配置,不过当时更多的是用图形界面来实现的,通用性不强.生产环境,极少有l ...

  6. mysql主从模式下在主库上的某些操作不记录日志的方法

    mysql主从模式下在主库上的某些操作不记录日志的方法 需求场景: 在主库上的需要删除某个用户,而这个用户在从库上不存在(我在接手一个业务的时候,就遇到主从架构用户授权不一致的情况,主库比较全,而从库 ...

  7. 假如 Redis Cluster 模式用在 T-io 上

    前言   前几天在学习Redis Cluster 模式的时候,突然想到如果把它的集群模式应用在T-io上也是挺有意思的一件事情. Redis 集群简介    Redis Cluster 中有 N 台实 ...

  8. 从Windows想Linux上传文件 Linux(CentOS) 上安装vsftpd

    今天想在Linux上搭建个LAMP环境,以前用的Linux都安装了图形界面,但是这次用的阿里云服务器是纯命令模式,用起来有点不大适应. 最大的不适应就是获取apache等软件了,以前直接登录相应网站, ...

  9. vmware centos nat模式下连不上网络解决办法

    简单来讲,当你创建一台虚拟机时,VMware为你虚拟了三种接入网络的方式:桥连接,NAT,使用主机网络,Vmware 10中默认对应 VMnet0,VMnet1,VMnet8 .    当选择桥连接方 ...

随机推荐

  1. Oracle 安装 RAC 11.2.0.4 centos7.4 -udev磁盘绑定/执行root脚本报错

    在centos 7.4上安装oracle rac 11.2.0.4 报错及相关解决 $ cat /etc/redhat-release CentOS Linux release 7.4.1708 (C ...

  2. Nginx日志监控工具

    ngxtop是一个基于python的程序,可以在Python上安装.ngxtop通过实时解析nginx访问日志, 并将结果(nginx服务器的有用指标)输出到终端. 主要的功能 当前有效请求 总请求计 ...

  3. 【数字图像处理】Bilateral Filters

    [数字图像处理]Bilateral Filters https://www.yuque.com/lart/idh721/bf 简单介绍 双边滤波是一种非线性的可以模糊图像并且能保留一定的边缘信息的技术 ...

  4. noi.ac-CSP模拟Day5T2 灯

    算是一道思维题吧,没有什么算法在里面. 之前想的是,能走的话就尽量走远,走过去开灯然后再回去关灯,然后再走,每一段路要走3次. 然而,“能走的话就尽量走远”只是yy的一个贪心,没有任何依据.假设在中间 ...

  5. 【miscellaneous】监狱安防系统智能视频监控系统设计方案

    1监狱安防新需求 随着司法监狱管理系统内视频监控系统的日益发展,现有的被动式人工监控这一传统模式已无法满足新形势下的监管工作需求,尤其是现在靠轮询的视频监控方式,无法对突发恶性事件做到第一时间的防御和 ...

  6. ucloud启用redis

    可以设置密码

  7. tableau desktop

    参考: 入门指南: https://help.tableau.com/current/guides/get-started-tutorial/zh-cn/get-started-tutorial-co ...

  8. jquery validate 自定义校验方法

    1.引入JS jquery.min.js jquery.validate.min.js messages_zh.min.js 2.添加验证方法,第一个参数为验证方法的名称,第二个参数为验证方法. $. ...

  9. java对象 Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念

    PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...

  10. noip2018day1-赛道修建

    题目描述 \(C\) 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 $m $条赛道. \(C\) 城一共有 \(n\) 个路口,这些路口编号为 \(1,2,-,n\)有 $n-1 $条适合于修 ...