WiFiClient
WiFiClient — класс для TCP-соединений через Wi-Fi: подключайтесь к серверу через client.connect(), отправляйте данные и читайте ответ с помощью client.read().
Полная статья
Класс WiFiClient
WiFiClient используется для TCP-подключений через Wi-Fi: с его помощью скетч подключается к серверу, отправляет данные и читает ответ.
WiFiClient
Описание
WiFiClient — это базовый класс для всех клиентских операций через Wi-Fi. Напрямую его не инициализируют через какую-то особую функцию: вы просто объявляете объект типа WiFiClient и вызываете его методы. Именно этот класс стоит за всеми функциями, которые работают с TCP-соединениями в Wi-Fi-библиотеке.
Типичный сценарий: создать объект WiFiClient, подключиться к серверу через client.connect(), отправить HTTP-запрос через client.print() или client.println(), прочитать ответ через client.read(), и завершить соединение через client.stop().
WiFiClient
Описание
Создаёт объект клиента, готового к подключению к серверу. Адрес и порт задаются позже — при вызове client.connect().
Синтаксис
WiFiClient client;
Параметры
нет
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "myNetwork"; // SSID вашей сети (имя)
char pass[] = "myPassword"; // пароль вашей сети
int status = WL_IDLE_STATUS;
IPAddress server(74,125,115,105); // Google
// Инициализация клиентской библиотеки
WiFiClient client;
void setup() {
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 {
Serial.println("Connected to wifi");
Serial.println("\nStarting connection...");
// если соединение установлено, сообщить об этом через serial:
if (client.connect(server, 80)) {
Serial.println("connected");
// Выполнить HTTP-запрос:
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
}
}
}
void loop() {
}
client.connected()
Описание
Проверяет, активно ли соединение с сервером. Важная деталь: клиент считается подключённым даже после того, как сервер закрыл соединение, если в буфере ещё остались непрочитанные данные. Это значит, что client.connected() вернёт true до тех пор, пока вы не вычитаете все данные, — и только потом станет false.
Это поведение удобно использовать в цикле чтения: продолжать читать данные, пока client.connected() возвращает true, и завершить работу, когда соединение действительно закрыто и буфер пуст.
Синтаксис
client.connected()
Параметры
нет
Возвращает
true — если клиент подключён (или есть непрочитанные данные), false — если соединение закрыто и данных нет.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "myNetwork"; // SSID вашей сети (имя)
char pass[] = "myPassword"; // пароль вашей сети
int status = WL_IDLE_STATUS;
IPAddress server(74,125,115,105); // Google
// Инициализация клиентской библиотеки
WiFiClient client;
void setup() {
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 {
Serial.println("Connected to wifi");
Serial.println("\nStarting connection...");
// если соединение установлено, сообщить об этом через serial:
if (client.connect(server, 80)) {
Serial.println("connected");
// Выполнить HTTP-запрос:
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
}
}
}
void loop() {
if (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
;
}
}
client.connect()
Описание
Устанавливает TCP-соединение с указанным адресом и портом. Поддерживает как IP-адрес (четыре байта), так и доменное имя — в последнем случае автоматически выполняется DNS-запрос. Если соединение не удалось установить (сервер недоступен, порт закрыт, нет сети), функция вернёт false.
Проверяйте возвращаемое значение перед отправкой данных — это поможет избежать отправки запроса в никуда.
Синтаксис
client.connect(ip, port)
client.connect(URL, port)
Параметры
ip— IP-адрес сервера (массив из 4 байтов)URL— доменное имя сервера (строка, например"arduino.cc")port— номер порта (int), например80для HTTP или443для HTTPS
Возвращает
true — если соединение установлено успешно, false — если нет.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "myNetwork"; // SSID вашей сети (имя)
char pass[] = "myPassword"; // пароль вашей сети
int status = WL_IDLE_STATUS;
char servername[]="google.com"; // удалённый сервер, к которому будем подключаться
WiFiClient client;
void setup() {
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 {
Serial.println("Connected to wifi");
Serial.println("\nStarting connection...");
// если соединение установлено, сообщить об этом через serial:
if (client.connect(servername, 80)) {
Serial.println("connected");
// Выполнить HTTP-запрос:
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
}
}
}
void loop() {
}
client.write()
Описание
Отправляет один байт или символ на сервер, к которому подключён клиент. Это низкоуровневая функция; для отправки строк и чисел удобнее использовать client.print() или client.println().
Синтаксис
client.write(data)
Параметры
data— байт или символ для отправки
Возвращает
Количество успешно отправленных байтов. Как правило, это значение не нужно проверять.
client.print()
Описание
Отправляет данные на сервер в текстовом виде. Числа преобразуются в последовательность ASCII-символов: например, число 123 будет отправлено как три символа '1', '2', '3', а не как один байт со значением 123. Это стандартное поведение для HTTP-запросов и других текстовых протоколов.
Синтаксис
client.print(data)
client.print(data, BASE)
Параметры
data— данные для отправки:char,byte,int,longили строкаBASE(необязательно) — система счисления для чисел: DEC для десятичной (основание 10),OCTдля восьмеричной (основание 8), HEX для шестнадцатеричной (основание 16)
Возвращает
Количество отправленных байтов. Проверять это значение необязательно.
client.println()
Описание
Работает так же, как client.print(), но добавляет в конец символы возврата каретки и перевода строки (\r\n). Это особенно важно при формировании HTTP-запросов, где каждая строка заголовка должна заканчиваться именно такой последовательностью.
Если вызвать client.println() без аргументов, будет отправлена только пустая строка (\r\n) — это нужно, например, для завершения блока HTTP-заголовков.
Синтаксис
client.println()
client.println(data)
client.print(data, BASE)
Параметры
data(необязательно) — данные для отправки:char,byte,int,longили строкаBASE(необязательно) — система счисления: DEC для десятичной (основание 10),OCTдля восьмеричной (основание 8), HEX для шестнадцатеричной (основание 16)
Возвращает
Количество отправленных байтов. Проверять это значение необязательно.
client.available()
Описание
Возвращает количество байтов, которые уже получены от сервера и ждут чтения в буфере. Функция унаследована от служебного класса Stream.
Проверяйте client.available() перед вызовом client.read(): если доступных байтов нет, client.read() вернёт -1. Типичный паттерн — читать данные в цикле, пока client.available() > 0.
Синтаксис
client.available()
Параметры
нет
Возвращает
Количество байтов, доступных для чтения прямо сейчас.
Пример
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "myNetwork"; // SSID вашей сети (имя)
char pass[] = "myPassword"; // пароль вашей сети
int status = WL_IDLE_STATUS;
char servername[]="google.com"; // Google
WiFiClient client;
void setup() {
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 {
Serial.println("Connected to wifi");
Serial.println("\nStarting connection...");
// если соединение установлено, сообщить об этом через serial:
if (client.connect(servername, 80)) {
Serial.println("connected");
// Выполнить HTTP-запрос:
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
}
}
}
void loop() {
// если есть входящие байты
// от сервера — читать и выводить их:
if (client.available()) {
char c = client.read();
Serial.print(c);
}
// если сервер отключился, остановить клиент:
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
// ничего не делать вечно:
for(;;)
;
}
}
client.read()
Описание
Читает один байт из буфера входящих данных — тот, что пришёл от сервера. Каждый вызов client.read() сдвигает позицию на один байт вперёд. Функция унаследована от служебного класса Stream.
Если данных в буфере нет, функция вернёт -1. Поэтому перед чтением стоит убедиться, что client.available() больше нуля.
Синтаксис
client.read()
Параметры
нет
Возвращает
Следующий байт (или символ) из буфера, либо -1, если данных нет.
client.flush()
Описание
Сбрасывает все байты, которые были записаны клиенту, но ещё не прочитаны. Функция унаследована от служебного класса Stream.
Используйте client.flush(), если нужно очистить буфер и не обрабатывать оставшиеся данные — например, перед закрытием соединения.
Синтаксис
client.flush()
Параметры
нет
Возвращает
нет
client.stop()
Описание
Закрывает соединение с сервером. После вызова client.stop() объект WiFiClient можно использовать повторно — для нового подключения через client.connect().
Хорошая практика — всегда вызывать client.stop() после завершения работы с сервером, чтобы освободить ресурсы.
Синтаксис
client.stop()
Параметры
нет
Возвращает
нет
---
Где применяется
- HTTP-запросы к веб-серверам — отправить GET или POST запрос и получить ответ от REST API или веб-страницы.
- Отправка данных в облако — передача показаний датчиков на платформы вроде ThingSpeak или собственный сервер.
- Работа с MQTT-брокером —
WiFiClientчасто передаётся в конструктор MQTT-библиотек как транспортный уровень. - Связь между платами — одна плата выступает сервером, другая подключается к ней как клиент через
WiFiClient.
Практические замечания
- Всегда проверяйте возвращаемое значение
client.connect()— если оноfalse, отправлять данные бессмысленно. client.connected()возвращаетtrueдаже после закрытия соединения сервером, пока в буфере есть непрочитанные данные. Не путайте это с ошибкой.- Для чтения ответа используйте связку
client.available()+client.read()в цикле, а не толькоclient.connected(). - После завершения работы вызывайте
client.stop()— это освобождает сокет и предотвращает утечку ресурсов. - Если сервер долго не отвечает,
client.connect()будет блокировать выполнение скетча на время таймаута. Учитывайте это при проектировании логики программы.