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网络是否是隐藏网络
     
     
     
     
     
     
     
     
     
     
     
     
    天子骄龙
  • 相关阅读:
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 C: Coconut
    2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 A: Banana
    第2周项目1c++语言中函数参数传递的三种方式
    第2周项目2程序的多文件组织
    【BZOJ 3224】普通平衡树
    【POJ 1741】Tree
    浅谈树分治
    【luogu 2709 / BZOJ 3781】小B的询问
    【luogu 1972 / BZOJ 1878】HH的项链
    【BZOJ 3339 / BZOJ 3585 / luogu 4137】Rmq Problem / mex
  • 原文地址:https://www.cnblogs.com/liming19680104/p/11213796.html
Copyright © 2011-2022 走看看