0

我正在尝试从 arduino wifi shield 发布到我的 java servlet。带有 url get 和 jquery post 的 servlet 函数,但我无法在我的 arduino 代码中对标题进行排序。任何帮助将不胜感激!

服务器返回 200,但我没有将有效负载“内容”作为值。我不确定我做错了什么,但我很确定这是我的标题的设置方式。我已经花了最后两天试图得到它。

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

2 回答 2

2

也许,您的一些“Serial.println”和“client.println”命令应该是“Serial.print”和“client.print”。例如:

client.print("内容长度:");

client.println(content.length());

将避免在文本和数字之间添加换行符。

于 2013-01-06T14:47:05.083 回答
0

这可能是关于方法的建议而不是答案。

如果我在做这样的事情,我不会从 Arduino 开始。无休止的编译、下载、运行、查看 print() 会让我发疯。我将在您触手可及的任何东西中对客户端/服务器交互进行完全原型化,最好是带有调试器的东西。(Java、Python、PHP、VB,什么你知道的都可以一起拍)

其次,我会在服务器上运行 Wireshark,这样我就可以准确地看到正在发送和响应的内容。

然后我会将相同的交互移植到 Arduino。再次使用 Wireshark 检查以确认您得到了预期的结果。如果您发送相同的字节,您应该得到相同的响应。


即使您选择直接在 Arduino 上实现,也请考虑使用 Wireshark 来捕获实际的网络流量。

使用 Wireshark,您可能会看到 Arduino println() 没有为服务器发送正确的线路端。

此外,不能保证最后一个 println() 实际已发送。网络堆栈实现可以自由缓冲,因为它认为合适。你可能需要一个flush()。数据包跟踪会显示这一点。

通过数据包捕获,您可能会发现时间很重要。从理论上讲,TCP 是一个流,您应该能够在 1 个数据包中一次发送 1 个字符的 POST 数据,一切都会正常工作。但是按照服务器的标准,Arduino 执行这些 println() 的速度可能会很慢,以至于超时。在这种情况下,您会在 Arduino 完成发送之前看到服务器响应。

于 2013-01-05T08:48:18.303 回答