数码之家

 找回密码
 立即注册
搜索
查看: 2880|回复: 1

[STM] 【零知ESP8266教程】快速入门16 WiFiScan库的使用 扫描你附近的WiFi

[复制链接]
发表于 2019-10-29 17:53:34 | 显示全部楼层 |阅读模式
本帖最后由 roc2 于 2019-10-29 17:56 编辑

上次我们已经学习并分享了零知识ESP8266一键配网的操作流程,接下来,我们需要了解ESP8266是怎样找到这些WiFi
景点的。

引述:
 为了让手机连上一个WiFi景点,基本上都是打开基本上你只要打开手机的WiFi功能,就会发现附近有超级多的各种来路不明的WiFi热点(无线网络有风险,连接需谨慎),那么手机是怎么找得到附近的无线网络的呢?

    通常,无线网络提供的无线网络热点,大部分都开放了SSID广播(记得之前博主讲过的WiFi热点也可以隐藏的) ,扫描无线网络的功能就是扫描出所有附近的无线热点的SSID信息,这样一来,客户端就可以根据需要选择不同的SSID连入对应的无线网络中。
 扫描无线网络连接库提供了两种方式实现扫描过程:
①同步扫描:通过单个函数在一次运行中完成,需要等待完成所有操作才能继续 。下面运行的操作
②异步扫描:把上面的过程分成几个步骤,每个步骤由一个单独函数完成,我们可以在扫描过程中执行其他任务。

我们的零知ESP8266本身就是WiFi模块,当然也可以扫描到WiFi的热点,接下来,我们一起学习并且找到附近所有的WiFi热点吧。

一,硬件
电脑,windows系统
零知ES8266开发板
micro-usb线

二,软件库
带有ESP8266WiFiScan库。

ESP8266WiFiScan库,大家使用的时候只需要约会,所以要在IDE中安装相应的数据支持库,当然也可以留言,我免费私给你链接!

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">#include <ESP8266WiFi.h></font></font>
复制代码

(1)扫描操作方法
①scanNetworks-同步扫描周边有效wifi网络
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*开始扫描可用的WiFi网络</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param异步以异步模式运行(是否启动初始化扫描)</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param </font><font style="vertical-align: inherit;">show_hidden </font><font style="vertical-align: inherit;">显示隐藏的网络(是否扫描隐藏网络)</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param通道仅扫描该通道(所有通道为0) (是否扫描特定通道)</font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param ssid *仅扫描此ssid(所有ssid均为NULL)(是否扫描特定的SSID)</font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* [url = home.php?mod = space&uid = 913182] @return [/ url]数发现的网络数量</font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / int8_t scanNetworks(bool async = false,bool show_hidden = false,uint8 channel = 0,uint8 * ssid = NULL);</font></font>
复制代码

②scanNetworks(async)-初步扫描周边有效wifi网络
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*有可用的开始扫描WiFi网络</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param异步以异步模式运行(是否启动初始化扫描)</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param </font><font style="vertical-align: inherit;">show_hidden </font><font style="vertical-align: inherit;">显示隐藏的网络(是否扫描隐藏网络)</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param通道仅扫描该通道(所有通道均为0) (是否扫描特定通道)</font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param ssid *仅扫描此ssid(所有ssid均为NULL)(是否扫描特定的SSID)</font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @return发现的网络数</font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / int8_t scanNetworks(bool async = false,bool show_hidden = false ,uint8 channel = 0,uint8 * ssid = NULL);</font></font>
复制代码

③scanNetworksAsync-同步扫描周边无线网络,并同时结果
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*开始扫描异步模式下可用的WiFi网络</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param onComplete完成扫描后执行的事件处理程序</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  show_hidden </font><font style="vertical-align: inherit;">显示隐藏的网络</font><font style="vertical-align: inherit;">* / void scanNetworksAsync(std :: function <void(int)> onComplete,bool show_hidden = false);</font></font>
复制代码

