Posílání na dva servery

Odpovědět
Uživatelský avatar
visk52
Příspěvky: 146
Registrován: 29 led 2020, 15:51
Reputation: 0

Posílání na dva servery

Příspěvek od visk52 » 14 úno 2020, 13:35

Mám takový projekt který posílá naměřenou teplotu na api.thingspeak.com a potřeboval bych aby to posílalo i na druhé místo čili na druhý server kde mám hosting pomocí PHP skriptu na tom hostingu bych to ukládal do textového souboru.Trávím nad tím hodně času a pořád to nechce fungovat kde dělám chybu hvězdičkami vyznačený úsek kódu to je ten co jsem tam přidal díky za pomoc

Kód: Vybrat vše

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
#define TRIGGER_PIN 0                          // tlacitko na GPIO0
const int httpPort = 80;
const char* host = "api.thingspeak.com";       // Informace pro připojení k thingspeak.com
const char* APIkey   = "muj klíc";
const unsigned long SamplingTime = 30000;                 // perioda odesilani [ms]
unsigned long TimeStamp;
float temp;
OneWire oneWire(ONE_WIRE_BUS);                 // Inicializace DS18B20 na pinu GPIO2
DallasTemperature DS18B20(&oneWire);
//---------------------------------------------------------------------------------
void setup() {
  Serial.begin(115200);                        // Otevření komunikace po sériové lince
  pinMode(TRIGGER_PIN, INPUT);                 // tlacitko na GPIO0
  WiFi.begin();                                // Inicializace připojení k síti
  WiFi.mode(WIFI_STA);
  WiFi.setAutoReconnect(true);
  // deset sekund se pokousi o pripojeni k WiFi
  Serial.println("\r\nWaiting for wifi");
  for (uint8_t i = 0; (WiFi.status() != WL_CONNECTED) && (i < 10); i++) {
    delay(1000);
    Serial.print(".");
  }
  // Potvrzení připojení k síti
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\r\nWiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    Serial.println();
  }
  else {
    Serial.println("\r\nWiFi not connected!\r\nPress the GPIO button to start the WifiManager");
  }
  DS18B20.requestTemperatures();               // Prvni vzorek
  temp = DS18B20.getTempCByIndex(0);
  TimeStamp = millis();
}
//---------------------------------------------------------------------------------
void loop() {
  // je volan WifiManager?
  if ( digitalRead(TRIGGER_PIN) == LOW ) {
    WiFiManager wifiManager;
    wifiManager.startConfigPortal("OnDemandAP");
    Serial.println("connected...yeey :)");
  }
  // Měření a odesílání teploty probíhá v intervalu SamplingTime,
  // ale pouze pokud existuje pripojeni k WiFi
  if ((millis() > SamplingTime) && ((millis() - SamplingTime) > TimeStamp) && (WiFi.status() == WL_CONNECTED)) {
    TimeStamp = millis();
    DS18B20.requestTemperatures();               // Získání informace o teplotě teploty
    temp = DS18B20.getTempCByIndex(0);
    Serial.print("Temperature: ");
    Serial.println(temp);
    char charVal[12];
    // Konverze vyčtené teploty do stringu
    // (hodnota, počet míst, počet desetinných míst,
    // umístění stringu)
    dtostrf(temp, 8, 2, charVal);
    Serial.print("connecting to ");
    Serial.println(host);
    WiFiClient client;
    if (!client.connect(host, httpPort)) {
      Serial.println("connection failed");
      return;
    }
    // Vytvoření URL pro odeslání informace o teplotě
    String url = "/update?key=";
    url += APIkey;
    url += "&field1=";
    url += charVal;
    Serial.print("Requesting URL: ");
    Serial.println(url);
    // Odeslání požadavku na server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
               
    Serial.println();
    while (client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);                        // tisk informací přijatých ze serveru
     delay(10);  }
    Serial.println();
    Serial.println("connection completed");      // potvrzení ukončení odesílání
    Serial.println();
    Serial.println(); 
     
    //*************************************
                 String Host = "http://mujhosting.cz/";
                 
                 WiFiClient clienti;
                 if (!clienti.connect(Host,80)){
                  Serial.println("nespojeno");
                  return;
                 }
                  String odkaz = "http://můj hosting.cz/somepage.php?username=";
                 odkaz += charVal;
         
                 clienti.print(String("GET ")+ odkaz);
                 
                clienti.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
                 clienti.println("Connection: close\r\n\r\n");
                 clienti.println();
                 Serial.println("proslo to");
                 //***********************************
    
    
    Serial.println();
    Serial.println("posilani na druhe misto");      // potvrzení ukončení odesílání
    Serial.println();
    Serial.println();
  }
}
Možná jsem s tím tady otravoval tak prosím za shovívavost díky

KamilV
Příspěvky: 479
Registrován: 03 dub 2018, 15:27
Reputation: 0
Bydliště: Olomouc

Re: Posílání na dva servery

Příspěvek od KamilV » 14 úno 2020, 14:26

Neposíláš dobře ten HTTP request, podívej se, jak se posílá v prvním případě:

