Arduino WiFi 连接网络


为了使用Arduino Uno或任何其他板子连接WiFi,您可能需要一个WiFi扩展板(除非您使用的是内置WiFi功能的板子,例如Arduino Uno WiFi)。WiFi扩展板就像任何其他扩展板一样,堆叠在您的板上,并提供对扩展板本身Arduino引脚的访问。

您可以在这里阅读更多关于WiFi扩展板的信息:

假设您有一个WiFi扩展板,您将需要WiFi库才能开始。您不需要单独下载它;它将内置在您的IDE中。如果您在…

#include <WiFi.h>

没有收到编译错误,则您的IDE包含该库。

在这篇文章中,我们将逐步讲解WiFi库的一个内置示例——WPA连接。您可以在这里找到该示例这里

您遇到的大多数网络都将具有WPA2加密。如果您使用手机创建一个热点,您通常会选择WPA2加密并设置密码。

我们首先包含SPI和WiFi库(SPI因为扩展板使用SPI进行通信)。

#include <SPI.h>
#include <WiFi.h>

接下来,我们定义一些全局变量,包括您打算连接Arduino的网络的SSID、密码和状态**int**。

char ssid[] = "yourNetwork";     // your network SSID (name)
char pass[] = "secretPassword";  // your network password
int status = WL_IDLE_STATUS;    // the Wifi radio's status

在设置中,我们执行以下操作:

  • 初始化**Serial**

  • 检查WiFi扩展板是否存在

  • 检查扩展板的**fw_version**是否正确或是否需要升级

  • 尝试使用**WiFi.begin()**连接到网络

  • 连接后,使用**printCurrentNet()**打印网络详细信息(SSID、BSSID(路由器的MAC地址)、信号强度或RSSI和加密类型)。

  • 此外,使用**printWifiData()**打印WiFi详细信息(本地IP和MAC地址)。

在循环中,我们每10秒使用**printCurrentNet()**保持网络详细信息。

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");
   }

   // attempt to connect to Wifi network:
   while (status != WL_CONNECTED) {
      Serial.print("Attempting to connect to WPA SSID: ");
      Serial.println(ssid);
      // Connect to WPA/WPA2 network:
      status = WiFi.begin(ssid, pass);
      // wait 10 seconds for connection:
      delay(10000);
   }

   // you're connected now, so print out the data:
   Serial.print("You're connected to the network");
   printCurrentNet();
   printWifiData();
}

void loop() {
   // check the network connection once every 10 seconds:
   delay(10000);
   printCurrentNet();
}

void printWifiData() {
   // print your WiFi shield's IP address:
   IPAddress ip = WiFi.localIP();
   Serial.print("IP Address: ");
   Serial.println(ip);
   Serial.println(ip);
   // print your MAC address:
   byte mac[6];
   WiFi.macAddress(mac);
   Serial.print("MAC address: ");
   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);
}

void printCurrentNet() {
   // print the SSID of the network you're attached to:
   Serial.print("SSID: ");
   Serial.println(WiFi.SSID());
   // print the MAC address of the router you're attached to:
   byte bssid[6];
   WiFi.BSSID(bssid);
   Serial.print("BSSID: ");
   Serial.print(bssid[5], HEX);
   Serial.print(":");
   Serial.print(bssid[4], HEX);
   Serial.print(":");
   Serial.print(bssid[3], HEX);
   Serial.print(":");
   Serial.print(bssid[2], HEX);
   Serial.print(":");
   Serial.print(bssid[1], HEX);
   Serial.print(":");
   Serial.println(bssid[0], HEX);
   // print the received signal strength:
   long rssi = WiFi.RSSI();
   Serial.print("signal strength (RSSI):");
   Serial.println(rssi);

   // print the encryption type:
   byte encryption = WiFi.encryptionType();
   Serial.print("Encryption Type:");
   Serial.println(encryption, HEX);
   Serial.println();
}

请注意,WiFi和路由器的MAC地址(**WiFi.macAddress()**和**WiFi.BSSID()**)存储在6字节数组中,每个字节都以十六进制格式逐一打印。两者之间的区别在于,**WiFi.macAddress()**提供您的设备(带有WiFi扩展板的Arduino)的MAC地址,而**WiFi.BSSID()**提供您设备连接到的路由器或接入点的MAC地址。

更新于:2021年7月30日

2K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告