④scanComplete-检测异步扫描的结果
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** [/ size] [/ font] [/ color] [/ align] *调用以获取异步模式下的扫描状态(反向扫描的结果函数)</font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @返回扫描结果或状态</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* -1(如果找不到扫描)</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* -2如果未触发扫描</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">int8_t scanComplete();</font></font>
复制代码

⑤scanDelete-从内存中删除掉最近扫描结果
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*从RAM中删除最后的扫描结果(从内存中删除最新的扫描结果)</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / void scanDelete();</font></font>
复制代码

注意:如果不删除,将会叠加上次扫描的结果;

(2)扫描结果方法

①SSID- 获取wifi网络名字
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*返回在网络扫描期间发现的SSID。</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param我指定要从哪个网络项目获取信息</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @return ssid字符串在网络扫描列表中指定项目</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / String SSID(uint8_t networkItem);</font></font>
复制代码

②RSSI-获取wifi网络信号强度
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*返回在scanNetworks(信号强度)期间发现的网络的RSSI </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param我指定要从哪个网络项获取信息</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @返回网络扫描列表中指定项的RSSI的有符号值</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / int32_t RSSI(uint8_t networkItem);</font></font>
复制代码

③encryptionType-获取无线网络加密方式
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*返回在scanNetworks(加密方式)期间发现的网络的加密类型</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param我指定要从哪个网络项获取信息</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @返回扫描的网络上指定项的加密类型(枚举wl_enc_type)列表</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* .....................值映射到802.11加密套件.................. </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* AUTH_OPEN ----> ENC_TYPE_WEP = 5,</font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* AUTH_WEP ----> ENC_TYPE_TKIP = 2,</font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* AUTH_WPA_PSK ----> ENC_TYPE_CCMP = 4,</font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* ........除了这两个,7和8在802.11-2007中保留。 ...... </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* AUTH_WPA2_PSK ----> ENC_TYPE_NONE = 7,</font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* AUTH_WPA_WPA2_PSK ----> ENC_TYPE_AUTO = 8</font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> * / uint8_t encryptionType(uint8_t networkItem);</font></font>
复制代码

④BSSID-获取wifi网络mac地址
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*返回扫描的wifi(物理地址)的MAC / BSSID </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param我指定要从哪个网络项获取信息</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @return uint8_t *扫描的wifi的MAC / BSSID </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / uint8_t * BSSID(uint8_t networkItem); </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*返回扫描的wifi(物理地址)的MAC / BSSID </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param我指定要从哪个网络项获取信息</font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @return uint8_t *扫描的wifi的MAC / BSSID </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* /字符串BSSIDstr(uint8_t networkItem);</font></font>
复制代码

⑤getNetworkInfo-获取整体网络信息,名字,信号强度等
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*将所有信息从扫描的wifi加载到ptr参数中</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param networkItem uint8_t </font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param ssid const char ** </font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param encryptionType uint8_t * </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param RSSI int32_t * </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param BSSID uint8_t ** </font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @参数通道int32_t * </font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param isHidden bool * </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @return(如果可以,则为true)</font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / bool getNetworkInfo(uint8_t networkItem,字符串&ssid,uint8_t&encryptionType,int32_t&RSSI,uint8_t *&BSSID,int32_t&channel,bool&isHid)</font></font>
复制代码

注意:入参前面多数加了&,意味着调完函数后外面获取到详细信息;
⑥频道-获取wifi网络通道号
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*扫描的wifi(通道号)的返回通道</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / int32_t channel(uint8_t networkItem);</font></font>
复制代码

H isHidden-判断wifi网络是否是隐藏网络
函数说明:

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*如果扫描的wifi是隐藏的(没有SSID),则返回[判断扫描到的wifi是否是隐藏wifi] </font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @param networkItem指定要从哪个网络项获取信息</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* @return bool(true ==隐藏)</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* / bool isHidden(uint8_t networkItem);</font></font>
复制代码

动手操作
多说不宜,实验是检验真理的唯一标准,下面我们就来实际操作一下吧
三,
(1)打开零知开源开发工具,如下图:

