• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Отправка get запроса на свой сайт

ave

New member
Прочитал темы:
1. Решено - отправка get запроса на сайт
2. Решено - простая передача данных

И ничего не помогло. Проблема с отправкой данных на свой сайт (хостинг) осталась.
Перепробовал все варианты, ничего не работает. Может, кто знает в чем проблема.
У меня сайт с сертификатом на https. Проверил сертификат - выдает ок.
Код:
const char *apikey = "********************";      // ключик от thingsspeak.com
const char *host_thingspeak = "api.thingspeak.com";
const char *host_zxlogin = "zxlogin.com";
//const char *host_zxlogin = "www.zxlogin.com";
const char *fingerprint_zxlogin = "d0 e8 a5 b3 ab 76 de 37 30 57 6e 91 cf 4d 81 59 05 2e e3 22";    //zxlogin.com отпечаток сертификата
const int httpsPort = 443;
const int httpPort = 80;

Serial.print("Connecting to: ");
    Serial.println(host_zxlogin);
    if (client.connect(host_zxlogin,httpsPort)) {
      Serial.println("Connected");
      if (client.verify(fingerprint_zxlogin,host_zxlogin)) Serial.println("Certificate ok"); else Serial.println("Certificate error");
    } else {
      Serial.println("Connection failed");
    }
Код:
Connecting to: zxlogin.com
Connected
Certificate ok
Сделал для теста простую функцию - изменить одну ячейку в базе, если файл вызывается. И даже файл не вызывается - база не меняется.
PHP:
<?
include 'con.php';
mysql_query('UPDATE ttt SET t1=1 WHERE id=1');
mysql_close();
?>
1. https://zxlogin.com/zxtt.php?t1=18.62&t2=19.56
2. http://zxlogin.com/zxtt.php?t1=18.62&t2=19.56
Строки из браузера нормально записывают параметры.
Я там уже и GET и POST обработку добавил.
PHP:
<?
if (isset($_GET['t1']) && isset($_GET['t2'])){
    $t1 = (int)$_GET["t1"];
    $t2 = (int)$_GET["t2"];
    include 'con.php';
    mysql_query('UPDATE ttt SET t1='.$t1.', t2='.$t2.' WHERE id=1');
    mysql_close();
}

if (isset($_POST['t1']) && isset($_POST['t2'])){
    $t1 = (int)$_POST["t1"];
    $t2 = (int)$_POST["t2"];
    include 'con.php';
    mysql_query('UPDATE ttt SET t1='.$t1.', t2='.$t2.' WHERE id=1');
    mysql_close();
}
?>
Ну, и сами функции отправки:
Код:
void sendServer(int state) {
  Serial.print("Connecting to ");
  Serial.println(host_zxlogin);

  WiFiClient client;      // Use WiFiClient class to create TCP connections

  if (!client.connect(host_zxlogin,httpPort)) {
    Serial.println("Connection failed");
    return;
  }

  Serial.println("Connected");

  // Создаем URI для запроса
  String url = "/zxtt.php?t1="+(String)ft1+"&t2="+(String)ft2;

  Serial.print("Sending URL: ");
  Serial.print(host_zxlogin);
  Serial.println(url);

  // отправляем запрос на сервер
  client.print(String("GET ")+url+" HTTP/1.1\r\nHost: "+host_zxlogin+"\r\nConnection: close\r\n\r\n");

/*
  client.print("GET /zxtt.php?t1=");
  client.print(t1);
  client.print("&t2=");
  client.print(t2);
  client.println(" HTTP/1.1");
  client.print("Host:");
  client.println(host_zxlogin);
  client.println("Connection: close");
  client.println();
  client.println();
*/
  client.flush();     // ждем отправки всех данных
  client.stop();
  Serial.println("Closing connection");
  Serial.println();
}

void sendServer2(int state) {
  Serial.print("Connecting to ");
  Serial.println(host_thingspeak);

  WiFiClient client;      // Use WiFiClient class to create TCP connections

  if (!client.connect(host_thingspeak,httpPort)) {
    Serial.println("Connection failed.");
    return;
  }

  Serial.println("Connected.");
  // Создаем URI для запроса
  String url = "/update?key="+(String)apikey+"&field1="+(String)ft1+"&field2="+(String)ft2+"&field3="+(String)state;

  Serial.print("Sending URL: ");
  Serial.print(host_thingspeak);
  Serial.println(url);

  // отправляем запрос на сервер
  client.print(String("GET ")+url+" HTTP/1.1\r\nHost: "+host_thingspeak+"\r\nConnection: close\r\n\r\n");
  client.flush();     // ждем отправки всех данных
  client.stop();
  Serial.println("Closing connection");
  Serial.println();
}
На thingspeak.com данные приходят, а на а мой сайт нет. Даже сам файл zxtt.php не вызывается.
 
