2016-07-29 12 views
0

私はarduinoメガからJSONデータを無線LANシールドとしてESP8266を使用して送信しようとしていましたが、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

ああ、すみません。私は自分の関数名を変更するのを忘れたと思う。最初にhttpメソッドを使用したので、関数名はhttppost()でした。 –

答えて

0

私は専門家ではありません。私はちょうどそれをする方法を学んでいるが、私はあなたが接続を介して十分な時間を与えていないと言うだろう。真の応答を待っている間、タイムアウトではなく遅延に頼っています。違いがあります。

serial.available()を使用して戦略を変更したり、時間の余裕があるループを読み込んだり、データを取得したりするときに終了します。

申し訳ありませんが貼り付けコードはいくつかありますが、あなたはそのアイデアを得ることを願っています。

また、私は電源の問題に直面しています。 arduino unoの3,3vピンはクローンボードに弱い可能性があります。しかし、私はそうは思わない。

関連する問題