ESP8266 WiFiScan库的使用 扫描你附近的WiFi

概述

现在通常,为了让手机连上一个WiFi热点,基本上都是打开手机设置里面的WiFi设置功能,然后会看到里面有个WiFi热点列表,然后选择你要的连接上。 基本上你只要打开手机连接WiFi功能,都会发现附近有超级多的各种来路不明的WiFi热点(连接有风险需谨慎),那么手机是怎么知道附近的WiFi的呢?

通常,无线网络提供的WiFi热点,大部分都开放了SSID广播(记得之前博主讲过WiFi热点也可以隐藏的),Scan WiFi的功能就是扫描出所有附近的WiFi热点的SSID信息,这样一来,客户端就可以根据需要选择不同的SSID连入对应的无线网络中。

Scan WiFi库提供了两种方式实现扫描过程:

1.同步扫描:通过单个函数在一次运行中完成,需要等待完成所有操作才能继续运行下面的操作。

2.异步扫描:把上面的过程分成几个步骤,每个步骤由一个单独函数完成,我们可以在扫描过程中执行其他任务。

ESP8266WiFiScan库

 ESP8266WiFiScan库,大家使用的时候只需要引入


							
				#include<ESP8266WiFi.h>				
								

扫描操作方法

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 = true, 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 —— 检测异步扫描的结果


							
	/**[/size][/font][/color][/align] * 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地址


									
		/**
		 * 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);
									
								

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);
												
											

动手操作

多说不宜,实验是检验真理的唯一标准,下面我们就来实际操作一下吧

(1)打开零知开源开发工具

(2)电脑连接ESP8266WiFi模块

输入以下代码,验证,上传


					

/**
* Demo:
*    STA模式下,演示同步扫描Scan wifi功能
* @author 云上上云
* @date 2019/06/01
*/
#include <ESP8266WiFi.h>
//以下三个定义为调试定义
void setup() {  //设置串口波特率,以便打印信息
	Serial.begin(115200);  //延时5s 为了演示效果
	delay(5000); 
	//我不想别人连接我,只想做个站点
	WiFi.mode(WIFI_STA);  
	//断开连接
	WiFi.disconnect();
	delay(100);
	Serial.println("Setup done");
}
void loop() {
	Serial.println("scan start");  // 同步扫描,等待返回结果
	int n = WiFi.scanNetworks();
	Serial.println("scan done");  if (n == 0){
		Serial.println("no networks found");
	}else{
		Serial.print(n);
		Serial.println(" networks found");    for (int i = 0; i < n; ++i){
			Serial.print(i + 1);
			Serial.print(": ");      //打印wifi账号
			Serial.print(WiFi.SSID(i));
			Serial.print(",");
			Serial.print(String("Ch:")+WiFi.channel(i));
			Serial.print(",");
			Serial.print(WiFi.isHidden(i)?"hide":"show");
			Serial.print(" (");      //打印wifi信号强度
			Serial.print(WiFi.RSSI(i));
			Serial.print("dBm");
			Serial.print(")");      //打印wifi加密方式
			Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?"open":"*");
			delay(10);
		}
	}
	Serial.println("");  // 延时5s之后再次扫描
	delay(5000);
}
						

测试结果(附近潜在的WiFi热点):(我就不一一展示了,它可以扫描完附件所有WiFi)