Последнее редактирование:

Sr.FatCat

Member
@ave, логи сервера еще посмотрите. Я столкнулся с такой же проблемой, правда на Меге, к которой ЕСП-шка подцеплена по АТ-командам.
 

Atom

Member
попробуй вот ютот код.
Код:
#include <Arduino.h>
#include <ESP8266HTTPClient.h>
#include "types.h"


const char* c_didnt_conn  PROGMEM=  "didn't connected";
const char* c_http_header PROGMEM="GET %s HTTP/1.1\r\nHost: %s \r\nUser-Agent: node\r\nConnection: close\r\n\r\n";

uint8_t client_web_send(String connStr, boolean waitAnswer){

  //
  //  Из глобальной конфигурации идет адрес гейтвея (sGW), как адрес сервера.
  //  Порт идет, как порт по умолчанию устройства управления MQTT.
  //  Необходимо так же расширить строку соединения (sConnStr).


  WiFiClientSecure client;


  IPAddress ip(192,168,1,1); ip.fromString(sGW.c_str());
  //Serial.print("try to connect to ");Serial.println(ip);
 
  if (!client.connect(ip, gparams.options.mqtt.http_port)){

    Serial.println(c_didnt_conn);
    return 0;
  }
 
  int i = sprintf(tmp, c_http_header, connStr.c_str(), sGW.c_str()); tmp[i] = 0;
  client.print(tmp);
  //Serial.println(tmp);

  //Serial.println("request sent");
  String line;
  while (client.connected()) {
    line = client.readStringUntil('\n');
    if (line == "\r") {
      //Serial.println("headers received");
      //Serial.printf("head:\"%s\"\r\n", line.c_str());
      delay(0);
      break;
    }
  }
  if (waitAnswer)
  {
   
    //следующей строкой должно передать размер в шеснадцатиричной форме
    while (client.connected()) {
      line = client.readStringUntil('\n');   
      //Serial.printf("head2:\"%s\"\r\n", line.c_str());
      i = strtol(line.c_str(), NULL, 16);
      Serial.printf("head2-l:%d\r\n", i);
      delay(0);
      break;
    }
    //теперь нужно прочитать количество байт, установленное в i
    //line = client.readStringUntil('>');
    //Serial.printf("data:\"%s\"\r\n", line.c_str());
    tmp[0] = 0;
    if (i < _CFG_TMP_SIZE){
      client.readBytes(tmp, i);
      tmp[i] = 0;
      Serial.printf("data:\"%s\"\r\n", tmp);
    }
    delay(0);
    return i; //вернуть размер
  }

  //client.stop();
  return 0;

}


У меня работает по https.
 

ave

New member
У меня в лог хостинга приходит от модуля:
Код:
GET /zxtt.php?t1= 16.9&t2= 16.8 HTTP/1.0" 301 240 "-" "-
GET /zxtt.php?t1=17.37&t2=17.37 HTTP/1.0" 301 258 "-" "-
GET /zxtt.php?t1=17.31&t2=17.31 HTTP/1.0" 301 257 "-" "node
От строки в браузере:
Код:
GET /zxtt.php?t1=18.62&t2=19.56 HTTP/1.0" 200 4 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Пробовал такие варианты:
Код:
//const char *host_zxlogin = "zxlogin.com";
const char *host_zxlogin = "www.zxlogin.com";

WiFiClient client;
if (!client.connect(host_zxlogin,httpPort)) {         // httpsPort
    Serial.println("Connection failed");
    client.stop();
    return;
}
Serial.println("Connected");

// Создаем запрос
//String url = "https://www.zxtt.php?t1="+(String)ft1+"&t2="+(String)ft2;
//client.print(url);
String url = "/zxtt.php?t1="+(String)ft1+"&t2="+(String)ft2;
client.print(String("GET ")+url+" HTTP/1.0\r\nHost: "+host_zxlogin+"\r\nConnection: close\r\n\r\n");
//client.print(String("GET ")+url+" HTTP/1.0\r\nHost: "+host_zxlogin+"\r\nUser-Agent: node\r\nConnection: close\r\n\r\n");
Проблема не решилась.

Код ответа 301.
Существует большое количество кодов для обозначения редиректа. Укажем здесь основные, наиболее важные для поисковых систем: 301 «постоянное перенаправление». Означает, что страница перемещена навсегда. Этот редирект используется чаще всего.
В случае если адрес страницы изменился навсегда, что происходит, например, при редизайне или реструктуризации сайта, 301 редирект позволяет сохранить входящие внешние ссылки за счет переклейки их веса на новые адреса страниц. Яндекс обрабатывает этот редирект очень долго, может пройти до года, прежде чем страницы склеятся.

