ESP32 HTTP POST с Arduino IDE (ThingSpeak и IFTTT.com)
В этом руководстве вы узнаете, как выполнять HTTP POST запросы с помощью платы ESP32 в Arduino IDE. Мы покажем, как отправлять JSON-данные или URL-кодированные значения на два веб-API (ThingSpeak и IFTTT.com).
Рекомендуется: ESP32 HTTP GET с Arduino IDE (OpenWeatherMap.org и ThingSpeak)
Метод HTTP POST запроса
Протокол передачи гипертекста (HTTP) работает как протокол запрос-ответ между клиентом и сервером. Вот пример:
ESP32 (клиент) отправляет HTTP-запрос на сервер (например: ThingSpeak или IFTTT.com);
Сервер возвращает ответ ESP32 (клиенту);
Наконец, ответ содержит информацию о статусе запроса и может также содержать запрошенный контент.
HTTP POST
POST используется для отправки данных на сервер с целью создания/обновления ресурса. Например, публикация показаний датчиков на сервер.
Данные, отправляемые на сервер с помощью POST, хранятся в теле HTTP-запроса:
POST /update HTTP/1.1
Host: example.com
api_key=api&field1=value1
Content-Type: application/x-www-form-urlencoded
В теле запроса вы также можете отправить JSON-объект:
POST /update HTTP/1.1
Host: example.com
{api_key: "api", field1: value1}
Content-Type: application/json
(При HTTP POST данные не видны в URL-запросе. Однако, если они не зашифрованы, они всё равно видны в теле запроса.)
Предварительные требования
Прежде чем приступить к этому руководству, убедитесь, что вы выполнили следующие предварительные требования.
Arduino IDE
Мы будем программировать ESP32 с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP32.
Другие веб-сервисы или API
В этом руководстве вы узнаете, как настроить плату ESP32 для выполнения HTTP-запросов к ThingSpeak и IFTTT.com. Если вы предпочитаете локальное решение, вы можете использовать HTTP с Node-RED. Все примеры, представленные в этом руководстве, также работают с другими API.
Таким образом, чтобы сделать это руководство совместимым с любым сервисом, вам нужно найти документацию API сервиса. Затем вам понадобится имя сервера (URL или IP-адрес) и параметры для отправки в запросе (путь URL или тело запроса). Наконец, модифицируйте наши примеры для интеграции с любым API, который вы хотите использовать.
1. ESP32 HTTP POST данные (ThingSpeak)
В этом примере ESP32 выполняет HTTP POST запрос для отправки нового значения на ThingSpeak.
Использование ThingSpeak API
ThingSpeak имеет бесплатный API, который позволяет хранить и извлекать данные с помощью HTTP. В этом руководстве вы будете использовать API ThingSpeak для публикации и визуализации данных на графиках из любой точки мира. В качестве примера мы будем публиковать случайные значения, но в реальном приложении вы бы использовали реальные показания датчиков.
Для использования ThingSpeak API вам нужен API-ключ. Следуйте следующим шагам:
Перейдите на ThingSpeak.com и создайте бесплатный аккаунт.
Затем откройте вкладку Channels.
Создайте New Channel (Новый канал).
Откройте ваш только что созданный канал и выберите вкладку API Keys, чтобы скопировать ваш Write API Key.
Код ESP32 HTTP POST ThingSpeak
Скопируйте следующий скетч в вашу Arduino IDE:
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-post-ifttt-thingspeak-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Domain Name with full URL Path for HTTP POST Request
const char* serverName = "http://api.thingspeak.com/update";
// Service API Key
String apiKey = "REPLACE_WITH_YOUR_API_KEY";
// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Set timer to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Timer set to 10 seconds (10000)
unsigned long timerDelay = 10000;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
// Random seed is a number used to initialize a pseudorandom number generator
randomSeed(analogRead(33));
}
void loop() {
//Send an HTTP POST request every 10 seconds
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Data to send with HTTP POST
String httpRequestData = "api_key=" + apiKey + "&field1=" + String(random(40));
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
/*
// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");
// JSON data to send with HTTP POST
String httpRequestData = "{\"api_key\":\"" + apiKey + "\",\"field1\":\"" + String(random(40)) + "\"}";
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);*/
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
Настройка сетевых учётных данных
Измените следующие строки, указав ваши сетевые учётные данные: SSID и пароль. В коде есть комментарии, указывающие, где нужно внести изменения.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Настройка API ключа
Измените переменную apiKey, чтобы включить ваш API-ключ ThingSpeak.
String apiKey = "REPLACE_WITH_YOUR_API_KEY";
Теперь загрузите код на вашу плату, и он должен сразу заработать. Прочитайте следующий раздел, если хотите узнать, как выполняется HTTP POST запрос.
HTTP POST запрос
В loop() выполняется HTTP POST запрос с URL-кодированными данными каждые 10 секунд со случайными данными:
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Data to send with HTTP POST
String httpRequestData = "api_key=" + apiKey + "&field1=" + String(random(40));
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
Например, ESP32 выполняет URL-кодированный запрос для публикации нового значения (30) в field1.
POST /update HTTP/1.1
Host: api.thingspeak.com
api_key=api&field1=30
Content-Type: application/x-www-form-urlencoded
Или вы можете раскомментировать следующие строки, чтобы выполнить запрос с JSON-данными (вместо URL-кодированного запроса):
// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");
// JSON data to send with HTTP POST
String httpRequestData = "{\"api_key\":\"" + apiKey + "\",\"field1\":\"" + String(random(40)) + "\"}";
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
Вот пример HTTP POST запроса с JSON-данными:
POST /update HTTP/1.1
Host: api.thingspeak.com
{api_key: "api", field1: 30}
Content-Type: application/json
Затем следующие строки выводят код ответа сервера.
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
В мониторе последовательного порта Arduino IDE вы должны увидеть код HTTP-ответа 200 (это означает, что запрос выполнен успешно).
Ваша панель мониторинга ThingSpeak должна получать новые случайные показания каждые 10 секунд.
Для конечного приложения вам может потребоваться увеличить таймер или проверить лимиты API-вызовов в час/минуту, чтобы избежать блокировки/бана.
2. ESP32 HTTP POST (IFTTT.com)
В этом примере вы узнаете, как вызвать веб-API для отправки уведомлений по электронной почте. В качестве примера мы будем использовать API IFTTT.com. IFTTT имеет бесплатный план с множеством полезных автоматизаций.
Использование IFTTT.com Webhooks API
IFTTT расшифровывается как «If This Then That» («Если это, то то»), и это бесплатный веб-сервис для создания цепочек простых условных операторов, называемых апплетами.
Это означает, что вы можете запустить событие, когда что-то происходит. В этом примере апплет отправляет три случайных значения на вашу электронную почту, когда ESP32 делает запрос. Вы можете заменить эти случайные значения полезными показаниями датчиков.
Создание аккаунта IFTTT
Если у вас нет аккаунта IFTTT, перейдите на сайт IFTTT: ifttt.com и введите вашу электронную почту для создания аккаунта и начала работы. Создание аккаунта на IFTTT бесплатно!
Далее вам нужно создать новый апплет. Следуйте следующим шагам для создания нового апплета:
Откройте левое меню и нажмите кнопку «Create».
Нажмите на слово «this». Найдите сервис «Webhooks» и выберите иконку Webhooks.
Выберите триггер «Receive a web request» и дайте имя событию. В данном случае мы ввели «test_event». Затем нажмите кнопку «Create trigger».
Нажмите на слово «that», чтобы продолжить. Теперь определите, что происходит при срабатывании определённого вами события. Найдите сервис «Email» и выберите его.
Затем выберите Send me an email. Вы можете оставить параметры по умолчанию.
Нажмите кнопку «Create action», чтобы создать ваш апплет. Затем нажмите Continue и, наконец, Finish.
Тестирование вашего апплета
Прежде чем продолжить проект, важно сначала протестировать ваш апплет. Следуйте следующим шагам для его тестирования:
Найдите сервис Webhooks или откройте эту ссылку: https://ifttt.com/maker_webhooks
Нажмите кнопку «Documentation».
Появится страница с вашим уникальным API-ключом.
Сохраните ваш API-ключ, так как он понадобится вам позже.
Заполните раздел «To trigger an Event with 3 JSON values» именем события, созданным ранее, в нашем случае test_event. Добавьте случайные значения в поля value1, value2 и value3. Затем нажмите кнопку «Test it».
Событие должно быть успешно запущено, и вы получите зелёное сообщение «Event has been triggered».
Перейдите в ваш почтовый аккаунт. Вы должны получить новое письмо от сервиса IFTTT с значениями, которые вы определили на предыдущем шаге.
Если вы получили письмо с данными, введёнными в тестовом запросе, значит, ваш апплет работает как ожидалось. Теперь нам нужно запрограммировать ESP32 для отправки HTTP POST запроса к сервису IFTTT с показаниями датчиков.
Код ESP32 HTTP POST Webhooks IFTTT.com
После установки необходимых дополнений для плат и библиотек скопируйте следующий код в вашу Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он работал для вас.
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp32-http-post-ifttt-thingspeak-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Domain Name with full URL Path for HTTP POST Request
// REPLACE WITH YOUR EVENT NAME AND API KEY - open the documentation: https://ifttt.com/maker_webhooks
const char* serverName = "http://maker.ifttt.com/trigger/REPLACE_WITH_YOUR_EVENT/with/key/REPLACE_WITH_YOUR_API_KEY";
// Example:
//const char* serverName = "http://maker.ifttt.com/trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC";
// THE DEFAULT TIMER IS SET TO 10 SECONDS FOR TESTING PURPOSES
// For a final application, check the API call limits per hour/minute to avoid getting blocked/banned
unsigned long lastTime = 0;
// Set timer to 10 minutes (600000)
//unsigned long timerDelay = 600000;
// Timer set to 10 seconds (10000)
unsigned long timerDelay = 10000;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");
// Random seed is a number used to initialize a pseudorandom number generator
randomSeed(analogRead(33));
}
void loop() {
//Send an HTTP POST request every 10 seconds
if ((millis() - lastTime) > timerDelay) {
//Check WiFi connection status
if(WiFi.status()== WL_CONNECTED){
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
http.begin(client, serverName);
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Data to send with HTTP POST
String httpRequestData = "value1=" + String(random(40)) + "&value2=" + String(random(40))+ "&value3=" + String(random(40));
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
/*
// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");
// JSON data to send with HTTP POST
String httpRequestData = "{\"value1\":\"" + String(random(40)) + "\",\"value2\":\"" + String(random(40)) + "\",\"value3\":\"" + String(random(40)) + "\"}";
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
*/
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
// Free resources
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
Настройка сетевых учётных данных
Измените следующие строки, указав ваши сетевые учётные данные: SSID и пароль. В коде есть комментарии, указывающие, где нужно внести изменения.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Настройка API ключа IFTTT.com
Вставьте имя вашего события и API-ключ в следующую строку:
const char* serverName = "http://maker.ifttt.com/trigger/REPLACE_WITH_YOUR_EVENT/with/key/REPLACE_WITH_YOUR_API_KEY";
Пример URL:
const char* serverName = "http://maker.ifttt.com/trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3t";
HTTP POST запрос
В loop() выполняется HTTP POST запрос каждые 10 секунд с примерными данными:
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Data to send with HTTP POST
String httpRequestData = "value1=" + String(random(40)) + "&value2=" + String(random(40))+ "&value3=" + String(random(40));
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
ESP32 выполняет новый URL-кодированный запрос для публикации случайных значений в полях value1, value2 и value3. Например:
POST /trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC HTTP/1.1
Host: maker.ifttt.com
value1=15&value2=11&value3=30
Content-Type: application/x-www-form-urlencoded
В качестве альтернативы вы можете раскомментировать следующие строки для выполнения запроса с JSON-данными:
// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");
// JSON data to send with HTTP POST
String httpRequestData = "{\"value1\":\"" + String(random(40)) + "\",\"value2\":\"" + String(random(40)) + "\",\"value3\":\"" + String(random(40)) + "\"}";
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
Вот пример HTTP POST запроса с JSON-объектом данных.
POST /trigger/test_event/with/key/nAZjOphL3d-ZO4N3k64-1A7gTlNSrxMJdmqy3tC HTTP/1.1
Host: maker.ifttt.com
{value1: 15, value2: 11, value3: 30}
Content-Type: application/json
Затем следующие строки кода выводят HTTP-ответ от сервера.
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
Демонстрация HTTP POST
После загрузки кода откройте монитор последовательного порта, и вы увидите сообщение с кодом HTTP-ответа 200, указывающим, что запрос выполнен успешно.
Перейдите в ваш почтовый аккаунт, и вы должны получить новое письмо от IFTTT с тремя случайными значениями. В данном случае: 38, 20 и 13.
Для демонстрационных целей мы публикуем новые данные каждые 10 секунд. Однако для долгосрочного проекта вам следует увеличить таймер или проверить лимиты API-вызовов в час/минуту, чтобы избежать блокировки/бана.
Заключение
В этом руководстве вы узнали, как интегрировать ESP32 с веб-сервисами, используя HTTP POST запросы. Вы также можете выполнять HTTP GET запросы с ESP32.
Если вы используете плату ESP8266, прочитайте:
Вам также может понравиться:
Источник: :doc:`Random Nerd Tutorials - ESP32 HTTP POST with Arduino IDE (ThingSpeak and IFTTT.com) <../esp32-http-post-ifttt-thingspeak-arduino/index>`