ESP8266-Arduino网络编程实例-扫描WiFi可用网络
扫描WiFi可用网络
ESP8266一个重要的核心功能是WiFi。ESP8266的WiFi有两种工作模式:一种是STA,一种是AP(Access Point)。
连接到 Wi-Fi 网络的设备称为站 (STA)。 与 Wi-Fi 的连接由接入点 (AP) 提供,该接入点充当一个或多个站点的集线器。 另一端的接入点连接到有线网络。 接入点通常与路由器集成,以提供从 Wi-Fi 网络到互联网的访问。 每个接入点都由 SSID(服务集标识符)识别,本质上是您在将设备(站)连接到 Wi-Fi 时选择的网络名称。
ESP8266 模块可以作为一个站点(接入点,AP)运行,以建立自己的 Wi-Fi 网络。 当 ESP8266 模块作为soft-AP运行时,可以将其他站连接到 ESP 模块。
本文将演示在STA模式下如何扫描并列出可用的WiFi网络。
1、硬件准备
- ESP8266 NodeMCU开发板一块
- 数据线一条
2、软件准备
- Arduino IDE或VSCode + PlatformIO
在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:
ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:
3、代码实现
ESP8266 的 Wi-Fi 库是基于ESP8266 SDK 开发的,使用了 Arduino WiFi 库的命名约定和整体功能理念。 随着时间的推移,从 ESP8266 SDK 移植到 esp8266 / Arduino 的 Wi-Fi 功能的丰富性超过了 Arduino WiFi 库。
ESP8266的WiFi库对WiFi网络扫描进行了深度封装,因此只需要调用该库的scanNetworks即可完成WiFi网络扫描。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <ESP8266WiFi.h>
void setup() { Serial.begin(115200); Serial.println(); // 设置WiFi工作模式 WiFi.mode(WIFI_STA); // 断开WiFi连接 WiFi.disconnect(); delay(100); }
void loop() { Serial.print("Scan start ... "); // 扫描WiFi网络,返回可用网络个数 int n = WiFi.scanNetworks(); Serial.print(n); Serial.println(" network(s) found"); for (int i = 0; i < n; i++) { // 查询WiFi的SSID Serial.println(WiFi.SSID(i)); } Serial.println();
delay(5000); }
|
在上面示例中,在setup函数中,初始化串口,设置WiFi工作模式
1 2 3 4 5 6 7 8
| Serial.begin(115200); Serial.println(); // 设置WiFi工作模式 WiFi.mode(WIFI_STA); // 断开WiFi连接 WiFi.disconnect();
|
在loop函数中,每5秒扫描一次WiFi网络
1 2
| int n = WiFi.scanNetworks();
|
查询WiFi网络的SSID
WiFi.scanNetwork函数,有两个参数:
- async:是否开启异步扫描,true表示开启;false表示关闭。默认为
- hidden:是否开启扫描隐藏网络,true表示开启;falase表示关闭
如果需要查询更详细的WiFi网络信息,请使用WiFi.getNetworkInfo函数。该函数将返回WiFi网络的ssid,rssi,加密类型、bssid、通道、是否隐藏信息。可以将示例中的loop函数做如下更改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| void loop() { String ssid; int32\_t rssi; uint8\_t encryptionType; uint8\_t\* bssid; int32\_t channel; bool hidden; int scanResult;
Serial.println(F("Starting WiFi scan..."));
scanResult = WiFi.scanNetworks(/\*async=\*/false, /\*hidden=\*/true);
if (scanResult == 0) { Serial.println(F("No networks found")); } else if (scanResult > 0) { Serial.printf(PSTR("%d networks found:\n"), scanResult);
// 输出扫描结果 for (int8\_t i = 0; i < scanResult; i++) { WiFi.getNetworkInfo(i, ssid, encryptionType, rssi, bssid, channel, hidden);
Serial.printf(PSTR(" %02d: [CH %02d] [%02X:%02X:%02X:%02X:%02X:%02X] %ddBm %c %c %s\n"), i, channel, bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5], rssi, (encryptionType == ENC_TYPE_NONE) ? ' ' : '\*', hidden ? 'H' : 'V', ssid.c\_str()); yield(); } } else { Serial.printf(PSTR("WiFi scan error %d"), scanResult); }
delay(5000); }
|
文章来源: https://iotsmart.blog.csdn.net/article/details/127104803
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!