WiFi Network
Класс WiFi управляет Wi-Fi-подключением на Arduino: инициализация через WiFi.begin(), статический IP через WiFi.config(), сканирование сетей и получение данных о соединении.
Полная статья
Класс Wi-Fi
WiFi — основной класс библиотеки Wi-Fi для Arduino. Он отвечает за инициализацию сетевых параметров, подключение к точке доступа и отключение от неё, а также предоставляет набор вспомогательных функций для получения информации о сети.
WiFi.begin()
Описание
Инициализирует Wi-Fi-модуль и запускает подключение к сети. Это первая функция, которую нужно вызвать в скетче, прежде чем работать с сетью. Она возвращает текущий статус соединения, поэтому её результат удобно проверять в цикле ожидания.
Синтаксис
WiFi.begin(ssid);
WiFi.begin(ssid, pass);
WiFi.begin(ssid, keyIndex, key);
Параметры
- ssid — имя сети Wi-Fi (SSID), к которой нужно подключиться.
keyIndex— индекс ключа для WEP-сетей (от 0 до 3): такие сети могут хранить до четырёх ключей одновременно, и этот параметр указывает, какой из них использовать.- ключ — шестнадцатеричная строка, используемая как ключ безопасности в WEP-сетях.
- pass — пароль для WPA/WPA2-сетей в виде обычной строки.
Возвращает
WL_CONNECTED — если подключение установлено; WL_IDLE_STATUS — если модуль включён, но к сети не подключён.
Пример
#include <WiFi.h>
//SSID вашей сети
char ssid[] = "yourNetwork";
//пароль вашей WPA-сети
char pass[] = "secretPassword";
void setup()
{
WiFi.begin(ssid, pass);
}
void loop () {}
---
WiFi.disconnect()
Описание
Отключает WiFi Shield от текущей Wi-Fi-сети. Используйте эту функцию, когда нужно явно разорвать соединение, например перед переходом в режим энергосбережения или перед подключением к другой сети.
Синтаксис
WiFi.disconnect();
Параметры
Нет.
Возвращает
Ничего.
---
WiFi.config()
Описание
WiFi.config() позволяет задать статический IP-адрес и при необходимости вручную указать адреса DNS-сервера, шлюза и маску подсети. По умолчанию WiFi.begin() настраивает модуль через DHCP — WiFi.config() отключает это поведение и фиксирует сетевые параметры.
Если вызвать WiFi.config() до WiFi.begin(), то begin() сразу применит указанные адреса. Если вызвать WiFi.config() после WiFi.begin(), модуль сначала инициализируется в режиме DHCP, а затем переключится на статические параметры.
Статический IP удобен, когда нужно обращаться к устройству по фиксированному адресу — например, при создании веб-сервера на Arduino.
Синтаксис
WiFi.config(ip);
WiFi.config(ip, dns);
WiFi.config(ip, dns, gateway);
WiFi.config(ip, dns, gateway, subnet);
Параметры
- ip — IP-адрес устройства (массив из 4 байт).
- DNS — адрес DNS-сервера.
- шлюз — IP-адрес сетевого шлюза (массив из 4 байт); необязательный параметр, по умолчанию совпадает с
ip, но с последним октетом1. - подсеть — маска подсети (массив из 4 байт); необязательный параметр, по умолчанию
255.255.255.0.
Возвращает
Ничего.
Пример
This example shows how to set the static IP address, 192.168.0.177, of the LAN network to the WiFi shield:
#include <SPI.h>
#include <WiFi.h>
// IP-адрес шилда:
IPAddress ip(192, 168, 0, 177);
char ssid[] = "yourNetwork"; // SSID вашей сети (имя)
char pass[] = "secretPassword"; // пароль сети (для WPA или ключ для WEP)
int status = WL_IDLE_STATUS;
void setup()
{
// Инициализация serial и ожидание открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ожидание подключения serial-порта. Нужно только для Leonardo
}
// проверка наличия шилда:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while(true); // не продолжать
}
WiFi.config(ip);
// попытка подключения к WiFi-сети:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Подключение к WPA/WPA2-сети. Измените эту строку при использовании открытой сети или WEP:
status = WiFi.begin(ssid, pass);
// ожидание подключения 10 секунд:
delay(10000);
}
// вывод IP-адреса WiFi-шилда:
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop () {}
---
WiFi.setDNS()
Описание
WiFi.setDNS() задаёт адреса DNS-серверов отдельно от остальных сетевых параметров. Это полезно, когда IP-адрес получается через DHCP, но DNS-серверы нужно переопределить вручную — например, использовать публичный DNS вместо предоставленного провайдером.
Синтаксис
WiFi.setDNS(dns_server1)
WiFi.setDNS(dns_server1, dns_server2)
Параметры
dns_server1— IP-адрес основного DNS-сервера.dns_server2— IP-адрес резервного DNS-сервера.
Возвращает
Ничего.
Пример
This example shows how to set the Google DNS (8.8.8.8). You can set it as an object IPAddress.
#include <SPI.h>
#include <WiFi.h>
// IP-адрес шилда:
IPAddress dns(8, 8, 8, 8); // DNS Google
char ssid[] = "yourNetwork"; // SSID вашей сети (имя)
char pass[] = "secretPassword"; // пароль сети (для WPA или ключ для WEP)
int status = WL_IDLE_STATUS;
void setup()
{
// Инициализация serial и ожидание открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ожидание подключения serial-порта. Нужно только для Leonardo
}
// проверка наличия шилда:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
while(true); // не продолжать
}
// попытка подключения к WiFi-сети:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Подключение к WPA/WPA2-сети. Измените эту строку при использовании открытой сети или WEP:
status = WiFi.begin(ssid, pass);
// ожидание подключения 10 секунд:
delay(10000);
}
// вывод IP-адреса WiFi-шилда:
WiFi.setDNS(dns);
Serial.print("Dns configured.");
}
void loop () {
}
---
WiFi.SSID()
Описание
Возвращает SSID сети, к которой в данный момент подключён модуль, или имя конкретной сети из результатов последнего сканирования.
Синтаксис
WiFi.SSID();
WiFi.SSID(wifiAccessPoint)
Параметры
- wifiAccessPoint — индекс сети из результатов
WiFi.scanNetworks(), если нужно получить имя конкретной найденной сети.
Возвращает
Строка (String) с именем текущей сети или сети с указанным индексом.
Пример
#include <SPI.h>
#include <WiFi.h>
//SSID вашей сети
char ssid[] = "yourNetwork";
int status = WL_IDLE_STATUS; // статус WiFi-модуля
void setup()
{
// инициализация serial:
Serial.begin(9600);
// сканирование существующих сетей:
Serial.println("Scanning available networks...");
scanNetworks();
// попытка подключения с шифрованием WEP:
Serial.println("Attempting to connect to open network...");
status = WiFi.begin(ssid);
Serial.print("SSID: ");
Serial.println(ssid);
}
void loop () {}
void scanNetworks() {
// сканирование ближайших сетей:
Serial.println("** Scan Networks **");
byte numSsid = WiFi.scanNetworks();
// вывод списка найденных сетей:
Serial.print("SSID List:");
Serial.println(numSsid);
// вывод номера и имени каждой найденной сети:
for (int thisNet = 0; thisNet<numSsid; thisNet++) {
Serial.print(thisNet);
Serial.print(") Network: ");
Serial.println(WiFi.SSID(thisNet));
}
}
---
WiFi.BSSID()
Описание
Возвращает MAC-адрес маршрутизатора (точки доступа), к которому подключён модуль. Это BSSID — идентификатор конкретной точки доступа, не путайте его с MAC-адресом самой Wi-Fi-платы.
Синтаксис
WiFi.BSSID(bssid);
Параметры
- bssid — массив из 6 байт, в который будет записан MAC-адрес.
Возвращает
Массив байтов (6 байт) с MAC-адресом маршрутизатора.
Пример
#include <WiFi.h>
//SSID вашей сети
char ssid[] = "yourNetwork";
//пароль вашей WPA-сети
char pass[] = "secretPassword";
void setup()
{
WiFi.begin(ssid, pass);
if ( status != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
// если подключены — вывести информацию о соединении:
else {
// вывод MAC-адреса роутера, к которому подключены:
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);
}
}
void loop () {}
---
WiFi.RSSI()
Описание
Возвращает уровень сигнала текущего соединения или конкретной сети из результатов сканирования. Значение RSSI (Received Signal Strength Indicator) выражается в дБм и обычно находится в диапазоне от −30 (очень сильный сигнал) до −90 дБм (слабый сигнал). Чем меньше абсолютное значение, тем лучше приём.
Синтаксис
WiFi.RSSI();
WiFi.RSSI(wifiAccessPoint);
Параметры
- wifiAccessPoint — индекс сети из результатов
WiFi.scanNetworks(), если нужно узнать уровень сигнала конкретной найденной сети.
Возвращает
long — уровень сигнала в дБм.
Пример
#include <SPI.h>
#include <WiFi.h>
//SSID вашей сети
char ssid[] = "yourNetwork";
//пароль вашей WPA-сети
char pass[] = "secretPassword";
void setup()
{
WiFi.begin(ssid, pass);
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
// если подключены — вывести информацию о соединении:
else {
// вывод уровня принимаемого сигнала:
long rssi = WiFi.RSSI();
Serial.print("RSSI:");
Serial.println(rssi);
}
}
void loop () {}
---
WiFi.encryptionType()
Описание
Возвращает тип шифрования текущей сети или сети с указанным индексом из результатов сканирования. Это полезно при анализе доступных сетей — например, чтобы отфильтровать незащищённые точки доступа.
Синтаксис
WiFi.encryptionType();
WiFi.encryptionType(wifiAccessPoint);
Параметры
- wifiAccessPoint — индекс сети из результатов
WiFi.scanNetworks().
Возвращает
byte — числовой код типа шифрования:
| Значение | Тип шифрования |
|---|---|
| 2 | TKIP (WPA) |
| 4 | CCMP (WPA) |
| 5 | WEP |
| 7 | Нет (открытая сеть) |
| 8 | AUTO |
Пример
#include <SPI.h>
#include <WiFi.h>
//SSID вашей сети
char ssid[] = "yourNetwork";
//пароль вашей WPA-сети
char pass[] = "secretPassword";
void setup()
{
WiFi.begin(ssid, pass);
if ( status != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
// если подключены — вывести информацию о соединении:
else {
// вывод типа шифрования:
byte encryption = WiFi.encryptionType();
Serial.print("Encryption Type:");
Serial.println(encryption,HEX);
}
}
void loop () {}
---
WiFi.scanNetworks()
Описание
Сканирует эфир и возвращает количество найденных Wi-Fi-сетей. После вызова этой функции можно использовать WiFi.SSID(), WiFi.RSSI() и WiFi.encryptionType() с индексом сети, чтобы получить подробную информацию о каждой из них.
Синтаксис
WiFi.scanNetworks();
Параметры
Нет.
Возвращает
byte — количество обнаруженных сетей.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "yourNetwork"; // название вашей сети
void setup() {
Serial.begin(9600);
int status = WiFi.begin(ssid);
if (status != WL_CONNECTED) {
Serial.println("Couldn't get a WiFi connection");
while (true);
}
else {
// если подключены, сканировать доступные WiFi-сети и вывести их количество:
Serial.println("** Scan Networks **");
byte numSsid = WiFi.scanNetworks();
Serial.print("Number of available WiFi networks discovered:");
Serial.println(numSsid);
}
}
void loop() {}
---
WiFi.status()
Описание
Возвращает текущий статус Wi-Fi-соединения. Эту функцию удобно вызывать в цикле while, ожидая установления соединения, а также для диагностики — чтобы понять, почему подключение не удалось.
Синтаксис
WiFi.status();
Параметры
Нет.
Возвращает
Одна из констант статуса:
WL_CONNECTED— соединение с сетью установлено.WL_NO_SHIELD— Wi-Fi-модуль или библиотека не обнаружены.WL_IDLE_STATUS— временный статус после вызоваWiFi.begin(): модуль пытается подключиться, пока не исчерпает попытки (тогда переходит вWL_CONNECT_FAILED) или не установит соединение (WL_CONNECTED).WL_NO_SSID_AVAIL— указанный SSID не найден в эфире.WL_SCAN_COMPLETED— сканирование сетей завершено.WL_CONNECT_FAILED— все попытки подключения исчерпаны.WL_CONNECTION_LOST— соединение было потеряно.WL_DISCONNECTED— модуль отключён от сети.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "yourNetwork"; // SSID вашей сети (название)
char key[] = "D0D0DEADF00DABBADEAFBEADED"; // ключ вашей сети
int keyIndex = 0; // индекс ключа вашей сети
int status = WL_IDLE_STATUS; // статус WiFi-модуля
void setup() {
//инициализация Serial и ожидание открытия порта:
Serial.begin(9600);
while (!Serial) {
; // ожидание подключения к последовательному порту. Нужно только для Leonardo
}
// проверка наличия шилда:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// не продолжать:
while (true);
}
// попытка подключиться к WiFi-сети:
while ( status != WL_CONNECTED) {
Serial.print("Attempting to connect to WEP network, SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, keyIndex, key);
// ожидание подключения 10 секунд:
delay(10000);
}
// после подключения:
Serial.print("You're connected to the network");
}
void loop() {
// проверять статус подключения каждые 10 секунд:
delay(10000);
Serial.println(WiFi.status());
}
---
WiFi.getSocket()
Описание
Возвращает номер первого свободного сокета. Используется внутри библиотеки при создании соединений; в большинстве пользовательских скетчей вызывать эту функцию напрямую не нужно.
Синтаксис
WiFi.getSocket();
Параметры
Нет.
Возвращает
int — индекс первого доступного сокета.
---
WiFi.macAddress()
Описание
Записывает MAC-адрес самой Wi-Fi-платы в переданный массив. Это не адрес маршрутизатора — для его получения используйте WiFi.BSSID(). MAC-адрес платы уникален и не меняется; его удобно использовать как идентификатор устройства в сети.
Синтаксис
WiFi.macAddress(mac);
Параметры
- mac — массив из 6 байт, в который будет записан MAC-адрес Wi-Fi-платы.
Возвращает
Массив из 6 байт с MAC-адресом Wi-Fi-платы.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "yourNetwork"; // название вашей сети
int status = WL_IDLE_STATUS; // статус WiFi-модуля
byte mac[6]; // MAC-адрес вашего WiFi-шилда
void setup()
{
Serial.begin(9600);
status = WiFi.begin(ssid);
if ( status != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
// если подключены, вывести MAC-адрес:
else {
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);
}
}
void loop () {}
---
Где применяется
- Подключение к домашней или офисной сети —
WiFi.begin()с паролем WPA/WPA2 для доступа к интернету или локальным сервисам. - Веб-сервер на Arduino —
WiFi.config()со статическим IP позволяет всегда обращаться к устройству по одному и тому же адресу. - Диагностика окружения —
WiFi.scanNetworks()вместе сWiFi.SSID(),WiFi.RSSI()иWiFi.encryptionType()помогают отобразить список доступных сетей и их параметры. - Мониторинг соединения — периодический вызов
WiFi.status()позволяет обнаружить потерю связи и автоматически переподключиться.
Практические замечания
- После вызова
WiFi.begin()соединение устанавливается не мгновенно. Используйте циклwhile (WiFi.status() != WL_CONNECTED)с небольшой задержкой, чтобы дождаться подключения. - Если
WiFi.status()постоянно возвращаетWL_CONNECT_FAILEDилиWL_NO_SSID_AVAIL, проверьте правильность SSID и пароля, а также убедитесь, что сеть находится в зоне уверенного приёма. WiFi.config()нужно вызывать доWiFi.begin(), если хотите, чтобы статический IP применился сразу при инициализации.- RSSI, возвращаемый
WiFi.RSSI(), — отрицательное число в дБм. Значения ближе к нулю означают более сильный сигнал: −50 дБм — хороший сигнал, −80 дБм и ниже — слабый. - Не путайте
WiFi.macAddress()(MAC самой Wi-Fi-платы) иWiFi.BSSID()(MAC точки доступа, к которой подключена плата).