2016-07-29 24 views
0

Ich habe versucht, JSON-Daten von arduino Mega mit ESP8266 als WLAN-Schild zu senden, und ich habe node.js als Socket-Server verwendet. Das Problem ist, dass ein Server keine Daten erhalten hat. hier mein CodeSende JSON von arduino und esp8266 an node.js Socket-Server

#include <ArduinoJson.h> 
#include "SoftwareSerial.h" 


String ssid ="ssid"; 
String password="pwd"; 
//SoftwareSerial esp(22,23);// RX, TX 
String data; 
String server = "server ip"; 
byte objlength; 
String url = ""; 
String temp,hum,weight; 
StaticJsonBuffer<200> jsonBuffer; 
JsonObject& root = jsonBuffer.createObject(); 
//String uri = "yourURI"; 

void reset() { 

Serial2.println("AT+RST"); 
delay(1000); 
if(Serial2.find("OK")) Serial.println("Module Reset"); 


} 
void connectWifi() { 

String cmd = "AT+CWJAP=\"" +ssid+"\",\"" + password + "\""; 
Serial2.println(cmd); 
delay(4000); 

if(Serial2.find("OK")) { 
Serial.println("Connected!"); 
Serial2.println("AT+CIPSTATUS"); 
delay(300); 
while(Serial2.available()){Serial.print(Serial2.read());} 

} 
else { 
connectWifi(); 
Serial.println("Cannot connect to wifi"); } 
} 

void setup() { 
delay(5000); 
    // put your setup code here, to run once: 
Serial2.begin(115200); 
Serial.begin(115200); 
reset(); 
connectWifi(); 

} 


void loop() { 
temp = 25.60; 
hum = 65.3; 
weight = 65.3; 

root["weight"] = weight; 
root["light"] = temp; 
root["humid"] = hum; 
objlength = root.measureLength(); 
senddata(); 
delay(10000); 
} 
void senddata() 
{ 
int objlength = root.measureLength(); 

Serial2.println("AT+CIPSTART=\"TCP\",\"" + server + "\",1336");//start a TCP connection. 

delay(500); 
if(Serial2.find("OK")) { 
Serial.println("TCP connection ready"); 
} 
else 
{ 
Serial.println("can't establish TCP connection"); 
} 
String sendCmd = "AT+CIPSEND=";//determine the number of caracters to be sent. 

Serial2.println(sendCmd); 
delay(200); 
Serial2.println(objlength); 

delay(500); 

if(Serial2.find(">")) 
{ 
Serial.println("Sending.."); 
root.printTo(Serial2); 
root.printTo(Serial); 
//Serial.println(postRequest); 
    delay(2000); 
    if(Serial2.find("SEND OK")) 
    { 
    Serial.println("Packet sent"); 
    delay(200); 

    while (Serial2.available()) { 
    String tmpResp = Serial2.readString(); 
    Serial.println(tmpResp); 
    } 
// close the connection 

    } 
//delay(1000); 
Serial2.print("+++"); 
delay(1200); 
Serial2.println("AT+CIPCLOSE"); 
delay(50); 
Serial.println("Closed"); 
} 

} 

Hier ist mein node.js

var net = require('net'); 

var server = net.createServer(function(socket){ 
    socket.write('SEND OK'); 
// 
    socket.pipe(socket); 

socket.on('data',function(data){ 
    //if(typeof data != 'string'){ 
    var jsontest = JSON.parse(data); 
    console.log('Received: ' + data); 
    console.log(jsontest.weight); 
    console.log(jsontest.light); 
    console.log(jsontest.humid); 
    //} 
    }); 
socket.on('listening',function(){ 
    console.log(listen); 
}); 
}); 
/*server.getConnections(function(err,count){ 
console.log(count); 
});*/ 
server.listen(1336, '10.42.0.1'); 

Ich denke, dass Esp8266 eine Verbindung mit einem Server herstellen können, aber ich weiß nicht, warum die Daten nicht zeigen. Vielleicht geht es um esp8266 Reaktionszeit? screenshot Wie Sie aus diesem Screenshot sehen können, ich node.js Server und Arduino, aber Daten werden nicht auf der Serverseite angezeigt. Aus diesem Grund bin ich mir nicht sicher, wo die Probleme liegen, die das verursachen.

+0

Ich sehe keine POST-Anfrage. Sendet das 'JsonObject' es? Was ist Ihre Arduino-Ausgabe? Wo versagt es? –

+0

Ich habe die HTTP-Methode nicht zum Senden der Daten verwendet. Daten werden über TCP-Socket zwischen Arduino und Node.js Server gesendet, nachdem ich AT + CIPSEND-Befehl verwenden, aber Esp8266 reagiert nicht auf SENDEN OK. Plus node.js Server druckt die Daten nicht aus. Auch wenn arduino eine Verbindung zu einem Server herstellen kann, da in einem seriellen Monitor "TCP-Verbindung bereit" angezeigt wird, Daten jedoch nicht auf einem Server angezeigt werden. Daher bin ich mir nicht wirklich sicher, wo ich das reparieren soll. –

+0

Oh, tut mir leid. Ich glaube, ich habe vergessen, meinen Funktionsnamen zu ändern. Ich habe die http-Methode zuerst verwendet, daher war mein Funktionsname httppost(). –

Antwort

0

Ich bin kein Experte. Ich lerne gerade, wie man es macht, aber ich würde sagen, dass Sie nicht genug Zeit durch Verbindungen geben. Sie verlassen sich auf Verzögerungen und nicht auf Timeouts, während Sie auf eine echte Antwort warten. Da ist ein Unterschied.

Fügen Sie viel mehr Zeit hinzu oder ändern Sie Ihre Strategie, indem Sie serial.available() verwenden und eine Schleife lesen, die eine vorrübergehende Zeitspanne hält, und beenden Sie, wenn Sie Daten erhalten haben.

Sorry no etwas Code einfügen, aber ich hoffe, Sie haben die Idee.

Auch ich habe ein Problem mit der Stromversorgung. 3,3 V Pin in Arduino Uno könnte schwach in Clone Boards sein. Aber ich denke nicht, dass das der Fall ist.