HTTP POST/METHOD для Emoncms не работает

Итак, я настроил emoncms на своем сервере и опубликовал пример power1:100…power3:300 JSON POST, и он вошел в мои входы. Теперь я пытаюсь отправить данные со своего Arduino, и кажется, что они отправляются нормально, но когда я перехожу к ВХОДАМ, их по какой-то причине там нет.

Вот мой код. Я просто отправляю значение температуры на новый узел:

#include "SoftwareSerial.h"
//Для DHT22 Grove Pro
#include "DHT.h"
#define DHTPIN A1     // к какому выводу мы подключены
#define DHTTYPE DHT22   // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);

String ssid ="myssid";
String password="mypassword";
String server = "www.santiapps.com"; // www.example.com
String uri = "/emoncms/input/post.json";// наш пример — /esppost.php
#define EMON_APIKEY F("myapikey")

byte dat [5];
String temp ,hum;
String data;
char dataString[200];

SoftwareSerial esp(6, 7);// RX, TX

void setup() {
  esp.begin(9600);
  Serial.begin(9600);
  Serial.println("setup");
  reset();
  connectWifi();
}

void reset() {
  Serial.println("reset");
  esp.println("AT+RST");
  delay(1000);
  if(esp.find("OK") ) Serial.println("Module Reset");
}

void connectWifi() {
  Serial.println("connect to wifi");  
  String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\"";
  esp.println(cmd);
  delay(400);
  while (esp.available()){
     String inData = esp.readStringUntil('\n');
     Serial.println("Got reponse from ESP8266: " + inData);
  }


  if(esp.find("OK")) {
    Serial.println("Connected!");
  } else {
    connectWifi();
    Serial.println("Cannot connect to wifi"); }
}


void start_test () {
  //Для DHT22 Grove Pro
  static char outstr1[15];
  static char outstr2[15];
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  dtostrf(t, 8, 2, dataString);
  Serial.println(dataString);
}
void loop(){
  Serial.println("loop");
  start_test();
  httppost();
  delay(100000);
}

void httppost () {
  esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//запускаем TCP-соединение.
  if( esp.find("OK")) {
    Serial.println("TCP connection ready");
  } 
  delay(1000);
  String postRequest="POST " + uri + " HTTP/1.0\r\n"+"Host: " + server + "\r\n" + "Accept: *" + "/" + "*\r\n"+"Content-Length: " + strlen(dataString) + "\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n"+"\r\n" + "&node=fortnite&data={a:" + dataString + "}" + "&apikey=" + EMON_APIKEY;
  Serial.println(postRequest);
  String sendCmd = "AT+CIPSEND=";//определяем количество отправляемых символов.
  esp.print(sendCmd);
  esp.println(postRequest.length());
  delay(500);
  if(esp.find(">")) { 
    Serial.println("Sending.."); 
    esp.print(postRequest);
    if(esp.find("SEND OK")) { 
      Serial.println("Packet sent");
      while (esp.available()) {
        String tmpResp = esp.readString();
        Serial.println(tmpResp);
      }
      //закрываем соединение
      esp.println("AT+CIPCLOSE");
    }
  }
}

Вот мой последовательный монитор:

