本帖最后由 roc2 于 2019-6-19 10:55 编辑
概述: 无线网络提供的WiFi热点,大部分都开放了SSID广播(记得之前博主讲过WiFi热点也可以隐藏的),Scan WiFi的功能就是扫描出所有附近的WiFi热点的SSID信息,这样一来,客户端就可以根据需要选择不同的SSID连入对应的无线网络中。 Scan WiFi库提供了两种方式实现扫描过程: 同步扫描:通过单个函数在一次运行中完成,需要等待完成所有操作才能继续运行下面的操作。 异步扫描:把上面的过程分成几个步骤,每个步骤由一个单独函数完成,我们可以在扫描过程中执行其他任务。 ESP8266WiFiScan库ESP8266WiFiScan库,大家使用的时候只需要引入 扫描操作方法1.scanNetworks —— 同步扫描周边有效wifi网络函数说明:- /**
- * Start scan WiFi networks available
- * @param async run in async mode(是否启动异步扫描)
- * @param show_hidden show hidden networks(是否扫描隐藏网络)
- * @param channel scan only this channel (0 for all channels)(是否扫描特定通道)
- * @param ssid* scan for only this ssid (NULL for all ssid's)(是否扫描特定的SSID)
- * @return Number of discovered networks
- */int8_t scanNetworks(bool async = false, bool show_hidden = false, uint8 channel = 0, uint8* ssid = NULL);
复制代码 2.scanNetworks(async ) —— 异步扫描周边有效wifi网络函数说明: - /**
- * Start scan WiFi networks available
- * @param async run in async mode(是否启动异步扫描)
- * @param show_hidden show hidden networks(是否扫描隐藏网络)
- * @param channel scan only this channel (0 for all channels)(是否扫描特定通道)
- * @param ssid* scan for only this ssid (NULL for all ssid's)(是否扫描特定的SSID)
- * @return Number of discovered networks
- */int8_t scanNetworks(bool async = false, bool show_hidden = false, uint8 channel = 0, uint8* ssid = NULL);
复制代码3.scanNetworksAsync —— 异步扫描周边wifi网络,并回调结果
函数说明: - /**
- * Starts scanning WiFi networks available in async mode
- * @param onComplete the event handler executed when the scan is done
- * @param show_hidden show hidden networks
- */void scanNetworksAsync(std::function<void(int)> onComplete, bool show_hidden = false);
复制代码 4. scanComplete —— 检测异步扫描的结果函数说明: - /**
- * called to get the scan state in Async mode(异步扫描的结果函数)
- * @return scan result or status
- * -1 if scan not find
- * -2 if scan not triggered
- */
- int8_t scanComplete();
复制代码 5.scanDelete —— 从内存中删掉最近扫描结果函数说明: - /**
- * delete last scan result from RAM(从内存中删除最近的扫描结果)
- */void scanDelete();
复制代码 扫描结果方法1. SSID —— 获取wifi网络名字函数说明: - /**
- * Return the SSID discovered during the network scan.
- * @param i specify from which network item want to get the information
- * @return ssid string of the specified item on the networks scanned list
- */String SSID(uint8_t networkItem);
复制代码 2.RSSI —— 获取wifi网络信号强度函数说明: - /**
- * Return the RSSI of the networks discovered during the scanNetworks(信号强度)
- * @param i specify from which network item want to get the information
- * @return signed value of RSSI of the specified item on the networks scanned list
- */int32_t RSSI(uint8_t networkItem);
复制代码 3. encryptionType —— 获取wifi网络加密方式函数说明: - /**
- * Return the encryption type of the networks discovered during the scanNetworks(加密方式)
- * @param i specify from which network item want to get the information
- * @return encryption type (enum wl_enc_type) of the specified item on the networks scanned list
- * ............ Values map to 802.11 encryption suites.....................
- * AUTH_OPEN ----> ENC_TYPE_WEP = 5,
- * AUTH_WEP ----> ENC_TYPE_TKIP = 2,
- * AUTH_WPA_PSK ----> ENC_TYPE_CCMP = 4,
- * ........... except these two, 7 and 8 are reserved in 802.11-2007.......
- * AUTH_WPA2_PSK ----> ENC_TYPE_NONE = 7,
- * AUTH_WPA_WPA2_PSK ----> ENC_TYPE_AUTO = 8
- */uint8_t encryptionType(uint8_t networkItem);
复制代码 4. BSSID —— 获取wifi网络mac地址函数说明: - /**
- * return MAC / BSSID of scanned wifi (物理地址)
- * @param i specify from which network item want to get the information
- * @return uint8_t * MAC / BSSID of scanned wifi
- */uint8_t * BSSID(uint8_t networkItem);
- /**
- * return MAC / BSSID of scanned wifi (物理地址)
- * @param i specify from which network item want to get the information
- * @return uint8_t * MAC / BSSID of scanned wifi
- */String BSSIDstr(uint8_t networkItem);
复制代码 5.getNetworkInfo —— 获取整体网络信息,名字,信号强度等函数说明: - /**
- * loads all infos from a scanned wifi in to the ptr parameters
- * @param networkItem uint8_t
- * @param ssid const char**
- * @param encryptionType uint8_t *
- * @param RSSI int32_t *
- * @param BSSID uint8_t **
- * @param channel int32_t *
- * @param isHidden bool *
- * @return (true if ok)
- */ bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel, bool &isHidden);
复制代码 6. channel —— 获取wifi网络通道号函数说明: - /**
- * return channel of scanned wifi(通道号)
- */int32_t channel(uint8_t networkItem);
复制代码 7. isHidden —— 判断wifi网络是否是隐藏网络函数说明: - /**
- * return if the scanned wifi is Hidden (no SSID)(判断扫描到的wifi是否是隐藏wifi)
- * @param networkItem specify from which network item want to get the information
- * @return bool (true == hidden)
- */bool isHidden(uint8_t networkItem);
复制代码动手操作 多说不宜,实验是检验真理的唯一标准,下面我们就来实际操作一下吧。 打开零知开源开发工具,新建一个项目,输入以下代码,验证,上传。 测试demo: - /**
- * Demo:
- * STA模式下,演示同步扫描Scan wifi功能
- * @author 云上上云
- * @date 2019/06/01
- */#include <ESP8266WiFi.h>
- //以下三个定义为调试定义#define DebugBegin(baud_rate) Serial.begin(baud_rate)#define DebugPrintln(message) Serial.println(message)#define DebugPrint(message) Serial.print(message)
- void setup() { //设置串口波特率,以便打印信息
- DebugBegin(115200); //延时5s 为了演示效果
- delay(5000); // 我不想别人连接我,只想做个站点
- WiFi.mode(WIFI_STA); //断开连接
- WiFi.disconnect();
- delay(100);
- DebugPrintln("Setup done");
- }
- void loop() {
- DebugPrintln("scan start"); // 同步扫描,等待返回结果
- int n = WiFi.scanNetworks();
- DebugPrintln("scan done"); if (n == 0){
- DebugPrintln("no networks found");
- }else{
- DebugPrint(n);
- DebugPrintln(" networks found"); for (int i = 0; i < n; ++i){
- DebugPrint(i + 1);
- DebugPrint(": "); //打印wifi账号
- DebugPrint(WiFi.SSID(i));
- DebugPrint(",");
- DebugPrint(String("Ch:")+WiFi.channel(i));
- DebugPrint(",");
- DebugPrint(WiFi.isHidden(i)?"hide":"show");
- DebugPrint(" ("); //打印wifi信号强度
- DebugPrint(WiFi.RSSI(i));
- DebugPrint("dBm");
- DebugPrint(")"); //打印wifi加密方式
- DebugPrintln((WiFi.encryptionType(i) == ENC_TYPE_NONE)?"open":"*");
- delay(10);
- }
- }
- DebugPrintln(""); // 延时5s之后再次扫描
- delay(5000);
- }
复制代码 测试结果(附近潜在的WiFi热点):它可以扫描完附件所有WiFi。
更多详细资料可到零知实验室官网免费获取。
|