zoukankan      html  css  js  c++  java
  • ESP8266-Station模式--我想连上谁

     

    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 ", 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 ", 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 ", 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 ", WiFi.hostname().c_str());
    WiFi.hostname("Station_Tester_02");
    Serial.printf("New hostname: %s ", 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 ", WiFi.SSID().c_str()); 

     String psk()       获取wifi网络密码

    String BSSIDstr();     返回当前通信网络的mac地址--获取热点机子的mac地址
    实例:
    Serial.printf("BSSID: %s ", WiFi.BSSIDstr().c_str());
    //BSSID: 00:1A:70E:C1:68
    int32_t RSSI();       获取wifi网络的信号强度,单位是dBm
    实例:
    Serial.printf("RSSI: %d dBm ", 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(115200);
    WiFi.mode(WIFI_STA);     //设置模式为STA delay(
    2000); Serial.println("setu开始运行"); WiFi.begin(AP_SSID, AP_PSW); //启动STA模式,并连接wifi网络 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模式下,配置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() { 
    
     } 

    天子骄龙

  • 相关阅读:
    Mac上的USB存储设备使用痕迹在新版操作系统有所变化
    Beware of the encrypted VM
    A barrier for Mobile Forensics
    Second Space could let suspect play two different roles easily
    Take advantage of Checkra1n to Jailbreak iDevice for App analysis
    Find out "Who" and "Where"
    Where is the clone one and how to extract it?
    Downgrade extraction on phones running Android 7/8/9
    高版本安卓手机的取证未来
    How to extract WeChat chat messages from a smartphone running Android 7.x or above
  • 原文地址:https://www.cnblogs.com/liming19680104/p/11175473.html
Copyright © 2011-2022 走看看