setup
reset
connect to wifi
Got reponse from ESP8266: AT+CWsetup
reset
Module Reset
connect to wifi
Got reponse from ESP8266:
Got reponse from ESP8266: CLOSED
Got reponse from ESP8266: WIFI DISCONNECT
Got reponse from ESP8266: `BԄQR���ȤRN�ɤRN�H��OAT+CWJAP="tha
connect to wifi
Got reponse from ESP8266: %J:E
Got reponse from ESP8266: HըRP=“myssid”,“mypassword”
Got reponse from ESP8266: busy p…
connect to wifi
Got reponse from ESP8266: AT+CWJAP=“myssid”,“mypassword”
Got reponse from ESP8266: busy p…
Got reponse from ESP8266:
Got reponse from ESP8266: O
connect to wifi
Got reponse from ESP8266: AT+CWJAP=“myssid”,“mypassword”
Got reponse from ESP8266: WIFI DISCONNEC
Connected!
Cannot connect to wifi
Cannot connect to wifi
Cannot connect to wifi
loop
31.00
TCP connection ready
POST /emoncms/input/post.json HTTP/1.0
Host: www.myserver.com
Accept: /
Content-Length: 8
Content-Type: application/x-www-form-urlencoded
    &node=fortnite&data={a:   31.00}&apikey=mykey
    Sending..
    Packet sent

    +IPD,422:HTTP/1.1 200 OK
    Server: nginx
    Date: Tue, 02 Oct 2018 21:38:18 GMT
    Content-Type: application/json
    Connection: close
    X-Powered-By: PHP/5.4.16
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragm

Вот снимок опубликованных данных, когда я использовал этот URL непосредственно в своем браузере: Мой emoncms http://santiapps.com/emoncms/input/post?node=emontx&fulljson={"power1":100,"power2":200,"power3":300}&apikey=mykey

=========

По предложению Хосе:

Я изменил этот код на:

void httppost () {
  esp.println("AT+CIPSTART=\"TCP\",\"" + server + "\",80");//запускаем TCP-соединение.
  if( esp.find("OK")) {
    Serial.println("TCP connection ready");
  }

// //КОД, ИСПОЛЬЗУЕМЫЙ ДЛЯ ПОСТРОЕНИЯ ПОЛНОЙ СТРОКИ
  String apiKeyString="apikey="; 
  apiKeyString.concat(EMON_APIKEY); //ОБЪЕДИНЯЕМ ПАРАМЕТР LITERAL STRING => Строковый объект
  //Serial.println(apiKeyString); // ЭТО ТЕПЕРЬ СТРОЧНЫЙ ОБЪЕКТ
  String nodeData="&node=fortnite&data={\"a\":";
  String combinado=apiKeyString+nodeData; //ОБЪЕДИНЯЕМ ОБА ПРЕДЫДУЩИХ СТРОКОВЫХ ОБЪЕКТОВ
  String finalData=combinado + dataString + "}"; //ОБЪЕДИНЯЕМ СТРООЧНЫЙ ОБЪЕКТ С CHAR[]
  Serial.println("finalData");
  Serial.println(finalData); 
  //беззнаковое int tamano = strlen(dataString);
// символ postThis[100] = FinalData;
// //ДОБАВЛЯЕМ ЭТО В POSTREQUEST +finalData; && изменение длины для strlen(finalData)

  delay(1000);
  String postRequest="POST " + uri + " HTTP/1.1\r\n"+"Host: " + server + "\r\n" + "Accept: *" + "/" + "*\r\n"+"Content-Length: " + finalData.length() + "\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n"+"\r\n" + finalData;
  Serial.println("postRequest");
  Serial.println(postRequest);
  String sendCmd = "AT+CIPSEND=";//определяем количество отправляемых символов.

но теперь я даже не получаю ответа HTTP200OK. Результат:

loop
31.30
finalData
apikey=myKey&node=fortnite&data={"a":31.30}
postRequest

, 👍0


1 ответ


Лучший ответ:

2

Ваш последовательный монитор отображает содержимое POST как:

&node=fortnite&data={a: 31.00}&apikey=mykey

Я не могу сказать, находятся ли & на самом деле в вашем последовательном мониторе, или при копировании/вставке была предпринята попытка форматирования HTML, но & неверен и должен быть &

Ваши данные JSON не являются правильными JSON

{a: 31.00}

должно быть

{"a": 31.00


Как ни странно, на выходе вашего последовательного монитора также отображается Host: www.myserver.com, что не соответствует вашему коду, где server был назначен www. santiapps.com, поэтому сложно поверить, что показанный вами последовательный вывод действительно получен из кода.

,

Хорошо, я исправил & проблема с форматом, это действительно была проблема копирования/вставки. Это правильный вывод, я только что просмотрел его и заменил ssid, пароль, ключ API и имя сервера. Все остальное то же самое. Как мне поставить "" вокруг буквы "а"? Я пробую это: `"&node=fortnite&data={" + "a:" + dataString + "}"; `но я понял это => &node=fortnite&data={a:29.00}, @marciokoko

Символ кавычки можно экранировать обратной косой чертой: "&node=fortnite&data={" + "\"a\":" + dataString + "}", @jose can u c

Спасибо, и последнее: мое внимание было обращено на то, что моя длина контента для запроса POST должна быть длиной всего, начиная с &node.... вплоть до данных json... {"a":29.40}. Может ли это быть причиной того, что пост не работает?, @marciokoko

Вы отправляете длину содержимого, сгенерированную strlen(dataString). Это не совсем правильно. Часть полезной нагрузки HTTP Post находится в этой части вашего кода: &node=fortnite&data={a:" + dataString + "}" + "&apikey=" + EMON_APIKEY. Вычислите ее длину, чтобы найти длину содержимого. Я также заметил, что вы начинаете свой POST-контент с &, но он вам не нужен в начале. Это просто разделение полей, например node=fortnite&data={a:" + dataString + "}" + ". &apikey=" + EMON_APIKEY, @jose can u c

Я добавил свою последнюю попытку, но она также не публикуется., @marciokoko