ESP8266 Zaslání dotazu GET přes příkazy AT

lachim16
Příspěvky: 38
Registrován: 25 led 2018, 17:07
Reputation: 0

ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od lachim16 » 03 dub 2018, 17:58

Ahoj, 2 dny se trápím zasláním dat na svoje stránky z meteostanice a nemůžu se pohnout dál. Neporadí mi někdo prosím, kde by mohla být chyba?
Používám ESP8266 - tento:
https://cdn.itead.cc/media/catalog/prod ... 16_1_2.jpg (obrázek ESP8266)
Napadlo mě, že by to nestihlo zpracovat, tak sem tam dal delay(80000), ale pak se to jen přeruší a vypíše v dalším cyklu nesmysly.

Přidávám rozpracovaný program:

Kód: Vybrat vše

#include <Arduino.h>
#include <Wire.h>
#include <BH1750.h>
#include "Adafruit_SHT31.h"
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h> 
#include <SoftwareSerial.h>


BH1750 lightMeter;
Adafruit_SHT31 sht31 = Adafruit_SHT31();
#define BME280_ADRESA (0x76)
Adafruit_BME280 bme; 
 

const byte rxPin = 10;
const byte txPin = 11;
SoftwareSerial ESP8266 (rxPin, txPin);

void setup(){

  Serial.begin(9600);
  ESP8266.begin(9600);
  
  lightMeter.begin();

  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("SHT31 senzor nenalezen.");
    while (1) delay(1);
  }

    if (!bme.begin(BME280_ADRESA)) {
    Serial.println("BME280 senzor nenalezen.");
    while (1);
  
    }
}

void printResponse() {
  while (ESP8266.available()) {
    Serial.println(ESP8266.readStringUntil('\n')); 
  }
}

void loop() {



  uint16_t lux = lightMeter.readLightLevel();
  String lux_add = String(lux);
  
  
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();
  String teplota;
  String teplota2;
  int pozice_substr_teplota;
  
  String vlhkost;
  String vlhkost2;
  int pozice_substr_vlhkost;
  
  float tlak = bme.readPressure() / 100.0F;
  String tlak_content = String(tlak);
  int pozice_substr_tlak = tlak_content.indexOf('.') + 2;
  String tlak_content_pridej = tlak_content.substring(0, pozice_substr_tlak);
  

  if (! isnan(t)) {
    teplota2 = String(t);
    pozice_substr_teplota = teplota2.indexOf('.') + 2;
    teplota = teplota2.substring(0, pozice_substr_teplota);
    
  } else { 
    teplota = "none";
  }
  
  if (! isnan(h)) { 
    vlhkost2 = String(h);
    pozice_substr_vlhkost = vlhkost2.indexOf('.') + 2;
    vlhkost = vlhkost2.substring(0, pozice_substr_vlhkost);
  } else { 
    vlhkost = "none";
  }

  String content_send = "&lang=cs&info=1*vt08LgA6kX*"+teplota+"*"+vlhkost+"*"+tlak_content_pridej+"*"+lux_add+"*none";

  if(teplota != "") {
    if(vlhkost != "") {
      if(tlak_content_pridej != "") {
        if(lux_add != "") {
    //Serial.println(content_send);
    ESP8266.println("AT+CIPSTART=\"TCP\",\"subdomena.domena.cz\",80");
    delay(2000);
    printResponse();

    String cmd = "GET /index.php?s=data" + content_send + " HTTP/1.0\r\nHost: subdomena.domena.cz\r\n\r\n";
    ESP8266.println("AT+CIPSEND=" + String(cmd.length() + 4));
    delay(2000);
    printResponse();

    ESP8266.println(cmd);
    delay(2000);
    printResponse();

    if (ESP8266.available())
  Serial.write(ESP8266.read());
  if (Serial.available())
  ESP8266.write(Serial.read());
  }}}}
 
  delay(80000); 
}
Část programu pro ESP8266:

Kód: Vybrat vše

#include <SoftwareSerial.h>
.....
const byte rxPin = 10;
const byte txPin = 11;
SoftwareSerial ESP8266 (rxPin, txPin);
.....
void setup(){

  Serial.begin(9600);
  ESP8266.begin(9600);
  ....
 }
 
 void printResponse() {
  while (ESP8266.available()) {
    Serial.println(ESP8266.readStringUntil('\n')); 
  }
}

String content_send = "&lang=cs&info=1*vt08LgA6kX*"+teplota+"*"+vlhkost+"*"+tlak_content_pridej+"*"+lux_add+"*none";

  if(teplota != "") {
    if(vlhkost != "") {
      if(tlak_content_pridej != "") {
        if(lux_add != "") {
    //Serial.println(content_send);
    ESP8266.println("AT+CIPSTART=\"TCP\",\"subdomena.domena.cz\",80");
    delay(2000);
    printResponse();

    String cmd = "GET /index.php?s=data" + content_send + " HTTP/1.0\r\nHost: subdomena.domena.cz\r\n\r\n";
    ESP8266.println("AT+CIPSEND=" + String(cmd.length() + 4));
    delay(2000);
    printResponse();

    ESP8266.println(cmd);
    delay(2000);
    printResponse();

    if (ESP8266.available())
  Serial.write(ESP8266.read());
  if (Serial.available())
  ESP8266.write(Serial.read());
  }}}}


Výpis ze Sériového monitoru:

Kód: Vybrat vše

AT+CIPSTART="TCP","subdomena.domena.cz",80

CONNEC
AT+CIPSEND=128

OK
> 


CLOSED

+CIPSTART="TCP","subdomena.domena.cz",80

