В этой статье мы рассмотрим как делать запросы HTTP GET и HTTP POST с помощью платы ESP8266 NodeMCU и Arduino IDE. Мы рассмотрим примеры того, как получать значения, публиковать объекты JSON, закодированные URL-адреса и многое другое.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Плата Raspberry Pi (купить на AliExpress).
- Карта MicroSD – 16 ГБ, класс 10.
- Блок питания Raspberry Pi (5 В 2,5 А).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Методы HTTP-запросов: GET и POST
Протокол передачи гипертекста (HTTP) работает как протокол запроса-ответа между клиентом и сервером. Вот пример его работы:
- ESP8266 (клиент) отправляет HTTP-запрос на Raspberry Pi, на котором запущен Node-RED (сервер);
- Сервер возвращает ответ ESP8266 (клиенту);
- Наконец, ответ содержит информацию о статусе запроса и может также содержать запрошенный контент.
HTTP GET
GET используется для запроса данных из указанного ресурса. Часто используется для получения значений из API.
Например, у вас может быть:
1 |
GET /update-sensor?temperature=value1 |
Обратите внимание, что строка запроса (name = temperature и value = value1) отправляется в URL-адресе HTTP-запроса GET.
Или вы можете использовать простой запрос для возврата значения или объекта JSON, например:
1 |
GET /get-sensor |
(При использовании HTTP GET данные видны всем, кто находится в URL-запросе.)
HTTP POST
POST используется для отправки данных на сервер для создания/обновления ресурса. Например, для публикации показаний датчиков на сервере.
Данные, отправленные на сервер с помощью POST, сохраняются в теле запроса HTTP:
1 2 3 4 |
POST /update-sensor HTTP/1.1 Host: example.com api_key=api&sensor_name=name&temperature=value1&humidity=value2&pressure=value3 Content-Type: application/x-www-form-urlencoded |
В теле запроса вы также можете отправить JSON-объект:
1 2 3 4 |
POST /update-sensor HTTP/1.1 Host: example.com {api_key: "api", sensor_name: "name", temperature: value1, humidity: value2, pressure: value3} Content-Type: application/json |
(При использовании HTTP POST данные не видны в URL-запросе. Однако, если они не зашифрованы, они все равно видны в теле запроса.)
HTTP GET/POST с ESP8266
В этом руководстве мы рассмотрим следующие сценарии:
- ESP8266 HTTP GET: Значение или запрос в URL.
- ESP8266 HTTP GET: объект данных JSON или простой текст.
- ESP8266 HTTP POST: URL-кодирование, объект данных JSON, простой текст.
Предпосылки
Прежде чем приступить к изучению этого руководства, убедитесь, что выполнены следующие предварительные условия.
Arduino-IDE: среда разработки
Мы будем программировать плату ESP8266 NodeMCU с помощью Arduino IDE, поэтому убедитесь, что у вас в ней установлено дополнение для работы с ESP8266.
Библиотека Arduino_JSON
Вам также необходимо установить библиотеку Arduino_JSON. Вы можете установить эту библиотеку в менеджере библиотек Arduino IDE. Просто перейдите в Sketch > Include Library > Manage Libraries и найдите имя библиотеки следующим образом:
Подготовка Node-RED (необязательно)
В качестве примера мы создадим веб-сервис с Raspberry Pi и Node-RED, который будет работать как веб-сервис (как API). По сути, вы будете делать запросы HTTP GET и HTTP POST к вашему Raspberry Pi, чтобы получать значения или обновлять их. Вы можете использовать любой другой веб-сервис.
Если у вас не установлен Node-RED, следуйте следующим инструкциям:
Запустив Node-RED на вашем Raspberry Pi, перейдите на IP-адрес вашего Raspberry Pi, а затем добавьте :1880.
1 |
http://raspberry-pi-ip-address:1880 |
Интерфейс Node-RED должен открыться. Вы можете просто импортировать окончательный поток:
Перейдите в Меню > Импорт и скопируйте следующее в буфер обмена, чтобы создать поток Node-RED.
1 |
[{"id":"599740b7.efde9","type":"http response","z":"b01416d3.f69f38","name":"","statusCode":"200","headers":{},"x":420,"y":689,"wires":[]},{"id":"1618a829.76f638","type":"json","z":"b01416d3.f69f38","name":"","property":"payload","action":"obj","pretty":true,"x":410,"y":809,"wires":[["d0089cc7.d25ac"]]},{"id":"c7410fa2.1c2fa","type":"debug","z":"b01416d3.f69f38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":850,"y":709,"wires":[]},{"id":"75a22f74.f1aba","type":"ui_text","z":"b01416d3.f69f38","group":"2b7ac01b.fc984","order":1,"width":0,"height":0,"name":"","label":"Sensor Name","format":"{{msg.payload}}","layout":"row-spread","x":860,"y":769,"wires":[]},{"id":"1c8f9093.8bc2bf","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"2b7ac01b.fc984","order":2,"width":0,"height":0,"gtype":"gage","title":"Temperature","label":"ºC","format":"{{value}}","min":0,"max":"38","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":850,"y":829,"wires":[]},{"id":"a5bd2706.54e108","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"2b7ac01b.fc984","order":3,"width":0,"height":0,"gtype":"gage","title":"Humidity","label":"%","format":"{{value}}","min":0,"max":"100","colors":["#0080ff","#0062c4","#002f5e"],"seg1":"","seg2":"","x":840,"y":889,"wires":[]},{"id":"105ac2cc.7b3cfd","type":"ui_gauge","z":"b01416d3.f69f38","name":"","group":"2b7ac01b.fc984","order":4,"width":0,"height":0,"gtype":"gage","title":"Pressure","label":"hPa","format":"{{value}}","min":0,"max":"1200","colors":["#b366ff","#8000ff","#440088"],"seg1":"","seg2":"","x":840,"y":949,"wires":[]},{"id":"d0089cc7.d25ac","type":"function","z":"b01416d3.f69f38","name":"JSON or URL Encoded","func":"var msg0 = { payload: msg.payload.api_key };\nvar msg1 = { payload: msg.payload.sensor };\nvar msg2 = { payload: msg.payload.value1 };\nvar msg3 = { payload: msg.payload.value2 };\nvar msg4 = { payload: msg.payload.value3 };\n\nreturn [msg0, msg1, msg2, msg3, msg4];","outputs":5,"noerr":0,"x":610,"y":809,"wires":[["c7410fa2.1c2fa"],["75a22f74.f1aba"],["1c8f9093.8bc2bf"],["a5bd2706.54e108"],["105ac2cc.7b3cfd"]]},{"id":"5d9ab0d2.66b92","type":"http in","z":"b01416d3.f69f38","name":"","url":"update-sensor","method":"post","upload":false,"swaggerDoc":"","x":200,"y":740,"wires":[["599740b7.efde9","c7410fa2.1c2fa","1618a829.76f638"]]},{"id":"7f5cf345.63f56c","type":"http response","z":"b01416d3.f69f38","name":"","statusCode":"200","headers":{},"x":540,"y":420,"wires":[]},{"id":"6530621.95b429c","type":"http in","z":"b01416d3.f69f38","name":"","url":"/get-sensor","method":"get","upload":false,"swaggerDoc":"","x":180,"y":600,"wires":[["9471d1a0.68588"]]},{"id":"5ddc9f47.4b555","type":"http response","z":"b01416d3.f69f38","name":"","statusCode":"200","headers":{},"x":540,"y":560,"wires":[]},{"id":"9471d1a0.68588","type":"function","z":"b01416d3.f69f38","name":"","func":"msg.payload = {\"value1\":24.25, \"value2\":49.54, \"value3\":1005.14};\nreturn msg;","outputs":1,"noerr":0,"x":350,"y":600,"wires":[["5ddc9f47.4b555","13aea59.7430e5a"]]},{"id":"13aea59.7430e5a","type":"debug","z":"b01416d3.f69f38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":550,"y":628,"wires":[]},{"id":"e71c7a7d.e7c598","type":"debug","z":"b01416d3.f69f38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":550,"y":500,"wires":[]},{"id":"c7807102.3f433","type":"http in","z":"b01416d3.f69f38","name":"","url":"/update-sensor","method":"get","upload":false,"swaggerDoc":"","x":190,"y":460,"wires":[["60410cde.562a34"]]},{"id":"60410cde.562a34","type":"function","z":"b01416d3.f69f38","name":"","func":"msg.payload = msg.payload.temperature;\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":460,"wires":[["e71c7a7d.e7c598","7f5cf345.63f56c"]]},{"id":"2b7ac01b.fc984","type":"ui_group","z":"","name":"SENSORS","tab":"99ab8dc5.f435c","disp":true,"width":"6","collapse":false},{"id":"99ab8dc5.f435c","type":"ui_tab","z":"","name":"HTTP","icon":"dashboard","order":1,"disabled":false,"hidden":false}] |
Другие веб-сервисы или API
В этом руководстве ESP8266 выполняет HTTP-запросы к Node-RED, но вы можете использовать эти примеры с другими сервисами, такими как ThingSpeak, IFTTT.com (сервис веб-хуков), OpenWeatherMap.org, сервер PHP и т. д. Все примеры, представленные в этом руководстве, также будут работать с другими API.
Подводя итог, чтобы сделать это руководство совместимым с любым сервисом, вам нужно найти документацию API сервиса. Затем вам нужно имя сервера (URL или IP-адрес) и параметры для отправки в запросе (URL-путь или тело запроса). Наконец, измените наши примеры для интеграции с любым API, который вы хотите использовать.
1. ESP8266 HTTP GET: значение или запрос в URL
В первом примере ESP8266 сделает запрос HTTP GET для обновления показаний в сервисе. Этот тип запроса также может использоваться для фильтрации значения, запроса значения или возврата объекта JSON.
Код ESP8266 HTTP GET с Arduino IDE
После установки необходимых дополнений и библиотек платы скопируйте следующий код в Arduino IDE, но пока не загружайте его. Вам нужно внести некоторые изменения, чтобы он заработал у вас.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
/* Rui Santos Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-http-get-post-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"; //Your Domain name with URL path or IP address with path String serverName = "http://192.168.1.106:1880/update-sensor"; // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastTime = 0; // Timer set to 10 minutes (600000) //unsigned long timerDelay = 600000; // Set timer to 5 seconds (5000) unsigned long timerDelay = 5000; 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 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading."); } void loop() { // Send an HTTP POST request depending on timerDelay if ((millis() - lastTime) > timerDelay) { //Check WiFi connection status if(WiFi.status()== WL_CONNECTED){ WiFiClient client; HTTPClient http; String serverPath = serverName + "?temperature=24.37"; // Your Domain name with URL path or IP address with path http.begin(client, serverPath.c_str()); // If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); // Send HTTP GET request int httpResponseCode = http.GET(); if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); String payload = http.getString(); Serial.println(payload); } else { Serial.print("Error code: "); Serial.println(httpResponseCode); } // Free resources http.end(); } else { Serial.println("WiFi Disconnected"); } lastTime = millis(); } } |
Настройка сетевых учетных данных
Измените следующие строки с вашими сетевыми учетными данными: SSID и пароль. Код хорошо прокомментирован, где вы должны внести изменения.
1 2 3 |
// Replace with your network credentials const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; |
Установка имени вашего сервера
Вам также необходимо ввести свое доменное имя или IP-адрес Node-RED, чтобы ESP опубликовал показания на вашем собственном сервере.
1 |
String serverName = "http://192.168.1.106:1880/update-sensor"; |
Теперь загрузите код на свою плату, и он должен сразу же заработать.
Прочитайте следующий раздел, если вы хотите узнать, как выполнить HTTP-запрос GET.
HTTP-запрос GET
В функции loop() вы фактически делаете HTTP-запрос GET каждые 5 секунд с образцами данных:
1 2 3 4 5 6 7 8 9 10 |
String serverPath = serverName + "?temperature=24.37"; // Your Domain name with URL path or IP address with path http.begin(client, serverPath.c_str()); // If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); // Send HTTP GET request int httpResponseCode = http.GET(); |
Примечание: если Node-RED требует аутентификации, раскомментируйте следующую строку и вставьте имя пользователя и пароль Node-RED.
1 2 |
// If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); |
ESP8266 делает новый запрос по следующему URL-адресу, чтобы обновить поле датчика новой температурой.
1 |
http://192.168.1.106:1880/update-sensor?temperature=24.37 |
Затем следующие строки кода сохраняют HTTP-ответ от сервера.
1 2 3 4 5 6 7 8 9 10 |
if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); String payload = http.getString(); Serial.println(payload); } else { Serial.print("Error code: "); Serial.println(httpResponseCode); } |
Тестирование работы
Когда ваша плата запустит новый скетч, откройте окно отладки Node-RED. Вы увидите, что значения выборки печатаются успешно (24.37).
2. ESP8266 HTTP GET: объект данных JSON или простой текст
В следующем примере показано, как сделать запрос HTTP GET для получения объекта JSON и декодировать его с помощью ESP8266. Многие API возвращают данные в формате JSON.
Скопируйте следующий скетч в Arduino IDE (введите свой SSID и пароль):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
/* Rui Santos Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-http-get-post-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> #include <Arduino_JSON.h> const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; //Your Domain name with URL path or IP address with path const char* serverName = "http://192.168.1.106:1880/get-sensor"; // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastTime = 0; // Timer set to 10 minutes (600000) //unsigned long timerDelay = 600000; // Set timer to 5 seconds (5000) unsigned long timerDelay = 5000; String sensorReadings; float sensorReadingsArr[3]; 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 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading."); } void loop() { // Send an HTTP POST request depending on timerDelay if ((millis() - lastTime) > timerDelay) { //Check WiFi connection status if(WiFi.status()== WL_CONNECTED){ sensorReadings = httpGETRequest(serverName); Serial.println(sensorReadings); JSONVar myObject = JSON.parse(sensorReadings); // JSON.typeof(jsonVar) can be used to get the type of the var if (JSON.typeof(myObject) == "undefined") { Serial.println("Parsing input failed!"); return; } Serial.print("JSON object = "); Serial.println(myObject); // myObject.keys() can be used to get an array of all the keys in the object JSONVar keys = myObject.keys(); for (int i = 0; i < keys.length(); i++) { JSONVar value = myObject[keys[i]]; Serial.print(keys[i]); Serial.print(" = "); Serial.println(value); sensorReadingsArr[i] = double(value); } Serial.print("1 = "); Serial.println(sensorReadingsArr[0]); Serial.print("2 = "); Serial.println(sensorReadingsArr[1]); Serial.print("3 = "); Serial.println(sensorReadingsArr[2]); } else { Serial.println("WiFi Disconnected"); } lastTime = millis(); } } String httpGETRequest(const char* serverName) { WiFiClient client; HTTPClient http; // Your IP address with path or Domain name with URL path http.begin(client, serverName); // If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); // Send HTTP POST request int httpResponseCode = http.GET(); String payload = "{}"; if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); payload = http.getString(); } else { Serial.print("Error code: "); Serial.println(httpResponseCode); } // Free resources http.end(); return payload; } |
Установка имени вашего сервера
Введите свое доменное имя или IP-адрес Node-RED, чтобы ESP запросил показания датчика, которые будут извлечены в объекте JSON.
1 |
String serverName = "http://192.168.1.106:1880/get-sensor"; |
Теперь загрузите код на свою плату.
HTTP-запрос GET (объект JSON)
В функции loop() вызовите функцию httpGETRequest() для выполнения HTTP-запроса GET:
1 |
sensorReadings = httpGETRequest(serverName); |
Функция httpGETRequest() делает запрос к адресу Node-RED http://192.168.1.106:1880/get-sensor и извлекает строку с объектом JSON.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
String httpGETRequest(const char* serverName) { WiFiClient client; HTTPClient http; // Your IP address with path or Domain name with URL path http.begin(client, serverName); // If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); // Send HTTP POST request int httpResponseCode = http.GET(); String payload = "{}"; if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); payload = http.getString(); } else { Serial.print("Error code: "); Serial.println(httpResponseCode); } // Free resources http.end(); return payload; } |
Примечание: если Node-RED требует аутентификации, раскомментируйте следующую строку и вставьте имя пользователя и пароль Node-RED.
1 2 |
// If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); |
Декодирование объекта JSON
Чтобы получить доступ к значениям, декодируйте объект JSON и сохраните все значения в массив sensorReadingsArr.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
JSONVar myObject = JSON.parse(sensorReadings); // JSON.typeof(jsonVar) can be used to get the type of the var if (JSON.typeof(myObject) == "undefined") { Serial.println("Parsing input failed!"); return; } Serial.print("JSON object = "); Serial.println(myObject); // myObject.keys() can be used to get an array of all the keys in the object JSONVar keys = myObject.keys(); for (int i = 0; i < keys.length(); i++) { JSONVar value = myObject[keys[i]]; Serial.print(keys[i]); Serial.print(" = "); Serial.println(value); sensorReadingsArr[i] = double(value); } Serial.print("1 = "); Serial.println(sensorReadingsArr[0]); Serial.print("2 = "); Serial.println(sensorReadingsArr[1]); Serial.print("3 = "); Serial.println(sensorReadingsArr[2]); |
Демонстрация HTTP GET
После загрузки кода откройте Arduino IDE, и вы увидите, что он получает следующие данные JSON:
1 |
{"value1":24.25,"value2":49.54,"value3":1005.14} |
Затем вы печатаете декодированный объект JSON в последовательном мониторе Arduino IDE.
В целях отладки запрошенная информация также выводится в окне отладки Node-RED.
3. ESP8266 HTTP POST: URL-кодирование, объект данных JSON, простой текст
Наконец, вы узнаете, как сделать HTTP-запрос POST с помощью ESP8266.
В этом примере ваш ESP8266 может делать запросы HTTP POST, используя три различных типа запросов тела: URL-кодированный, объект JSON или простой текст. Это наиболее распространенные методы, и они должны интегрироваться с большинством API или веб-сервисов.
Скопируйте следующий скетч в Arduino IDE (введите свой SSID и пароль):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
/* Rui Santos Complete project details at Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-http-get-post-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"; //Your Domain name with URL path or IP address with path const char* serverName = "http://192.168.1.106:1880/update-sensor"; // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastTime = 0; // Timer set to 10 minutes (600000) //unsigned long timerDelay = 600000; // Set timer to 5 seconds (5000) unsigned long timerDelay = 5000; 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 5 seconds (timerDelay variable), it will take 5 seconds before publishing the first reading."); } void loop() { //Send an HTTP POST request every 10 minutes 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); // If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); // Specify content-type header http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Data to send with HTTP POST String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&value1=24.25&value2=49.54&value3=1005.14"; // 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"); //int httpResponseCode = http.POST("{\"api_key\":\"tPmAT5Ab3j7F9\",\"sensor\":\"BME280\",\"value1\":\"24.25\",\"value2\":\"49.54\",\"value3\":\"1005.14\"}"); // If you need an HTTP request with a content type: text/plain //http.addHeader("Content-Type", "text/plain"); //int httpResponseCode = http.POST("Hello, World!"); Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); // Free resources http.end(); } else { Serial.println("WiFi Disconnected"); } lastTime = millis(); } } |
Установка имени вашего сервера
Введите свое доменное имя или IP-адрес Node-RED, чтобы ESP опубликовал образцы показаний датчиков.
1 |
String serverName = "http://192.168.1.106:1880/update-sensor"; |
Теперь загрузите код на свою плату.
HTTP POST URL-адрес закодирован
Чтобы сделать HTTP POST-запрос типа URL-кодированный, например так:
1 2 3 4 |
POST /update-sensor HTTP/1.1 Host: 192.168.1.106:1880 api_key=tPmAT5Ab3j7F9&sensor=BME280&value1=24.25&value2=49.54&value3=1005.14 Content-Type: application/x-www-form-urlencoded |
Вам необходимо запустить следующее в коде Arduino:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Your Domain name with URL path or IP address with path http.begin(client, serverName); // If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); // Specify content-type header http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Data to send with HTTP POST String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&value1=24.25&value2=49.54&value3=1005.14"; // Send HTTP POST request int httpResponseCode = http.POST(httpRequestData); |
Примечание: если Node-RED требует аутентификации, раскомментируйте следующую строку и вставьте имя пользователя и пароль Node-RED.
1 2 |
// If you need Node-RED/server authentication, insert user and password below //http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD"); |
HTTP POST JSON-объект
Или, если вы предпочитаете сделать HTTP-запрос POST с объектом JSON:
1 2 3 4 |
POST /update-sensor HTTP/1.1 Host: example.com {api_key: "tPmAT5Ab3j7F9", sensor_name: "BME280", temperature: 24.25; humidity: 49.54; pressure: 1005.14} Content-Type: application/json |
Используйте следующий фрагмент:
1 2 3 |
http.addHeader("Content-Type", "application/json"); int httpResponseCode = http.POST("{\"api_key\":\"tPmAT5Ab3j7F9\",\"sensor\":\"BME280\",\"value1\":\"24.25\",\"value2\":\"49.54\",\"value3\":\"1005.14\"}"); |
HTTP-обычный текст
Если вы хотите отправить простой текст или значение, используйте следующее:
1 2 3 |
http.addHeader("Content-Type", "text/plain"); int httpResponseCode = http.POST("Hello, World!"); |
Примечание: используемый нами поток Node-RED (веб-сервис) не настроен на прием простого текста, но если API, который вы планируете интегрировать, принимает только простой текст или значение, вы можете использовать предыдущий фрагмент.
Демонстрация HTTP POST
В окне отладки Node-RED вы можете увидеть, что ваш ESP отправляет HTTP-запрос POST каждые 5 секунд.
В этом примере эти значения также отправляются на 3 датчика и отображаются на панели инструментов Node-RED:
1 |
http://raspberry-pi-ip-address:1880/ui |
Подведение итогов
В этом руководстве вы узнали, как интегрировать ESP8266 с онлайн-сервисами с помощью запросов HTTP GET и HTTP POST.
HTTP GET и HTTP POST обычно используются в большинстве веб-сервисов и API. Они могут быть полезны в ваших проектах для: публикации показаний датчиков в веб-сервисе, например IFTTT, ThingSpeak; на веб-сервере ESP8266 или Raspberry Pi или на вашем собственном сервере; для запроса данных из Интернета или из вашей базы данных и многого другого.
74 просмотров