我试图做一个帖子从arduino wifi屏蔽到我的java servlet。servlet函数与url get,和jquery post,但我不能排序在我的arduino代码的头。任何帮助将非常感激!
服务器返回200,但是我没有得到有效负载"content"作为值。我不确定我做错了什么,但我很确定这是我的头是如何设置的。我花了整整两天的时间想弄到它。
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "jesussavesforjust19.95"; // your network SSID (name)
char pass[] = "********"; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
IPAddress server(192,168,10,149); // numeric IP for Google (no DNS)
WiFiClient client;
void setup() {
Serial.begin(9600);
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
Serial.println("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to wifi");
printWifiStatus();
sendData("0600890876");
}
void loop() {
// if there's incoming data from the net connection.
// send it out the serial port. This is for debugging
// purposes only:
if (client.available()) {
char c = client.read();
Serial.println(c);
}
//String dataString = "060088765";
// if you're not connected, and ten seconds have passed since
// your last connection, then connect again and send data:
if(!client.connected())
{
Serial.println();
Serial.println("disconnecting.");
client.stop();
//sendData(dataString);
for(;;)
;
}
}
// this method makes a HTTP connection to the server:
void sendData(String thisData) {
// if there's a successful connection:
Serial.println("send data");
if (client.connect(server, 8080)) {
String content = "value=0600887654";
Serial.println(content);
Serial.println("connected");
client.println("POST /hos HTTP/1.1");
client.println("Host:localhost");
client.println("Connection:Keep-Alive");
client.println("Cache-Control:max-age=0");
client.println("Content-Type: application/x-www-form-urlencodedn");
client.println("Content-Length: ");
client.println(content.length());
client.println("nn");
client.println(content);
}
else {
// if you couldn't make a connection:
Serial.println("form connection failed");
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.println("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.println("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.println("signal strength (RSSI):");
Serial.println(rssi);
Serial.println(" dBm");
}
也许,你的一些"Serial "。打印"one_answers"客户端。println"命令应该是"Serial "。打印"one_answers"客户端。打印"。例如:
客户端。内容长度打印(":");
client.println (content.length ());
将避免在文本和数字之间添加换行符。
这可能是对一种方法的建议,而不是答案。
如果我在做这样的事情,我不会在Arduino上开始。没完没了的编译、下载、运行、查看print()会把我逼疯。我将完全原型客户端/服务器交互在任何你有在你的指尖,最好有调试器的东西。(Java, Python, PHP, VB,无论你知道什么,你可以拼凑在一起)
第二,我会在服务器上运行Wireshark,这样我就可以确切地看到发送和响应的内容。
然后我会将相同的交互移植到Arduino上。再次检查与Wireshark,以确认您得到您所期望的。如果你发送相同的字节,你应该得到相同的响应。
即使您选择直接在Arduino上实现,也可以考虑使用Wireshark来捕获实际的网络流量。
使用Wireshark,您可能会看到Arduino println()没有向服务器发送正确的行结束。
同样,也不能保证最后一个println()确实被发送了。网络堆栈实现可以自由地进行缓冲,因为它认为合适。您可能需要一个flush()。数据包跟踪将显示这一点。
对于数据包捕获,您可能会发现时间很重要。理论上,TCP是一个流,您应该能够在一个数据包中每次发送1个字符的POST数据,并且一切都可以工作。但是根据服务器的标准,Arduino执行println()的速度太慢,可能会超时。在这种情况下,你会看到服务器响应之前,Arduino甚至完成发送。