ESP32 HTTP POST с Arduino IDE (ThingSpeak и IFTTT.com)

В этом руководстве вы узнаете, как выполнять HTTP POST запросы с помощью платы ESP32 в Arduino IDE. Мы покажем, как отправлять JSON-данные или URL-кодированные значения на два веб-API (ThingSpeak и IFTTT.com).

ESP32 HTTP POST с Arduino IDE IFTTT ThingSpeak

Рекомендуется: 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.

HTTP POST ThingSpeak ESP32

Использование ThingSpeak API

ThingSpeak имеет бесплатный API, который позволяет хранить и извлекать данные с помощью HTTP. В этом руководстве вы будете использовать API ThingSpeak для публикации и визуализации данных на графиках из любой точки мира. В качестве примера мы будем публиковать случайные значения, но в реальном приложении вы бы использовали реальные показания датчиков.

Для использования ThingSpeak API вам нужен API-ключ. Следуйте следующим шагам:

  1. Перейдите на ThingSpeak.com и создайте бесплатный аккаунт.

  2. Затем откройте вкладку Channels.

  3. Создайте New Channel (Новый канал).

ESP32 ESP8266 NodeMCU ThingSpeak создание нового канала
  1. Откройте ваш только что созданный канал и выберите вкладку API Keys, чтобы скопировать ваш Write API Key.

ESP32 ESP8266 NodeMCU ThingSpeak просмотр API ключа

Код 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 (это означает, что запрос выполнен успешно).

ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE Serial Monitor Response

Ваша панель мониторинга ThingSpeak должна получать новые случайные показания каждые 10 секунд.

ESP32 ESP8266 NodeMCU HTTP GET и HTTP POST ThingSpeak график

Для конечного приложения вам может потребоваться увеличить таймер или проверить лимиты API-вызовов в час/минуту, чтобы избежать блокировки/бана.

2. ESP32 HTTP POST (IFTTT.com)

В этом примере вы узнаете, как вызвать веб-API для отправки уведомлений по электронной почте. В качестве примера мы будем использовать API IFTTT.com. IFTTT имеет бесплатный план с множеством полезных автоматизаций.

HTTP POST IFTTT ESP32

Использование IFTTT.com Webhooks API

IFTTT расшифровывается как «If This Then That» («Если это, то то»), и это бесплатный веб-сервис для создания цепочек простых условных операторов, называемых апплетами.

IFTTT.com логотип

Это означает, что вы можете запустить событие, когда что-то происходит. В этом примере апплет отправляет три случайных значения на вашу электронную почту, когда ESP32 делает запрос. Вы можете заменить эти случайные значения полезными показаниями датчиков.

Создание аккаунта IFTTT

Если у вас нет аккаунта IFTTT, перейдите на сайт IFTTT: ifttt.com и введите вашу электронную почту для создания аккаунта и начала работы. Создание аккаунта на IFTTT бесплатно!

Далее вам нужно создать новый апплет. Следуйте следующим шагам для создания нового апплета:

  1. Откройте левое меню и нажмите кнопку «Create».

IFTTT discover создание нового апплета
  1. Нажмите на слово «this». Найдите сервис «Webhooks» и выберите иконку Webhooks.

Выбор сервиса Webhooks IFTTT.com
  1. Выберите триггер «Receive a web request» и дайте имя событию. В данном случае мы ввели «test_event». Затем нажмите кнопку «Create trigger».

  2. Нажмите на слово «that», чтобы продолжить. Теперь определите, что происходит при срабатывании определённого вами события. Найдите сервис «Email» и выберите его.

Выбор сервиса email IFTTT
  1. Затем выберите Send me an email. Вы можете оставить параметры по умолчанию.

  2. Нажмите кнопку «Create action», чтобы создать ваш апплет. Затем нажмите Continue и, наконец, Finish.

Тестирование вашего апплета

Прежде чем продолжить проект, важно сначала протестировать ваш апплет. Следуйте следующим шагам для его тестирования:

  1. Найдите сервис Webhooks или откройте эту ссылку: https://ifttt.com/maker_webhooks

  2. Нажмите кнопку «Documentation».

Документация webhooks IFTTT

Появится страница с вашим уникальным API-ключом.

IFTTT API ключ

Сохраните ваш API-ключ, так как он понадобится вам позже.

  1. Заполните раздел «To trigger an Event with 3 JSON values» именем события, созданным ранее, в нашем случае test_event. Добавьте случайные значения в поля value1, value2 и value3. Затем нажмите кнопку «Test it».

IFTTT Trigger an Event with 3 JSON values
  1. Событие должно быть успешно запущено, и вы получите зелёное сообщение «Event has been triggered».

  2. Перейдите в ваш почтовый аккаунт. Вы должны получить новое письмо от сервиса 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, указывающим, что запрос выполнен успешно.

ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE Serial Monitor Response

Перейдите в ваш почтовый аккаунт, и вы должны получить новое письмо от IFTTT с тремя случайными значениями. В данном случае: 38, 20 и 13.

ESP32 ESP8266 NodeMCU HTTP POST Arduino IDE IFTTT Response

Для демонстрационных целей мы публикуем новые данные каждые 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>`