(2)电脑连接零知ESP8266开发板:

(3)输入以下代码,验证,上传

  1. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">/ ** </font></font>
  2. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">*演示:</font></font>
  3. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* STA模式下,演示同步扫描扫描wifi功能</font></font>
  4. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* [url = home.php?mod = space&uid = 2115719] @author [/ url]云上上云</font></font>
  5. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* [url = home.php?mod = space&uid = 2263295] @date [/ url] 2019/06/01 </font></font>
  6. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">* /#include <ESP8266WiFi.h> </font></font>
  7. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">//以下是三个定义为调试定义的#define DebugBegin(baud_rate)Serial.begin(baud_rate)#define DebugPrintln( message)Serial.println(message)#define DebugPrint(message)Serial.print(message)</font></font>
  8. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">void setup(){//设置串口波特率,</font></font>
  9. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  刹车</font><font style="vertical-align: inherit;">打印信息</font><font style="vertical-align: inherit;">DebugBegin(115200); </font><font style="vertical-align: inherit;">// </font></font>
  10. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  延迟</font><font style="vertical-align: inherit;">5s为了演示效果</font><font style="vertical-align: inherit;">delay(5000); </font><font style="vertical-align: inherit;">//我不想别人连接我,只想做个站点</font></font>
  11. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  WiFi.mode(WIFI_STA); </font><font style="vertical-align: inherit;">// //连接</font></font>
  12. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  WiFi.disconnect(); </font></font>
  13. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  延迟(100); </font></font>
  14. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  DebugPrintln(“设置完成”); </font></font>
  15. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">} </font></font>
  16. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">void loop(){ </font></font>
  17. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  DebugPrintln(“ scan start”); </font><font style="vertical-align: inherit;">//同步扫描,等待返回结果</font></font>
  18. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  int n = WiFi.scanNetworks(); </font></font>
  19. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  DebugPrintln(“扫描完成”); </font><font style="vertical-align: inherit;">如果(n == 0){ </font></font>
  20. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    DebugPrintln(“找不到网络”); </font></font>
  21. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  } else { </font></font>
  22. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    DebugPrint(n); </font></font>
  23. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    DebugPrintln(“发现网络”); </font><font style="vertical-align: inherit;">for(int i = 0; i <n; ++ i){ </font></font>
  24. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(i + 1); </font></font>
  25. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(“:”); </font><font style="vertical-align: inherit;">//打印wifi </font></font>
  26. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      账号DebugPrint(WiFi.SSID(i)); </font></font>
  27. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(“,”); </font></font>
  28. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(String(“ Ch:”)+ WiFi.channel(i)); </font></font>
  29. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(“,”); </font></font>
  30. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(WiFi.isHidden(i)?“ hide”:“ show”); </font></font>
  31. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(“(”); //打印wifi信号强度</font></font>
  32. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(WiFi.RSSI(i)); </font></font>
  33. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(“ dBm”); </font></font>
  34. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrint(“)”); </font><font style="vertical-align: inherit;">//打印wifi加密方式</font></font>
  35. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      DebugPrintln((WiFi.encryptionType(i)== ENC_TYPE_NONE)?“ open”:“ *”); </font></font>
  36. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">      延迟(10); </font></font>
  37. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">    } </font></font>
  38. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  } </font></font>
  39. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  DebugPrintln( “”); </font><font style="vertical-align: inherit;">// </font></font>
  40. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">  延迟</font><font style="vertical-align: inherit;">5s之后再次扫描</font><font style="vertical-align: inherit;">delay(5000); </font></font>
  41. <font style="vertical-align: inherit;"><font style="vertical-align: inherit;">}</font></font>
复制代码

四,测试结果(附近潜在的WiFi 热点):

(我就不一一展示了,它可以扫描完附近所有WiFi)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +8 收起 理由
guangqu + 8

查看全部打赏

发表于 2019-10-29 20:11:10 | 显示全部楼层
不错,有时间也来学习一下新的技术
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-21 00:19 , Processed in 0.187200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表