Главная chevron_right Функции chevron_right Wi-Fi chevron_right WiFiClient

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() будет блокировать выполнение скетча на время таймаута. Учитывайте это при проектировании логики программы.