如何将带有JSON数据的HTTP响应从Arduino发送到Web浏览器?

时间:2015-09-24 21:39:11

标签: json http arduino

在我对近期Arduino项目的研究中,我正在尝试从Arduino网络服务器发送JSON。

当我在浏览器中访问Arduino的IP地址时,我试图让我的Arduino发回一些虚拟JSON数据。浏览器在等待来自Web服务器的响应时挂起。 10-15秒后,这是我得到的响应头:

HTTP/1.1 504 Fiddler - Receive Failure
Date: Thu, 24 Sep 2015 20:52:36 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Cache-Control: no-cache, must-revalidate
Timestamp: 22:52:36.877

[Fiddler] ReadResponse() failed: The server did not return a complete response for this request. Server returned 0 bytes.

现在在我的代码中,我尝试使用Content-Type: application/json; charset=utf-8发送回复标题,因此我不明白为什么我在浏览器中得到的回复是Content-Type: text/html; charset=utf-8

以下是我在网络服务器上响应客户端请求的Arduino代码的一部分:

void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: application/json;charset=utf-8");
          client.println("Server: Arduino");
          client.println("Connection: close");
          client.println();
          client.println("[{\"tempIn\":23.2, \"tempOut\":16.8, \"unit\":\"Celcius\" }]");
          client.println();
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

顺便说一下,我修改了本教程中的示例: http://www.raywenderlich.com/38841/arduino-tutorial-temperature-sensor

我可以从Fiddler的消息中推断出我对Arduino的反应并不完整。但我无法弄清楚我错过了什么。我一直在互联网上寻找线索,但我只能找到如何将JSON发送给Arduino的示例,而不是发送它,所以我希望你们中的一些人可以帮我找到解决方案。或者也许让我指向其他方式的正确方向,将JSON数据从Arduino发送到Web浏览器。

修改 这太奇怪了。今天我试着更改线路" Content-Type:application / json" to" Content-Type:text / html"。现在我收到了JSON数据作为文本字符串。但这并不是很有用。然后我把它改回" Content-Type:application / json"现在它就像一个魅力(!?!?!)..我不明白为什么。这是我在代码中唯一改变的东西。

我解决了这个问题。 :)

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。 然后我用wireshark查看了我发送给arduino的数据包。这个方便的应用程序显示每个数据包中的原始字节。标题和正文之间有一个双\ r \ n。因此,草图在实际读取身体之前突破了while循环。这也解释了为什么标准Webserver示例会对浏览器中的每个请求回复两次。

它实际上很有用,因为您可以使用它来删除标题,然后读取留在字符串中的任何内容。该字符串仅包含您的JSON文本。