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

1
2
WiFi.SSID(i)

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