使用 Arduino 进行 WiFi 网络扫描
为了在 Arduino Uno 或其他任何开发板上使用 WiFi,您可能需要获取一个 WiFi Shield(除非您使用的是带有内置 WiFi 功能的开发板,例如 Arduino Uno WiFi)。WiFi Shield 与其他 Shield 一样,堆叠在您的开发板上,并提供对 Shield 本身 Arduino 引脚的访问。
您可以在此处阅读更多有关 WiFi Shield 的信息 -
https://www.arduino.cc/en/pmwiki.php?n=Main/ArduinoWiFiShield
https://www.arduino.cc/en/Guide/ArduinoWiFiShield
假设您有一个 WiFi Shield,您将需要 WiFi 库才能开始使用。您无需单独下载它;它将内置在您的 IDE 中。如果您在
#include <WiFi.h>
处没有收到编译错误,则您的 IDE 包含该库。
在本文中,我们将逐步介绍 **WiFi 库 - 网络扫描** 的内置示例。代码可以在 此处 找到。
我们首先包含 SPI 和 WiFi 库(SPI 因为 Shield 使用 SPI 进行通信)。
#include <SPI.h> #include <WiFi.h>
在 setup 中,我们检查 Shield 是否存在,检查其固件版本,并打印其 MAC 地址,
void setup() { //Initialize serial and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // check for the presence of the shield: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don't continue: while (true); } String fv = WiFi.firmwareVersion(); if (fv != "1.1.0") { Serial.println("Please upgrade the firmware"); } // Print WiFi MAC address: printMacAddress(); }
**printMacAddress()** 函数将在后面介绍。
在循环中,我们每 10 秒列出所有网络。
void loop() { // scan for existing networks: Serial.println("Scanning available networks..."); listNetworks(); delay(10000); }
现在,**printMacAddress** 函数只是使用 **WiFi.macAddress()** 函数将 **macAddress** 复制到一个 6 字节数组中,然后逐字节打印出值。
void printMacAddress() { // the MAC address of your Wifi shield byte mac[6]; // print your MAC address: WiFi.macAddress(mac); Serial.print("MAC: "); Serial.print(mac[5], HEX); Serial.print(":"); Serial.print(mac[4], HEX); Serial.print(":"); Serial.print(mac[3], HEX); Serial.print(":"); Serial.print(mac[2], HEX); Serial.print(":"); Serial.print(mac[1], HEX); Serial.print(":"); Serial.println(mac[0], HEX); }
**listNetworks()** 函数使用了 **WiFi.scanNetworks()** 函数。如果此函数未找到 SSID,则返回 -1,否则返回它找到的 SSID 数量。可以使用 **WiFi.SSID()**、**WiFi.RSSI()** 和 **WiFi.encryptionType()** 分别获取每个网络的 SSID 值、信号强度指示器 RSSI 和其加密类型。
void listNetworks() { // scan for nearby networks: Serial.println("** Scan Networks **"); int numSsid = WiFi.scanNetworks(); if (numSsid == -1) { Serial.println("Couldn't get a wifi connection"); while (true); } // print the list of networks seen: Serial.print("number of available networks:"); Serial.println(numSsid); // print the network number and name for each network found: for (int thisNet = 0; thisNet < numSsid; thisNet++) { Serial.print(thisNet); Serial.print(") "); Serial.print(WiFi.SSID(thisNet)); Serial.print("\tSignal: "); Serial.print(WiFi.RSSI(thisNet)); Serial.print(" dBm"); Serial.print("\tEncryption: "); printEncryptionType(WiFi.encryptionType(thisNet)); } }
**printEncryptionType** 函数本质上是一个 switch case,根据传递的数值打印加密类型的文本。
void printEncryptionType(int thisType) { // read the encryption type and print out the name: switch (thisType) { case ENC_TYPE_WEP: Serial.println("WEP"); break; case ENC_TYPE_TKIP: Serial.println("WPA"); break; case ENC_TYPE_CCMP: Serial.println("WPA2"); break; case ENC_TYPE_NONE: Serial.println("None"); break; case ENC_TYPE_AUTO: Serial.println("Auto"); break; } }
有关 WiFi 库的更多信息,请参阅 https://www.arduino.cc/en/Reference/WiFi