В этом примере мы рассмотрим, как установить HTTP-связь между двумя устройствами ESP32. Одно из устройств будет действовать как сервер, а другое – как клиент. Впрочем, такая концепция позволяет взаимодействовать большему количеству устройств в сети.
В некоторых случаях применения может потребоваться использование нескольких устройств в сети для связи друг с другом. Например, мы могли бы спроектировать архитектуру, в которой есть центральный узел, отвечающий за связь с удаленным сервером. Этот узел может выполнять роль получения данных от других устройств и отправки их на сервер и/или получения конфигураций с сервера и пересылки их на устройства.
Естественно, существует много гипотетических сценариев, оправдывающих это межмашинное взаимодействие, а также существует много способов его реализации. Как уже упоминалось, в этом руководстве мы рассмотрим, как использовать HTTP, чтобы два устройства ESP32 могли общаться друг с другом. Один из них будет действовать как сервер, предоставляя доступ к конечной точке, а другой – как клиент, выполняя запросы к этой конечной точке и получая данные.
Для этого урока мы будем предполагать, что клиент просто выполнит запрос GET и распечатает сообщение, возвращаемое сервером. Для настройки сервера мы будем использовать библиотеку асинхронного веб-сервера http (https://github.com/me-no-dev/ESPAsyncWebServer).
Для начала напишем код для сервера. Полный код представлен немного ниже, а сейчас рассмотрим основные его рабочие моменты. С помощью строки AsyncWebServer server(80) мы создаем объект класса AsyncWebServer, который мы будем использовать для настройки сервера. В качестве ввода конструктора мы передадим порт, где сервер будет ожидать входящие запросы. Мы будем использовать порт 80, который является портом HTTP по умолчанию.
Переходя к настройке Arduino, мы начнем с открытия последовательного соединения, чтобы вывести некоторые результаты нашей программы, а затем подключим устройство к сети WiFi, используя ранее определенные учетные данные. После того, как соединение установлено, мы выведем в последовательный порт IP-адрес, назначенный для ESP32 в сети. Это IP-адрес, который мы должны использовать при указании конечной точки назначения для HTTP-запроса в клиентском коде, описанном в следующем разделе.
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println(WiFi.localIP());
Затем мы настроим маршрут сервера, вызвав метод on нашего объекта AsyncWebServer. В качестве первого ввода метода мы передаем строку, указывающую конечную точку маршрута, в качестве второй –я константу, указывающую разрешенный метод HTTP, а в качестве третьей и последней –я функцию обработки маршрута. Мы установим имя нашего маршрута как «/test», и оно будет прослушивать только запросы HTTP GET. Реализация функции обработки маршрута будет состоять из печати сообщения на последовательный порт, указывающего, что запрос был получен, и последующей отправки ответа клиенту.
Функция обработки маршрута получает в качестве входных данных указатель на объект класса AsyncWebServerRequest. Мы можем вернуть ответ клиенту, вызвав метод send для этого объекта, передав в качестве первого ввода код ответа HTTP, в качестве второго введите тип содержимого и в качестве третьего введите полезную нагрузку ответа. Мы отправим HTTP-код ответа 200, что означает успех, мы установим тип содержимого «text/plain», а полезная нагрузка будет простым «Hello» сообщением. Обратите внимание, что мы собираемся указать функцию обработки маршрута, используя лямбда-синтаксис C++.
server.on("/test", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Request received");
request->send(200, "text/plain", "Hello from server");
});
Для завершения нам просто нужно вызвать метод server.begin() в нашем объекте сервера, чтобы он начал прослушивать входящие запросы. Вот полный код серверной части:
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPass";
AsyncWebServer server(80);
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println(WiFi.localIP());
server.on("/test", HTTP_GET, [](AsyncWebServerRequest *request){
Serial.println("Request received");
request->send(200, "text/plain", "Hello from server");
});
server.begin();
}
void loop(){}
Теперь напишем код клиентской части. Также выделим сначала основные моменты кода, а полный код приведем в конце. Наша функция настройки Arduino состоит в открытии последовательного соединения и последующем подключении устройства к сети WiFi.
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
}
Мы напишем остальную часть нашего кода в функции основного цикла Arduino, чтобы клиент периодически отправлял HTTP-запрос GET на сервер. Первое, что мы сделаем, это определим объект класса HTTPClient (строка HTTPClient http). Этот объект предоставит нам методы, которые нам нужны для отправки запроса на сервер.
Затем нам нужно вызвать метод begin для нашего объекта HTTPClient, чтобы настроить запрос. В качестве входных данных этот метод получает строку с URL-адресом конечной точки сервера, которую мы хотим достичь. URL должен иметь следующий формат, где вы должны изменить # your_server_ESP_IP # на IP-адрес ESP32, который действует как сервер, например, http.begin("http://192.168.1.78/test").
Как уже упоминалось, после запуска кода из предыдущего раздела в ESP32, который будет действовать как сервер, он должен напечатать свой локальный IP-адрес после подключения к сети WiFi. Вам просто нужно открыть последовательный монитор Arduino IDE, чтобы получить адрес и использовать его здесь.
Чтобы отправить реальный запрос, нам просто нужно вызвать метод GET для нашего объекта HTTPClient (строка int httpCode = http.GET()). Этот метод не принимает аргументов и возвращает в качестве выходных данных целое число с кодом ответа HTTP от сервера, если запрос успешно отправлен. Однако обратите внимание, что если этот вызов метода возвращает значение меньше 0, это означает, что при отправке запроса произошла ошибка. Таким образом, в случае успеха мы распечатаем код ответа HTTP и данные, возвращаемые сервером. Чтобы вывести полезную нагрузку, нам просто нужно вызвать метод getString в нашем объекте сервера. В случае ошибки мы распечатаем сообщение, чтобы предупредить пользователя.
if (httpCode > 0) {
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
}
else {
Serial.println("Error on HTTP request");
}
Чтобы завершить программу, нам нужно вызвать метод end (строка http.end()), чтобы освободить ресурсы. Вот полный код клиентской части:
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPass";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
}
void loop() {
HTTPClient http;
http.begin("http://192.168.1.78/test");
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
}
else {
Serial.println("Error on HTTP request");
}
http.end();
delay(30000);
}
Чтобы протестировать всю систему, первое, что мы должны сделать, это скомпилировать и загрузить код в устройство ESP32, которое будет действовать как сервер. После завершения процедуры вы должны открыть последовательный монитор Arduino IDE. После того, как устройство завершит подключение к сети WiFi, оно напечатает локальный IP-адрес, назначенный ему в сети. Как упоминалось ранее, вы должны использовать этот IP при указании URL-адреса сервера в клиентском коде.
После этого вы должны скомпилировать и загрузить код в устройство ESP32, которое будет действовать как клиент. Откройте также последовательный монитор, чтобы получить результаты. Если вы переходите к последовательному монитору, подключенному к устройству сервера, вы должны получить вывод, аналогичный показанному на следующем рисунке. Как видно, сообщения «Request received» выводятся при получении запросов от клиента.
Если вы проанализируете результаты, полученные для ESP32, который действует как клиент, вы должны получить что-то, подобное следующему рисунку, который показывает код состояния 200 и сообщение «Hello» с сервера.
© digitrode.ru