带有标题问题的Arduino WiFi盾牌帖

时间:2013-01-05 07:24:05

标签: post arduino android-wifi

我正在尝试从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");
}

2 个答案:

答案 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完成发送之前做出响应。