zoukankan      html  css  js  c++  java
  • ESP8266--WIFI热点扫描

    现在,通常,为了让手机连上一个WiFi热点,基本上都是打开手机设置里面的WiFi设置功能,然后会看到里面有个WiFi热点列表,然后选择你要的连接上。 基本上你只要打开手机连接WiFi功能,都会发现附近有超级多的各种来路不明的WiFi热点(连接有风险需谨慎),那么手机是怎么知道附近的WiFi的呢?通常,无线网络提供的WiFi热点,大部分都开放了SSID广播(WiFi热点也可以隐藏的),Scan WiFi的功能就是扫描出所有附近的WiFi热点的SSID信息,这样一来,客户端就可以根据需要选择不同的SSID连入对应的无线网络中
     
    scan WiFi功能
    一般扫描网络需要几百毫秒才能完成。
    而扫描WiFi过程包括:
    触发扫描过程
    等待完成
    提供结果
    那么Scan WiFi库提供了两种方式实现上面的扫描过程:
    1. 同步扫描:通过单个函数在一次运行中完成,需要等待完成所有操作才能继续运行下面的操作
    2. 异步扫描:把上面的过程分成几个步骤,每个步骤由一个单独函数完成,我们可以在扫描过程中执行其他任务
     
    ESP8266WiFiScan库
    ESP8266WiFiScan库,大家使用的时候不需要  #include <ESP8266WiFiSTA.h> 
    只需要引入     #include<ESP8266WiFi.h>
    对于Scan类库的描述,可以拆分为两个部分:
    1. 第一部分方法,扫描操作;
    2. 第二部分方法,获取扫描结果;
    扫描操作方法
    语法:
    int scanNetworks(bool async = false, bool show_hidden = false, uint8 channel = 0, uint8* ssid = NULL);   //扫描周边有效wifi网络
    async                     是否启动异步扫描
    true    异步扫描
    false    同步扫描---默认
    show_hidden        是否扫描隐藏网络
    channel                是否扫描特定通道
    ssid                     是否扫描特定的SSID
    返回值:找到的个数
     
     
     
    实例--同步扫描
    //同步扫描
    #include <ESP8266WiFi.h>  
    #define AP_SSID "jia" 
    #define AP_PSW "lm654321"
    
    void setup() { 
    Serial.begin(115200);
    delay(2000);
    WiFi.begin(AP_SSID, AP_PSW);  
    Serial.print(String("连接到:")+AP_SSID);
    while (WiFi.status() != WL_CONNECTED){   
    delay(500);
    Serial.print(".");
    }
    Serial.println("");  
    int n = WiFi.scanNetworks();//同步扫描,同步扫描,等待返回结果---不需要填任何参数
    Serial.println("扫描完成");
    if (n == 0) {
    Serial.println("没有找到热点网络");
     }else {
      Serial.printf("找到了%d个网络",n);
     }
    }
    void loop() { 
    
     } 
     
     
    实例---异步扫描
    //异步扫描
    #include <ESP8266WiFi.h>  
    #define AP_SSID "jia" 
    #define AP_PSW "lm654321"
    
    void setup() { 
     WiFi.mode(WIFI_STA); 
     WiFi.disconnect();//断开网络
    Serial.begin(115200);
    delay(2000);
    WiFi.begin(AP_SSID, AP_PSW);  
    Serial.print(String("连接到:")+AP_SSID);
    while (WiFi.status() != WL_CONNECTED){   
    delay(500);
    Serial.print(".");
    }
    Serial.println("");  
    Serial.println("连接成功");
    WiFi.scanNetworks(true);//异步扫描
    delay(3000);//扫描需要一段时间,所以等待一会儿
    int n = WiFi.scanComplete();  //返回异步扫描找到的个数
    if(n >= 0){
      Serial.printf("%d个网络找到
    ", n);
      for (int i = 0; i < n; i++){
        Serial.printf("%d: %s, Ch:%d (%ddBm) %s
    ", i+1, WiFi.SSID(i).c_str(), WiFi.channel(i), WiFi.RSSI(i), WiFi.encryptionType(i) == ENC_TYPE_NONE ? "open" : "");
      //WiFi.SSID(i)   返回账号          WiFi.channel(i)   返回通道
      //WiFi.RSSI(i)   返回信号强度       WiFi.encryptionType(i)   返回加密类型
      
      }
      WiFi.scanDelete();  //从内存中删掉最近扫描结果
    //注意点:如果不删除,将会叠加上次扫描的结果;
    }else{ Serial.println("没有找到网络"); } } void loop() { }
    uint8_t encryptionType(uint8_t networkItem);    获取wifi网络加密方式

    AUTH_OPEN ----> ENC_TYPE_WEP = 5
    AUTH_WEP ----> ENC_TYPE_TKIP = 2
    AUTH_WPA_PSK ----> ENC_TYPE_CCMP = 4
    AUTH_WPA2_PSK ----> ENC_TYPE_NONE = 7
    AUTH_WPA_WPA2_PSK ----> ENC_TYPE_AUTO = 8

    void scanNetworksAsync(回调函数名, bool show_hidden = false);        //异步扫描周边wifi网络,并回调结果 ---个人推进
    //异步扫描
    #include <ESP8266WiFi.h>  
    #define AP_SSID "jia" 
    #define AP_PSW "lm654321"
    
    void setup() { 
     WiFi.mode(WIFI_STA); 
     WiFi.disconnect();//断开网络
    Serial.begin(115200);
    delay(2000);
    WiFi.begin(AP_SSID, AP_PSW);  
    Serial.print(String("连接到:")+AP_SSID);
    while (WiFi.status() != WL_CONNECTED){   
    delay(500);
    Serial.print(".");
    }
    Serial.println("");  
    Serial.println("连接成功");
    WiFi.scanNetworksAsync(prinScanResult);  //异步扫描周边wifi网络,并回调结果
    //参数  回调函数
    }
    void loop() { 
    
     } 
    
    
    void prinScanResult(int networksFound){  //回调函数,参数找到网络的个数
    Serial.printf("找到%d个网络
    ", networksFound);
    for (int i = 0; i < networksFound; i++){
      Serial.printf("%d: %s, Ch:%d (%ddBm) %s
    ", i + 1, WiFi.SSID(i).c_str(), WiFi.channel(i), WiFi.RSSI(i), WiFi.encryptionType(i) == ENC_TYPE_NONE ? "open" : "");
    } 
    }
     
    String BSSIDstr(uint8_t networkItem);      获取wifi网络mac地址
     
    bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t*&BSSID, int32_t &channel, bool &isHidden);
    //获取整体网络信息,名字,信号强度等
    注意点:入参前面多数加了&,意味着调完函数后外面获取到详细信息;
     
    bool isHidden(uint8_t networkItem);      判断wifi网络是否是隐藏网络
     
     
     
     
     
     
     
     
     
     
     
     
    天子骄龙
  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/liming19680104/p/11213796.html
Copyright © 2011-2022 走看看