WiFiServer
Класс WiFiServer используется для создания Wi-Fi-сервера на Arduino: принимает входящие TCP-соединения и отправляет данные подключённым клиентам.
Полная статья
Класс Wi-Fi-сервера
WiFiServer — это основной инструмент для построения серверной части Wi-Fi-приложения на Arduino. С его помощью плата начинает слушать входящие TCP-соединения на заданном порту, принимает клиентов и отправляет им данные.
WiFiServer
Описание
WiFiServer — базовый класс для всей серверной работы через Wi-Fi. Напрямую вы его не вызываете: он автоматически используется каждый раз, когда работаете с функциями сервера.
---
WiFiServer()
Описание
Создаёт объект сервера, который будет принимать соединения на указанном порту. Этот вызов только описывает сервер — реальное прослушивание начнётся после server.begin().
Синтаксис
WiFiServer server(port);
Параметры
- порт — номер TCP-порта для прослушивания (
int). Например, порт80— стандартный для HTTP.
Возвращает
Нет
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "myNetwork"; // SSID вашей сети (имя)
char pass[] = "myPassword"; // пароль вашей сети
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
// инициализация serial:
Serial.begin(9600);
Serial.println("Attempting to connect to WPA network...");
Serial.print("SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
if ( status != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
else {
server.begin();
Serial.print("Connected to wifi. My address:");
IPAddress myAddress = WiFi.localIP();
Serial.println(myAddress);
}
}
void loop() {
}
---
server.begin()
Описание
server.begin() запускает сервер: плата начинает принимать входящие соединения на ранее указанном порту. Обычно вызывается один раз в setup(), после того как Wi-Fi-соединение уже установлено.
Синтаксис
server.begin()
Параметры
Нет
Возвращает
Нет
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "lamaison"; // SSID вашей сети (имя)
char pass[] = "tenantaccess247"; // пароль вашей сети
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
// инициализация serial:
Serial.begin(9600);
Serial.println("Attempting to connect to WPA network...");
Serial.print("SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
if ( status != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
else {
server.begin();
Serial.print("Connected to wifi. My address:");
IPAddress myAddress = WiFi.localIP();
Serial.println(myAddress);
}
}
void loop() {
}
---
server.available()
Описание
server.available() проверяет, есть ли клиент, подключённый к серверу и уже приславший данные для чтения. Если такой клиент есть — возвращает объект клиента, с которым можно работать дальше. Если ни один клиент не прислал данных — возвращаемый объект в условии if будет расцениваться как false.
Важно: соединение с клиентом остаётся активным даже после того, как переменная клиента выходит из области видимости. Чтобы явно закрыть соединение, вызовите client.stop().
server.available() наследуется от служебного класса Stream.
Синтаксис
server.available()
Параметры
Нет
Возвращает
Объект клиента. Если ни один клиент не имеет данных для чтения, объект в операторе if будет false.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "Network"; // SSID вашей сети (имя)
char pass[] = "myPassword"; // пароль вашей сети
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
// инициализация serial:
Serial.begin(9600);
Serial.println("Attempting to connect to WPA network...");
Serial.print("SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
if ( status != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
else {
server.begin();
Serial.print("Connected to wifi. My address:");
IPAddress myAddress = WiFi.localIP();
Serial.println(myAddress);
}
}
void loop() {
// ожидание входящих клиентов
WiFiClient client = server.available();
if (client) {
if (client.connected()) {
Serial.println("Connected to client");
}
// закрыть соединение:
client.stop();
}
}
---
server.write()
Описание
server.write() отправляет сырые байты всем клиентам, подключённым к серверу в данный момент. Используйте этот метод, когда нужно передать бинарные данные без какого-либо форматирования.
Синтаксис
server.write(data)
Параметры
- данные — значение для отправки (
byteилиchar).
Возвращает
byte — количество успешно записанных байтов. Возвращаемое значение можно не читать, если оно вам не нужно.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "yourNetwork";
char pass[] = "yourPassword";
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
// инициализация serial:
Serial.begin(9600);
Serial.println("Attempting to connect to WPA network...");
Serial.print("SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
if ( status != WL_CONNECTED) {
Serial.println("Couldn't get a wifi connection");
while(true);
}
else {
server.begin();
}
}
void loop() {
// ожидание входящих клиентов
WiFiClient client = server.available();
if (client == true) {
// читаем байты от входящего клиента и отправляем их обратно
// всем клиентам, подключённым к серверу:
server.write(client.read());
}
}
---
server.print()
Описание
server.print() отправляет данные всем подключённым клиентам в текстовом виде. Числа преобразуются в последовательность ASCII-символов: например, число 123 будет отправлено как три символа — '1', '2', '3'. Это удобно при построении HTTP-ответов или текстовых протоколов.
Синтаксис
server.print(data)
server.print(data, BASE)
Параметры
- data — данные для отправки:
char,byte,int,longили строка. - BASE (необязательно) — система счисления для вывода чисел: BIN — двоичная (основание 2), DEC — десятичная (основание 10),
OCT— восьмеричная (основание 8), HEX — шестнадцатеричная (основание 16).
Возвращает
byte — количество записанных байтов. Читать это значение не обязательно.
---
server.println()
Описание
server.println() работает так же, как server.print(), но автоматически добавляет в конец символы перевода строки (\r\n). Это особенно удобно при формировании HTTP-заголовков и текстовых ответов, где каждая строка должна заканчиваться переносом.
Синтаксис
server.println()
server.println(data)
server.println(data, BASE)
Параметры
- данные (необязательно) — данные для отправки:
char,byte,int,longили строка. Если параметр не указан, отправляется только перевод строки. - BASE (необязательно) — система счисления: DEC — десятичная (основание 10),
OCT— восьмеричная (основание 8), HEX — шестнадцатеричная (основание 16).
Возвращает
byte — количество записанных байтов. Читать это значение не обязательно.
---
Где применяется
- Простой HTTP-сервер — плата отдаёт веб-страницу с показаниями датчиков по запросу браузера.
- Управление устройством по сети — клиент (телефон, компьютер) подключается к плате и отправляет команды через TCP.
- Локальный API — плата принимает запросы от другого микроконтроллера или скрипта в локальной сети.
- Мониторинг данных — сервер периодически рассылает показания датчиков всем подключённым клиентам.
Практические замечания
- Сначала подключитесь к Wi-Fi-сети, и только потом вызывайте
server.begin(). Если вызватьbegin()до установки соединения, сервер не запустится корректно. server.available()не блокирует выполнение: если клиентов нет, функция сразу возвращает пустой объект. Это позволяет продолжать выполнять другой код вloop().- Не забывайте вызывать
client.stop()после завершения работы с клиентом, иначе соединение останется открытым и будет занимать ресурсы. server.write()передаёт байты как есть — без форматирования. Для текстовых протоколов удобнееserver.print()иserver.println().- Если нужно отправить число в шестнадцатеричном виде, передайте вторым аргументом
HEX: например,server.print(255, HEX)отправит строкуFF.