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».

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

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

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

ссылка на оригинал статьи https://habr.com/ru/post/543532/