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 непосредственно в своем браузере: 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
@marciokoko, 👍0
1 ответ
Лучший ответ:
Ваш последовательный монитор отображает содержимое 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
, поэтому сложно поверить, что показанный вами последовательный вывод действительно получен из кода.
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Arduino Nano, ESP8266-01 связь
- Использовать NodeMCU 12E (ESP8266) в качестве экрана Wi-Fi для Arduino Nano
- Отправить AT-команды на ESP8266 с последовательного монитора Arduino Nano.
- Питание модуля ESP8266 от arduino nano
- Подключение ESP 01 к Nano
- Как передать AT-команды Лоре из UART ESP32?
- Модули HC-12 перестали принимать, не могу понять почему
Хорошо, я исправил & проблема с форматом, это действительно была проблема копирования/вставки. Это правильный вывод, я только что просмотрел его и заменил 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