ESP8266 NodeMCU HTTP POST с Arduino IDE (ThingSpeak и IFTTT.com)
В этом руководстве вы узнаете, как выполнять HTTP POST запросы с помощью платы ESP8266 NodeMCU в Arduino IDE. Мы покажем, как отправлять данные в формате JSON или URL-encoded значения на два веб-API (ThingSpeak и IFTTT.com).
Рекомендуется: ESP8266 NodeMCU HTTP GET с Arduino IDE (OpenWeatherMap.org и ThingSpeak)
Метод HTTP POST запроса
Протокол передачи гипертекста (HTTP) работает как протокол запрос-ответ между клиентом и сервером. Вот пример:
ESP8266 (клиент) отправляет HTTP-запрос на сервер (например: ThingSpeak или IFTTT.com);
Сервер возвращает ответ ESP8266 (клиенту);
Наконец, ответ содержит информацию о статусе запроса и может также содержать запрошенный контент.
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
Мы будем программировать ESP8266 NodeMCU с помощью Arduino IDE, поэтому убедитесь, что у вас установлено дополнение ESP8266.
Другие веб-сервисы или API
В этом руководстве вы узнаете, как настроить плату ESP8266 NodeMCU для выполнения HTTP-запросов к ThingSpeak и IFTTT.com. Если вы предпочитаете работать с локальным решением, вы можете использовать HTTP с Node-RED. Все примеры, представленные в этом руководстве, также работают с другими API.
В общих чертах, чтобы адаптировать это руководство для любого сервиса, вам нужно найти документацию API сервиса. Затем вам понадобится имя сервера (URL или IP-адрес) и параметры для отправки в запросе (URL-путь или тело запроса). Наконец, измените наши примеры для интеграции с любым API, которое вы хотите использовать.
1. ESP8266 HTTP POST данные (ThingSpeak)
В этом примере ESP8266 выполняет HTTP POST запрос для отправки нового значения на ThingSpeak.
Использование ThingSpeak API
ThingSpeak имеет бесплатный API, который позволяет хранить и извлекать данные с помощью HTTP. В этом руководстве вы будете использовать ThingSpeak API для публикации и визуализации данных в графиках из любого места. В качестве примера мы будем публиковать случайные значения, но в реальном приложении вы бы использовали реальные показания датчиков.
Чтобы использовать ThingSpeak API, вам нужен API-ключ. Выполните следующие шаги:
Перейдите на ThingSpeak.com и создайте бесплатный аккаунт.
Затем откройте вкладку Channels.
Создайте New Channel (Новый канал).
Откройте ваш только что созданный канал и выберите вкладку API Keys, чтобы скопировать ваш Write API Key.
Код ESP8266 HTTP POST ThingSpeak
Скопируйте следующий скетч в вашу Arduino IDE:
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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.
Code compatible with ESP8266 Boards Version 3.0.0 or above
(see in Tools > Boards > Boards Manager > ESP8266)
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.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 = "7HQJM49R8JAPR";
// 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(0));
}
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-encoded данными каждые 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);
Например, ESP8266 выполняет URL-encoded запрос для публикации нового значения (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-encoded запроса):
// 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 в час/минуту, чтобы избежать блокировки/бана.
Примечание: для более простого способа отправки показаний датчиков на ThingSpeak с помощью ESP8266 мы рекомендуем следующее руководство:
2. ESP8266 HTTP POST (IFTTT.com)
В этом примере вы узнаете, как вызвать веб-API для отправки email-уведомлений. В качестве примера мы будем использовать API IFTTT.com. IFTTT имеет бесплатный план с множеством полезных автоматизаций.
Использование IFTTT.com Webhooks API
IFTTT расшифровывается как «If This Than That» (Если Это, То То), и это бесплатный веб-сервис для создания цепочек простых условных операторов, называемых апплетами.
Это означает, что вы можете вызвать событие, когда что-то происходит. В этом примере апплет отправляет три случайных значения на вашу электронную почту, когда ESP8266 выполняет запрос. Вы можете заменить эти случайные значения полезными показаниями датчиков.
Создание аккаунта IFTTT
Если у вас нет аккаунта IFTTT, перейдите на сайт IFTTT: ifttt.com и введите свой email для создания аккаунта и начала работы. Создание аккаунта на IFTTT бесплатно!
Далее вам нужно создать новый апплет. Выполните следующие шаги для создания нового апплета:
Откройте левое меню и нажмите кнопку «Create» (Создать).
Нажмите на слово «this». Найдите сервис «Webhooks» и выберите иконку Webhooks.
Выберите триггер «Receive a web request» (Получить веб-запрос) и дайте имя событию. В данном случае я ввел «test_event». Затем нажмите кнопку «Create trigger» (Создать триггер).
Нажмите на слово «that», чтобы продолжить. Теперь определите, что происходит, когда срабатывает определенное вами событие. Найдите сервис «Email» и выберите его. Вы можете оставить параметры по умолчанию.
Нажмите кнопку «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 со значениями, которые вы определили на предыдущем шаге.
Если вы получили email с данными, введенными в тестовом запросе, это означает, что ваш апплет работает как ожидалось. Теперь нам нужно запрограммировать ESP8266 для отправки HTTP POST запроса на сервис IFTTT с показаниями датчиков.
Код ESP8266 HTTP POST Webhooks IFTTT.com
После установки необходимых дополнений для плат и библиотек, скопируйте следующий код в вашу Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он работал для вас.
/*
Rui Santos
Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-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.
Code compatible with ESP8266 Boards Version 3.0.0 or above
(see in Tools > Boards > Boards Manager > ESP8266)
*/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.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(0));
}
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);
ESP8266 выполняет новый URL-encoded запрос для публикации случайных значений в полях 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 в час/минуту, чтобы избежать блокировки/бана.
Заключение
В этом руководстве вы узнали, как интегрировать ESP8266 с веб-сервисами, используя HTTP POST запросы. Вы также можете выполнять HTTP GET запросы с ESP8266.
Если вы используете плату ESP32, прочитайте:
Вам также может быть интересно: