ESP 8266: отправка данных на сайт методом Get запроса

Привет! Это мой первый пост здесь! Решил его написать, чтобы облегчить путь всем начинающим знакомство с ESP 8266.

Итак, у нас есть ESP-01.

И USB-UART преобразователь.

Лично у меня такой, но это не суть.
Можно взять и другие модули изменится лишь схема подключения.
Соединяем для прошивки:

Сразу нужно сказать о подводных камнях.

Во первых подтянуть ноги GPIO0 и EXT_RSBT к питанию резистором на 10кОм.
Во вторых, для общения с модулем необходимо отключать линии RTS и DTR.

В третьих, напряжение питания модуля ESP-01 – 3,3В. Поэтому для питания необходим источник 3,3В.

Изначально я хотел использовать 3,3В с USB-UART преобразователя, но как оказалось он не может выдать ток 220мА необходимый для работы ESP-01.

Поэтому пришлось использовать стабилизатор на lm1117-3,3. Итак, для работы с ESP-01 можно использовать программу ESPlorer на языке Lua или Arduino.

Пока я пойду по пути наименьшего сопротивления – выбираю Arduino IDE.
Чтобы работать с платами esp8266 необходимо их установить.
Как это сделать расписано на многих ресурсах поэтому на этом останавливаться не буду.
Итак, открываем <Инструменты> и выбираем Generic ESP8266 Module.

Далее вставляем скетч.

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h> 
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
boolean recievedFlag;
String strData, Link;

//Вводим параметры своей точки доступа WIFI 
const char *ssid = "**************";                           //Название точки доступа
const char *password = "*************";                           //Пароль точки доступа 
const char *host = "**********************************";       //Адрес нашего веб сервера
const int httpsPort = 443;                                    //Адрес порта для HTTPS= 443 или HTTP = 80
const char fingerprint[] PROGMEM = "5B:FB:D1:D4:49:D3:0F:A9:C6:40:03:34:BA:E0:24:05:AA:D2:E2:01";    //ключ для шифрования

// Обьявление функции подключения к точкt доступа WIFI 
void setup() {
 delay(1000);                                                 //Ждем
 Serial.begin(9600);                                          //Настройка скорости UART
 WiFi.mode(WIFI_OFF);                                         //Перезапуск точки доступа
 delay(1000);                                                 //Ждем
 WiFi.mode(WIFI_STA);                                         //Настраиваем ESP в режиме клиента
 WiFi.begin(ssid, password);                                  //Подключаемся к точке доступа
 Serial.println("");
 Serial.print("Connecting");                                  //Пишем в UART что соединяемся
 // Ждем соединения
 while (WiFi.status() != WL_CONNECTED) {delay(500);
 Serial.print(".");}                                          //Пока пытаемся соединиться отправляем в UART точки
 Serial.println("");                                          //Если удачно подключились
 Serial.print("Connected to ");                               //Пишем в UART:
 Serial.println(ssid);                                        //Название точки доступа
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());                              //IP адрес назначенный нашему ESP
}

// Обьявление функции передачи данных
void transmit() {
 WiFiClientSecure httpsClient;                                //Обьявляем обьект класса WiFiClient
 Serial.println(host);                                        //Пишем в UART: адрес нашего веб сервера,
 Serial.printf("Using fingerprint '%s'\n", fingerprint);      //Ключ для шифрования.
 httpsClient.setFingerprint(fingerprint);                     //Присваиваем значения ключа для шифрования
 httpsClient.setTimeout(15000);                               //Присваиваем значение паузы (15 секунд)
 delay(1000);                                                 //Ждем                                     
 Serial.print("HTTPS Connecting");                            //Пишем в UART: Соединяемся с нашим веб сервером
 int r=0;                                                     //Обьявляем переменную счетчика попыток подключения
 while((!httpsClient.connect(host, httpsPort)) && (r < 30))
 {delay(100);Serial.print(".");r++;}                          //Пока пытаемся соединиться с веб сервером отправляем в UART точки
 if(r==30) {Serial.println("Connection failed");}             //Если не получилось соединиться пишем в UART, что не получилось  
 else {Serial.println("Connected to web");}                   //Если получилось соединиться пишем в UART, что получилось  
 Link = "/get.php?" + strData;                                //Формируем строку для GET запроса
 Serial.print("requesting URL: ");                            //Пишем в UART что отправляем GET запрос
 Serial.println(host+Link);                                   //Пишем в UART GET запрос
 httpsClient.print(String("GET ") + Link + " HTTP/1.1\r\n" +  
 "Host: " + host + "\r\n" + 
 "Connection: close\r\n\r\n");                                //Отправляем GET запрос через ESP
 Serial.println("request sent");                              //Пишем в UART что GET запрос отправлен
 while (httpsClient.connected())                              //Ловим ответ веб сервера
 {String line = httpsClient.readStringUntil('\n');
 if (line == "\r") {Serial.println("headers received");break;}}
 Serial.println("reply was:");                                //Пишем в UART что веб сервер ответил
 Serial.println("==========");                                //Для красоты выводим в UART разграничивающую линию
 String line;                                                 //Формируем строку для ответа веб сервера
 while(httpsClient.available()){                              //Ловим строку от веб сервера
 line = httpsClient.readStringUntil('\n');                    
 Serial.println(line);}                                       //Пишем в UART строку от веб сервера
 Serial.println("==========");                                //Для красоты выводим в UART разграничивающую линию
 Serial.println("closing connection");}                       //Пишем в UART, что закрыли соединение с веб сервером
 
//Основная функция
void loop() {
  while (Serial.available() > 0)                              // Прием данных из UART для передачи на  веб сервер
  { strData +=(char)Serial.read();                            // Забиваем строку принятыми данными
    recievedFlag = true; delay(2); };                         // Поднимаем флаг что получили данные
  if (recievedFlag)                                           // Если данные получены   
  { Serial.println(strData);                                  // Пишем в UART строку для передачи на  веб сервер
    transmit();                                               // Запускаем функцию передачи данных
    strData ="";                                              // Очищаем строку от принятых данных
    recievedFlag = false;}                                    // Опускаем флаг
}

Закомментировал каждую строчку. Поэтому думаю что особых вопросов возникнуть не должно.
Если кратко: Подключаемся к точке доступа Wi-Fi / Подключаемся к серверу / Отправляем данные принятые из UART.

Особо хотел остановиться на строчке:
const char fingerprint[] PROGMEM = "5B:FB:D1:D4:49:D3:0F:A9:C6:40:03:34:BA:E0:24:05:AA:D2:E2:01"; //ключ для шифрования.

Т.к. мы используем защищенный протокол HTTPS для общения с вашим сайтом необходимо использовать «ключ для шифрования».

Чтобы его получить переходим на сайт: https://www.grc.com/fingerprints.htm

Вставляем в поле название своего хоста и жмем кнопку “Fingerprint Site”.

Вставляем полученный ключ в скетч, компилируем и загружаем.

Открываем монитор порта и видим:

Ура! Наш Esp подключился к точке доступа.

Теперь пишем в верхней строке «id=123456789» и жмем кнопку «Отправить». Обратите внимание чтобы внизу были выставлены такие же настройки «Нет конца строки» и «9600 бод» .

Но для того чтобы сайт принял запрос, сайт нужно сначала создать.

Итак для начала я нашел бесплатный хостинг «https://www.000webhost.com».

Это не реклама. Просто не все бесплатные хосты пропускают Get запросы (Пару раз обжегся).
Итак после регистрации получаем свой сайт.

Нажимаем кнопку «Управлять сайтом» и…

… переходим в панель управления.

Заходим в «Менеджер файлов».

Здесь переходим в папку «public_html».

Щелкаем по кнопке «New File» и создаем два файла.

Файл test.txt оставляем без изменений (сюда будут приходить наши передаваемые данные).

Открываем файл «get.php» и вставляем туда следующий код:

<?php
  $var1= $_GET['id'];
  
  $fileContent = "Registrated id= ".$var1."\n";
  
  $fileStatus = file_put_contents('test.txt',$fileContent,FILE_APPEND);
  if($fileStatus != false)
  {
     echo "SUCCESS: data written to file";
	}
	else
	{
	echo "FAIL: could not write to file";
	}
	?>

Закрываем и сохраняем.
Теперь пробуем отправку.

Если всё правильно настроено то мы должны получить ответ: «SUCCESS: data written to file».

Теперь можете открывать файл test.txt….

и радоваться успешной передаче данных.

Также просмотреть файл test.txt можно из браузера. Набираем в адресной строке «Название сайта/test.txt».

Вот как-то так.

Данный проект является основой. К нему можно прикрутить всевозможные датчики, платы, модули. На стороне веб сервера подключить таблицы, базы данных и т.д.

На этом пока все. Прошу сильно не пинать т.к. - мой первый пост. Удачи!

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 20

    +9
    Почему не POST? было бы логичнее. «Отправка данных методом GET» от этого словосочетания глаза щиплет.
      +1
      По поводу использования GET для посылки данных — оставлю здесь одну старую историю, почему так делать нельзя
      Не используйте GET запросы для операций, изменяющих состояние. Многие веб-разработчики узнали это на собственном горьком опыте в 2005 году, когда был публично выпущен Google Web Accelerator. Это приложение прошло по всему контенту, для которого были назначены ссылки, что является законным для HTTP GET запросов, потому что они должны быть безопасными. К сожалению, многие веб-разработчики проигнорировали HTTP соглашение и разместили простые ссылки для «удалить» или «добавить в корзину» в своих приложениях. Начался хаос.
      Одна из компаний посчитала, что их система управления контентом была целю повторяющихся атак, потому что все содержимое снова и снова удалялось. Позже они выяснили, что поисковой робот натолкнулся на URL административной страницы и прошел по всем ссылкам для удаления.

      (цитирую по книге А.Фримена про ASP.NET MVC Framework)
        +1

        Непонятно, как это сработало, там авторизации не было что ли?

          +1
          Если разработчики не понимают разницу между POST и GET, то есть шанс, что они и про авторизацию не в курсе. Или просто могли сделать авторизацию через GET («Кликай тут, но только если ты реально админ»).
      +6

      Ох, кажется мне, могут прилететь минуса за довольно низкий технический уровень материала(


      Ну например, что значит вот это?


      "Просто не все бесплатные хосты пропускают Get запросы (Пару раз обжегся)."
        0
        Тоже стало интересно. Что за хостинг такой, который не может предоставлять этого самого хостинга.
        0
        Для использования публичного сервиса не плохо было бы какую ни будь авторизацию прикрутить.
          +4
          1. Может быть не все бесплатные хостинг дают возможность использовать PHP? Без GET запроса то не запросить индексную страницу, а это в 95% случаев и требуется от хостингов.


          2. Как уже правил но написали, лучше использовать POST для отправки данных, GET может иметь проблемы с кешированием.


          3. Не никакой авторизации, тоже писали выше


          4. Статья и подход на уровне, да нет тут никакого уровня, что-то склепали на коленке и оно заработало. На Хабре надо наоборот изучать качественные материалы, чтобы не городить подобное.


          5. Зачем городить огород из костылей, если можно было использовать MQTT протокол с кучей проверенных реализаций, защитой канала, улучшенной работой в некачественных каналах, 2х сторонней связью и ещё кучей фишек?


            +1
            Зачем городить огород из костылей, если можно было использовать MQTT протокол с кучей проверенных реализаций, защитой канала, улучшенной работой в некачественных каналах, 2х сторонней связью и ещё кучей фишек?


            Я тоже очень люблю MQTT, но здесь похоже не тот случай. MQTT гораздо сложнее в реализации. Во-первых нужен брокер. Бесплатные все куда-то деваются и имеют кучу ограничений. Свой на бесплатном хостинге его не поднять, да и тоже требует каких то знаний. Во-вторых, сложность серверной части. Уж парой строк на PHP не обойтись.
            С точки зрения быстрого старта новичка HTTP протокол совсем не плох. Хотя еще лучше какой ни будь Блинк использовать. За пять минут получаем красивое управление с телефона.
              0
              Бесплатные все куда-то деваются и имеют кучу ограничений.

              Если вам не фильмы качать через него, а чисто для себя держать пару девайсов — амазоновский AWS IoT Core, кажись, выльется в пару баксов в год (на момент написания: 1 USD за миллион сообщений, 0.042 USD за одно устройство за календарный год круглосуточного онлайна, пинги бесплатно, реестр устройств, если нужен — 1.25 за миллион операций по килобайту).

                +1
                Если укладываться в 100000 сообщений/месяц, то у пока Yandex Cloud бесплатно.
                cloud.yandex.ru/docs/iot-core/pricing
                Но если сервис будет востребован, то в один прекрасный момент они поменяют тарифы. Или введут ограничение на размер, количество в час и пр.
                А если не востребован, то прикроют лавочку.
              0
              Здравствуйте, недели 3 я уже пытаюсь отправить запрос на сайт. Облазил весь интернет в поисках информации. Сайт и есп проверил работают, а запрос все не доходит. Я грешу на есп так-как если вручную в браузер запрос вбить то все работает. Если вы разбираетесь в данной теме то помогите пожалуйста.
                0
                1. Ну я бы сразу же смотрел в сторону ssl, так как могут был проблемы с его реализацией в esp


                2. Далее, смотреть в сторону GET и POST, для поста есть несколько способов инкапсуляции данных, отправляемых на сервер (см. ContentType)


                3. Можно локально поднять ngrok и настроить esp на отправку данных на него, а ngrok чтобы отправлял на сайт. Тогда можно будет посмотреть, что и как отправляет esp.


              +3

              Здесь ужасно все, от реализации до безопасности. Почему этот пост имеет положительный рейтинг?


              А потом мы удивляемся, чего это столько дыр и ботнетов на IoT устройствах.

                +2

                Да потому что буква S в аббревиатуре IoT означает именно Security...

                +2

                Как-то не очень понимаю, зачем эта статья и нужна.
                Открываем примеры к ESP 8266 в самой же Arduino IDE, там готовые примеры и Get, и Post, и не только HTTP.
                Плюс не рекомендую использовать практику прямого указания параметров WiFi-точки, потому как код выложится куда-нибудь и пароль забудется внутри. Да и плюс если изменится точка доступа, придется перешивать. В качестве альтернативы предлагаю использовать WiFiManager.

                  0
                  Что-то кучно пошли статьи «своеобразного» технического уровня в хаб «умный дом» (((
                  То ли с модерацией что-то случилось, то ли весна близко…

                  А по теме — большая часть статьи — изобретение велосипеда и решение проблем, которых вообще бы не возникло, если бы взять одно из готовых решений. С т.з. железа — что-то со встроенным usb-uart типа NodeMCU, с т.з. прошивки — Tasmota, Espeasy или Esphome, с т.з. протоколоа — MQTT. Ну и совершенно непонятна конечная цель всех этих мучений.
                    0
                    Хардкодить параметры — такое себе удовольствие. Если что то изменится в подключении, например сертификат сайта обновится от Lets Encrypt(при обновлении меняется fingerprint), то перепрошивать? Есть же EEPROM контроллера, в которой можно хранить нужные параметры, которые можно легко изменять подключившись например к порту.
                      +1
                      Вы правы. Сейчас работаю над отправкой настроек сети через UART и сохранением в EEPROM.
                      Но это материал для следующего поста.)
                      +1
                      Что-то часть статьи, связанная с безопасностью, как-то не проработана. Хотелось бы более подробного объяснения что там, как и для чего делается (fingerprint, grc.com и т. д.) и какой уровень безопасности достигается.

                      Или не достигается?

                      Only users with full accounts can post comments. Log in, please.