2016-07-29 1 views
0

저는 arduino 메가에서 ESP8266을 wifi 방패로 사용하여 JSON 데이터를 보내려고했지만 node.js를 소켓 서버로 사용했습니다. 문제는 서버가 데이터를받지 못하는 것입니다. 여기에 내 코드Arduino 및 esp8266에서 node.js 소켓 서버로 json 보내기

#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"); 
} 

} 

입니다 여기 내 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'); 

내가 esp8266가 서버와의 연결을 설정할 수 있다고 생각하지만 데이터가 표시되지 않습니다 이유를 모르겠어요. 어쩌면 esp8266 응답 시간일까요? screenshot 이 스크린 샷에서 알 수 있듯이 node.js 서버와 arduino를 실행했지만 데이터가 서버 측에 표시되지 않습니다. 이 때문에, 나는 이것이 어디에서 발생하는 문제인지 확실하지 않습니다.

+0

POST 요청이 표시되지 않습니다. 'JsonObject'가 전송합니까? Arduino 출력은 무엇입니까? 실패한 곳은 어디입니까? –

+0

나는 데이터를 보내기 위해 http 방법을 사용하지 않았다. 데이터는 AT + CIPSEND 명령을 사용하면 arduino와 Node.js 서버 사이의 TCP 소켓을 통해 전송되지만 Esp8266은 SEND OK로 응답하지 않습니다. Plus node.js 서버는 데이터를 인쇄하지 않습니다. arduino는 직렬 모니터에 "TCP 연결 준비"를 표시하지만 서버에 데이터가 표시되지 않기 때문에 서버에 연결할 수 있습니다. 따라서 나는 정말로 어디에서 고칠 지 확신하지 못한다. –

+0

오, 미안 해요. 내 함수 이름을 바꾸는 걸 깜박 했어. 내 함수 이름이 httppost()이기 때문에 처음에는 http 메소드를 사용했다. –

답변

0

저는 전문가가 아닙니다. 나는 그것을하는 법을 배우는 것뿐입니다.하지만 당신이 연결을 통해 충분한 시간을주지 않는다고 말하고 싶습니다. 진정한 응답을 기다리는 동안 제한 시간보다는 지연에 의존합니다. 차이가 있습니다.

serial.available()을 사용하여 더 많은 시간을 추가하거나 전략을 변경하고 마지막으로 건전한 시간 동안 루프를 읽은 다음 데이터가있을 때 종료하십시오.

죄송합니다. 코드를 붙여 넣지 마십시오. 아이디어를 얻었 으면 좋겠습니다.

또한 전원 문제에 직면하고 있습니다. arduino uno의 3,3v 핀이 클론 보드에서 약할 수 있습니다. 그러나 나는 그렇게 생각하지 않는다.

관련 문제