现在,通常,为了让手机连上一个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();
delay();
WiFi.begin(AP_SSID, AP_PSW);
Serial.print(String("连接到:")+AP_SSID);
while (WiFi.status() != WL_CONNECTED){
delay();
Serial.print(".");
}
Serial.println("");
int n = WiFi.scanNetworks();//同步扫描,同步扫描,等待返回结果---不需要填任何参数
Serial.println("扫描完成");
if (n == ) {
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();
delay();
WiFi.begin(AP_SSID, AP_PSW);
Serial.print(String("连接到:")+AP_SSID);
while (WiFi.status() != WL_CONNECTED){
delay();
Serial.print(".");
}
Serial.println("");
Serial.println("连接成功");
WiFi.scanNetworks(true);//异步扫描
delay(3000);//扫描需要一段时间,所以等待一会儿
int n = WiFi.scanComplete(); //返回异步扫描找到的个数
if(n >= ){
Serial.printf("%d个网络找到\n", n);
for (int i = ; i < n; i++){
Serial.printf("%d: %s, Ch:%d (%ddBm) %s\n", i+, 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();
delay();
WiFi.begin(AP_SSID, AP_PSW);
Serial.print(String("连接到:")+AP_SSID);
while (WiFi.status() != WL_CONNECTED){
delay();
Serial.print(".");
}
Serial.println("");
Serial.println("连接成功");
WiFi.scanNetworksAsync(prinScanResult); //异步扫描周边wifi网络,并回调结果
//参数 回调函数
}
void loop() { } void prinScanResult(int networksFound){ //回调函数,参数找到网络的个数
Serial.printf("找到%d个网络\n", networksFound);
for (int i = ; i < networksFound; i++){
Serial.printf("%d: %s, Ch:%d (%ddBm) %s\n", i + , 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网络是否是隐藏网络
 
 
 
 
 
 
 
 
 
 
 
 
天子骄龙

ESP8266--WIFI热点扫描的更多相关文章

  1. DSAPI Wifi热点的扫描与连接

    使用DSAPI扫描和连接Wifi热点,支持连接隐藏的SSID. 效果演示: 代码如下: Private Wifi As New DSAPI.网络.Wifi Private Sub Button1_Cl ...

  2. Android开发之扫描附近wifi热点并列表显示

    近期项目中用到了wifi模块.今天做一个简单的总结. 參考:http://www.2cto.com/kf/201310/253617.html 1.如何获取wifi对象并进行操作 要操作WIFI设备, ...

  3. 49.Linux-wpa_cli使用之WIFI开启,扫描热点,连接热点,断开热点,WIFI关闭(49)

    本章学习内容: 1.WIFI如何开启 2.扫描热点 3.连接热点 4. 断开热点 5.关闭WIFI 本节使用的是wpa_supplicant工具,它主要包含wpa_supplicant(命令行模式)与 ...

  4. 【移动开发】WIFI热点通信(一)

    之前调查过Android中WIFI模块的使用,也写过两篇学习总结的文章(http://smallwoniu.blog.51cto.com/3911954/1334951),后来发现DEMO里面还是有许 ...

  5. Android 连接Wifi和创建Wifi热点 demo

    android的热点功能不可见,用了反射的技术搞定之外. Eclipse设置语言为utf-8才能查看中文注释 上代码: MainActivity.java package com.widget.hot ...

  6. Android 开发 创建WiFi、WiFi热点 ---开发集合

    WIFI 权限 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> < ...

  7. Win8共享wifi热点设置

    Win8共享wifi热点如何设置?大家都知道win7系统可以实现wifi热点共享,那么win8应该也能实现wifi热点共享,那么如何设置win8不需要任何软件只需要对电脑进行设置就可以共享无线上网. ...

  8. Android WiFi/WiFi热点开发总结

    首先看一下WiFi的自我介绍: Wi-Fi是一种允许电子设备连接到一个无线局域网(WLAN)的技术,通常使用2.4G UHF或5G SHF ISM 射频频段.连接到无线局域网通常是有密码保护的:但也可 ...

  9. wifi 热点配置最优信道

    wifi热点服务hostapd启动需要配置hostad.conf文件,其中有一个参数channel是用来配置信道的,信道的可选参数如下: # channel 1-14 is 2.4 GHz ; cha ...

随机推荐

  1. ios app真机测试到上架App Store详细教程-必看

    详细操作地址 http://www.applicationloader.net/blog/zh/88.html 苹果iOS APP真机调试测试和上架App Store视频教程 优酷 http://v. ...

  2. div 加滚动条 超过div宽度 自动换行 div居中

    一.div 中加滚动条 一. <div style=" overflow:scroll; width:400px; height:400px;”></div> 记住宽 ...

  3. LeetCode.925-长按的名字(Long Pressed Name)

    这是悦乐书的第355次更新,第380篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第217题(顺位题号是925).你的朋友正在键盘上输入他的名字. 有时,在键入字符c时, ...

  4. java锁机制的面试题

    java锁机制的面试题 1.ABA问题 2.CAS乐观锁 3.synchronize实现原理 4.synchronize与lock的区别 5.volatile实现原理 6.乐观锁的业务场景及实现方式 ...

  5. 几张图让你看懂WebAssembly

    几张图让你看懂WebAssembly:https://www.jianshu.com/p/bff8aa23fe4d

  6. Oracle数据库跟踪存储过程

    1.[右击]该存储过程 ——>勾选[添加调试信息]——>点击[测试]选项 2.输入对应参数,点击下图左上角红框按钮,开始跟踪,可逐语句逐过程跟踪

  7. springMVC原理简单介绍

    说明: 用户发送请求到DispatcherServlet,即前端控制器 DipatcherServlet调用处理器映射器HandlerMapping解析 处理器映射器HandlerMapping根据请 ...

  8. 为webService添加Interceptor(拦截器)

    今天写一个简单的拦截器,以webService接口为例: 背景:H5的一个项目,只要调用H5webService 接口下面的方法都会触发一个AuthorityInterceptor去验证是否调用类型是 ...

  9. 【校内test】桶哥的问题

    (以上题目出自_rqy两年前) #A:桶哥的问题——买桶[链接] [题目描述] 桶哥要买一些全家桶.他有a元钱,而每个桶要花b元钱.他能不能买到c个桶? [输入格式] 一行三个整数a, b, c [输 ...

  10. windows 通过cmd命令行管理防火墙

    (1)恢复初始防火墙设置 netsh advfirewall reset(2)关闭防火墙 netsh advfirewall set allprofiles state off(3)启用桌面防火墙 n ...