301 Moved Permanently — запрошенный документ был окончательно перенесен на новый URI, указанный в поле Location заголовка. Некоторые клиенты некорректно ведут себя при обработке данного кода. Появился в HTTP/1.0.
Список кодов состояния HTTP — Википедия

Непонятно почему у меня от модуля на хостинге редирект происходит.
У меня на хостинге для работы SSL присутствует файл .htaccess - мажет в нем проблема?
Код:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteRule ^(.*) https://zxlogin.com/$1 [L,R=301]
Еще на рабочем столе создал тестовый файл vbs - посылка из него меняет базу.
Кстати, для этих файлов можно сделать иконки на рабочем столе включение/выключение чего-либо.
Код:
Dim oXMLHTTP
Dim oStream
Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0")
oXMLHTTP.Open "GET", "https://zxlogin.com/zxtt.php?t1=30&t2=20", False
oXMLHTTP.Send
 

Вложения

Последнее редактирование:

ave

New member
Нашел свою ошибку.
В функции sendServer() нужно было убрать WiFiClient client; так как для https используется WiFiClientSecure client; и он установлен глобально вне функции. Thingspeak также работает и по https.
Спасибо за советы. Без подсказок, особенно "посмотреть в логи сервера", я бы не разобрался. Для меня все это ново.

И форум просто бомбезный, мне очень понравилась функция в заголовке темы "Решено". :)

Работает с такой конфигурацией:
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClientSecure.h>
//#include <WiFiClient.h>

ESP8266WebServer server(80);
WiFiClientSecure client;

const char *host = "site.com";
const int httpsPort = 443;

void sendServer() {
  //WiFiClient client;

  if (!client.connect(host,httpsPort)) {
    Serial.print(host);
    Serial.println(" - Connection failed.");
    client.stop();
    return;
  }

  String url = "/zxtt.php?t1="+(String)ft1+"&t2="+(String)ft2;

  Serial.print("Sending URL: ");
  Serial.print(host);
  Serial.println(url);

  client.print(String("GET ")+url+" HTTP/1.1\r\nHost: "+host+"\r\nConnection: close\r\n\r\n");
  client.flush();     // ждем отправки всех данных
  client.stop();
}
P.S.
Остался еще один вопрос.
Я закомментировал #include <ESP8266HTTPClient.h> и HTTPClient http;
Если работает без них, зачем они тогда нужны?

P.S.S.
451 Unavailable For Legal Reasons — доступ к ресурсу закрыт по юридическим причинам, например, по требованию органов государственной власти или по требованию правообладателя в случае нарушения авторских прав. Введено в черновике IETF за авторством Google[11], при этом код ошибки является отсылкой к роману Рэя Брэдбери «451 градус по Фаренгейту». Был добавлен в стандарт 21 декабря 2015.[21]
Список кодов состояния HTTP — Википедия
:)
 
Последнее редактирование:
Нашел свою ошибку.
В функции sendServer() нужно было убрать WiFiClient client; так как для https используется WiFiClientSecure client; и он установлен глобально вне функции. Thingspeak также работает и по https.
Спасибо за советы. Без подсказок, особенно "посмотреть в логи сервера", я бы не разобрался. Для меня все это ново.

И форум просто бомбезный, мне очень понравилась функция в заголовке темы "Решено". :)

Работает с такой конфигурацией:
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiClientSecure.h>
//#include <WiFiClient.h>

ESP8266WebServer server(80);
WiFiClientSecure client;

const char *host = "site.com";
const int httpsPort = 443;

void sendServer() {
  //WiFiClient client;

  if (!client.connect(host,httpsPort)) {
    Serial.print(host);
    Serial.println(" - Connection failed.");
    client.stop();
    return;
  }

  String url = "/zxtt.php?t1="+(String)ft1+"&t2="+(String)ft2;

  Serial.print("Sending URL: ");
  Serial.print(host);
  Serial.println(url);

  client.print(String("GET ")+url+" HTTP/1.1\r\nHost: "+host+"\r\nConnection: close\r\n\r\n");
  client.flush();     // ждем отправки всех данных
  client.stop();
}
P.S.
Остался еще один вопрос.
Я закомментировал #include <ESP8266HTTPClient.h> и HTTPClient http;
Если работает без них, зачем они тогда нужны?

P.S.S.
451 Unavailable For Legal Reasons — доступ к ресурсу закрыт по юридическим причинам, например, по требованию органов государственной власти или по требованию правообладателя в случае нарушения авторских прав. Введено в черновике IETF за авторством Google[11], при этом код ошибки является отсылкой к роману Рэя Брэдбери «451 градус по Фаренгейту». Был добавлен в стандарт 21 декабря 2015.[21]
Список кодов состояния HTTP — Википедия
:)
Добрый вечер! В какой среде разработки код собирали? В эклипсе ? И можно у вас попросить полный проект ? Очень надо...
 
Сверху Снизу