Kód: Vybrat vše

GET url HTTP/1.1
Host: host
Connection: close
Ve druhém případě:

Kód: Vybrat vše

GET urlAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Connection: close

Uživatelský avatar
visk52
Příspěvky: 146
Registrován: 29 led 2020, 15:51
Reputation: 0

Re: Posílání na dva servery

Příspěvek od visk52 » 14 úno 2020, 15:28

Pochopitelně tapu já nevim jak to spracovává ten server v tom prvnim připadě tak zkoušim co se dá, nějakou radu bych potřeboval díky

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Posílání na dva servery

Příspěvek od martinius96 » 14 úno 2020, 16:03

Niekedy mi request nefungoval na web, ak server nič nevypísal, myslím, že to bolo pri HTTP 1.0. - v Serial monitore sa to dokonca javilo, že sa MCU pripojilo, ale dáta sa nezapísali.
Preto som na webserveri po prijatí dát vypísal cez echo reťazec OK + som za client.print použil krátky delay do 1000ms.
Následne som dáta odoslal z mikrokontroléru a overil, či mi server vrátil OK na moju požiadavku.
Taktiež si mohol použiť POST request. Tiež som si dlho posielal dáta cez GET a pritom tá zmena na POST je triviálna na 3 riadky kódu.
Najlepšie je otestovať oba programy separátne a až tak ich spájať do finálnej podoby.
Tu máš funkčný príklad pre HTTP GET request na webovú lokalitu, uprav si ho pre tvoj program, prípadne otestuj samostatne:

Kód: Vybrat vše

//Vyhotovil: Martin Chlebovec
//Web: https://arduino.php5.sk

#include <ESP8266WiFi.h>
const char * ssid = "MenoWifiSiete";
const char * password = "HesloWifiSiete";
const char * host = "www.mujhosting.cz"; //skus i bez www
const int httpPort = 80; //http port
WiFiClient client;
void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi uspesne pripojene");
  Serial.println("IP adresa: ");
  Serial.println(WiFi.localIP());
  Serial.println("Ready");
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
  }
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  client.stop();
  if (client.connect(host, httpPort)) {
    String username = "administrator";
    String url = "/somepage.php?username=" + username;
    client.print(String("GET ") + url + " HTTP/1.0\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");
    delay(1000);
    while (client.connected()) {
      String line = client.readStringUntil('\n');
      Serial.println(line); //VYPIS HTTP HLAVICKY
      if (line == "\r") {
        break;
      }
    }
    String line = client.readStringUntil('\n');
    Serial.println(line); //VYPIS PAYLOADU
    if (line == "OK") {
      Serial.println("Data odoslane. Server prijal data");
    } else {
      Serial.println("Data odoslane. Problem s prijatim dat na strane servera. - neplatna odpoved");
    }
  } else {
    Serial.println("Problem s pripojenim na web");
  }
}
somepage.php - PHP spracovanie

Kód: Vybrat vše

<?php
$con = mysqli_connect("localhost/EXTERNAL_DB_HOST","pouzivatel_db_root","heslo_do_databazy","meno_databazy");
mysqli_set_charset($con, "utf8");
if (mysqli_connect_errno($con)){
  echo "Problém s napojením na MySQL databázu: " . mysqli_connect_error();
}
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
  $username = mysqli_real_escape_string($con, $_GET['username']);
  if($username!=""){
    echo "OK";
  }else{
    echo "PROBLEM";
  }
}
?>

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Posílání na dva servery

Příspěvek od martinius96 » 14 úno 2020, 16:36

Alebo ešte bez db... - prenos je totožný, funkcionalita prenosu rovnaká...
somepage.php - PHP spracovanie bez DB

Kód: Vybrat vše

<?php
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
  $username = $_GET['username'];
  if($username!=""){
  //ulozis do .txt suboru --> S PREPISOVANIM
   $file = 'subor.txt';
   file_put_contents($file, $username);
    echo "OK";
  }else{
    echo "PROBLEM";
  }
}
?>

Uživatelský avatar
visk52
Příspěvky: 146
Registrován: 29 led 2020, 15:51
Reputation: 0

Re: Posílání na dva servery

Příspěvek od visk52 » 15 úno 2020, 11:30

Narazil jsem na jeden problém když tam dám

Kód: Vybrat vše

 String username = "retezec"; 
HTTP/1.1 200 OK
tak to pošle na server ale když to udělám takto a o to mě právě jde

Kód: Vybrat vše

char charVal[12];
    temp=20.25;
    dtostrf(temp, 8,2, charVal);
    String username = charVal;
    
tak to nepošle na ten server
HTTP/1.1 400 Bad Request
co dělám špatně? díky

Uživatelský avatar
visk52
Příspěvky: 146
Registrován: 29 led 2020, 15:51
Reputation: 0

Re: Posílání na dva servery

Příspěvek od visk52 » 16 úno 2020, 17:02

napraveno chyba byla ve funkci dtostrf(temp,8,2,charVal);správně

Kód: Vybrat vše

dtostrf(temp, 4,2, charVal);
díky

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 13 hostů