使用 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
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP