我正在尝试从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-urlencoded\n");
client.println("Content-Length: ");
client.println(content.length());
client.println("\n\n");
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");
}
答案 0 :(得分:2)
也许,你的一些“Serial.println”和“client.println”命令应该是“Serial.print”和“client.print”。例如:
client.print(“Content-Length:”);
client.println(content.length());
会避免在文字和数字之间添加换行符。
答案 1 :(得分:0)
这可能是关于方法的建议而不是答案。
如果我这样做,我就不会开始使用Arduino。无休止的编译,下载,运行,看看print()会让我发疯。无论你掌握什么,我都会完全建立客户端/服务器交互的原型,最好是带有调试器的东西。 (Java,Python,PHP,VB,无论你知道什么,你都可以一起拍)
其次,我会在服务器上运行Wireshark,以便能够确切地看到发送和响应的内容。
然后我会将相同的交互移植到Arduino。再次与Wireshark一起检查以确认您得到了您的预期。如果发送相同的字节,则应该得到相同的响应。
即使您选择直接在Arduino上实施,也可以考虑让Wireshark捕获实际的网络流量。
使用Wireshark,您可能会看到Arduino println()没有为服务器发送正确的行结束。
此外,无法保证最后发送的println()。网络堆栈实现可以根据需要自由缓冲。您可能需要flush()。数据包跟踪会显示此信息。
通过数据包捕获,您可能会发现时间很重要。从理论上讲,TCP是一个流,您应该能够在1个数据包中一次发送该POST数据1个字符,一切都行。但Arduino可能会因服务器的标准执行那些println()而执行速度太慢。在这种情况下,您会看到服务器在Arduino完成发送之前做出响应。