AT+CIPSEND=128

link is not valid

ERROR
QzJ⸮	⸮YXXlan⸮͙⸮R⸮⸮⸮⸮+%&⸮⸮34.2*973.9*256*none HTTP/1.0

Hos

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od jankop » 03 dub 2018, 19:20

No tož ty máš opravdu server s meteostránkami, který se jmenuje subdomena.domena.cz ?
Tomu nějak nemohu věřit. Neměla by tam být spíš třeba nějaká konkrétní IP adresa tvého serveru?

lachim16
Příspěvky: 38
Registrován: 25 led 2018, 17:07
Reputation: 0

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od lachim16 » 03 dub 2018, 20:07

Ve svém programu mám skutečnou url adresu, jen ji nechci zatím zveřejňovat- proto jsem tu na fóru přepsal jako tvar :) . Přímo IP adresa tam být nemusí ne? Používám url adresu.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od jankop » 03 dub 2018, 20:12

Ještě bych se zeptal, jak máš ošetřenou komunikační rychlost s ESP8266 a co znamená ta čtyřka ve výrazu String(cmd.length() + 4).
Kde se připojuješ na WiFi? Za to se taky stydíš? :D
Asi jsem to přehlédl, ale čekal bych, že nejprve musíš být v nějaké LAN, abys mohl použít URL adresu.

lachim16
Příspěvky: 38
Registrován: 25 led 2018, 17:07
Reputation: 0

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od lachim16 » 03 dub 2018, 20:18

Připojuje se automaticky přes: AT+CWJAP_DEF="SSID","PASSWORD" - nastaveno už dříve
Rychlost jsem nastavil taky na 9600 přes: AT+UART_DEF=9600,8,1,0,0 - nastaveno už dříve

Ta čtyřka netuším :D bez toho to prostě nejelo, ale můj odhad bude že je to "\r\n", které tam nějak vznikne :D

EDIT: doplním, že jsem čerpal hlavně ze stránek:
https://stackoverflow.com/questions/438 ... t-commands
https://arduino.stackexchange.com/quest ... t-commands
Ještě doplním, že https jsem na svém webu dočasně vypl.

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od jankop » 03 dub 2018, 20:35

Zrušil bych prodlevy delay(2000); podle mě nemají opodstatnění. Asi bych poněkud zvýšil komunikační rychlost na rozhraní Software serial. A popřemýšlel bych, jak to je s http keep-alive/ close. Není potřeba to spojení třeba ukončit?
Pokud ten výpis komunikace odpovídá aspoň trochu skutečnosti, tak ta komunikace s esp8266 neprobíhá úplně v pořádku.

lachim16
Příspěvky: 38
Registrován: 25 led 2018, 17:07
Reputation: 0

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od lachim16 » 05 dub 2018, 20:44

Mno v programu jsem nepochodil, tak jsem to zkusil zadat vše manuálně. Bohužel se nemůžu z toho vymotat :(

Kód: Vybrat vše

AT+CIPSTART="TCP","weatherstation.michalmasarik.cz",80

CONNECT

OK
AT+CIPSEND=89


OK
> 
Recv 89 bytes

SEND OK

+IPD,311:HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 05 Apr 2018 18:37:24 GMT
Content-Type: text/html
Content-Length: 166
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
CLOSED
Přes tohle se nemůžu dostat, ať zkouším cokoliv co najdu na googlu, neustále to píše chybu 400 :/ "Recv 89 bytes" by mělo sedět, jinak by to napsalo "busy...". Má někdo nějaký nápad?

Příkaz GET:

Kód: Vybrat vše

GET /index.php?s=data&lang=cs HTTP/1.1\r\nHost: weatherstation.michalmasarik.cz\r\n\r\n
Délka: 81 bytes
Funkční délka: 89 bytes (nepíše busy...)

(dal jsem i skutečnou adresu, třeba to k něčemu pomůže :) )

Doplním ještě verzi ESP:

Kód: Vybrat vše

AT prikazy piste
AT+GMR

AT version:1.2.0.0(Jul  1 2016 20:04:45)
SDK version:1.5.4.1(39cb9a32)
Ai-Thinker Technology Co. Ltd.
Dec  2 2016 14:21:16
OK

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od ohruska » 06 dub 2018, 00:22

Díval jsem se co ti to dělá a myslím si, že data odešleš, ale mají špatný formát.
weatherstation.michalmasarik.cz/data&lang=cs&info=5*0123456789*25.6*30.1*1020*900*None
Pokud uděláš správný zápis z příkazového řádku, tak to funguje? V programování php se vůbec nevyznám....
Já si pomocí ESP8266 posílám data na "thingspeak.com".

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od jankop » 06 dub 2018, 08:21

Z příkazového řádku mu to funguje, to jsem si vyzkoušel a zapsal jsem mu data do databáze. Program nemůžu vyzkoušet, protože programuju přímo esp8266 jako Arduino.
Asi by to chtělo odchytit data, která přicházejí na server.

lachim16
Příspěvky: 38
Registrován: 25 led 2018, 17:07
Reputation: 0

Re: ESP8266 Zaslání dotazu GET přes příkazy AT

Příspěvek od lachim16 » 06 dub 2018, 16:17

Nene, moje aplikace v PHP je určitě dobře, nastavil jsem si pro test, že pokud dostanu jen samotný GET lang tak se mi to i tak uloží do mysql. V tomhle problém není. Samotný dotaz se neodešle z ESP8266 :/ vypíše to jen chybu se špatným dotazem (který pochází přímo z modulu ESP, ne z mé webové aplikace)

Odpovědět

Kdo je online

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