【问题标题】:HTTP request not sending data properlyHTTP 请求未正确发送数据
【发布时间】:2018-05-14 13:56:40
【问题描述】:

我制作了一个简单的 JavaScript 页面,当按下“发送”按钮时,它应该显示一个时间表并通过 HTTP 发送数据。

应该使用这个简单的方案将数据发送到 Arduino:

http://arduinoip/DATASTARTSHEREhh:mm;hh:mm;hh:mm;[...];DATAENDSHERE

我使用以下代码打印我在 Arduino 串行监视器中收到的所有数据:

void loop() {
  // listen for incoming clients
  EthernetClient client = ArduinoServer.available();
  String message = "";
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        message += c;
        if (c == '\n' && currentLineIsBlank) {
          cmd = message.indexOf(DATASTARTING);
          Serial.print("CMD Value: ");
          Serial.println(cmd);
          if(cmd > 0){
            //I received some data and i want to know what it is.
            msg = message.c_str();
            char actChar = msg[cmd + 14]; //14 is the size of the string "DATASTARTSHERE"
            Serial.print("First character of data I'm interested in: ");
            Serial.println(actChar);
            int count = 0;
            values = "";
            while(actChar != 'D'){
              values += actChar;
              count++;
              actChar = msg[cmd + 14 + count];
            }
            Serial.print("Values i got: ");
            Serial.println(values);
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            //client.println(params_to_html());
            client.println("I received data");
            client.println("</html>");
            Serial.println(message);
            break;
          }else{
            // send a standard http response header
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("I didn't receive data");
            client.println("</html>");
            Serial.println(message);
            break;
          }
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }  
}

我收到的数据如下:

新客户

CMD 值:-1

GET /DATASTARTSHERE10:10;11:11;12:12;13:13;14:14;15:15;16:16;17:17;18:18;19:19;20:20;21 :21;22:22;23:23;DATAENDSHERE HTTP/1.1

主机:192.168.1.32

连接:保持活动

升级不安全请求:1

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/62.0.3202.94 Safari/537.36

接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8

接受编码:gzip、deflate

客户端断开

新客户

CMD 值:-1

GET /favicon.ico HTTP/1.1

主机:192.168.1.32

连接:保持活动

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/62.0.3202.94 Safari/537.36

接受:image/webp,image/apng,image/,/*;q=0.8

推荐人: http://192.168.1.32/DATASTARTSHERE10:10;11:11;12:12;13:13;14:14;15:15;16:16;17:17;18:18;19:19;20:20;21:21;22:22;23:23;DATAENDSHERE

接受编码:gzip、deflate

接受语言:it-IT,it;q=0.9,

客户端断开

两件事我不明白:

  1. 为什么我得到两个响应?一种使用 GET /whatisaftertheURL,另一种使用 GET /favicon.ico ?

  2. 为什么cmd 的值是-1,即使我给了它indexOf(DATASTARTING) 的值,而DATASTARTING 是一个const char*,里面有"DATASTARTSHERE" 的值?

如果我删除一些行,比如

Serial.print("CMD Value: ");
Serial.print("First character of data I'm interested in: ");
Serial.println(actChar);

cmd 成为消息中DATASTARTSHERE 的正确索引,但我不明白这些行与cmd 的值有什么关系,因为在执行这些行之前会对其进行比较。

我没有设法再次触发它,但是添加了一些其他行来拆分消息,在拆分之前打印消息仅打印我在 mi JS 页面中发送的值的一半。

这对我来说没有意义,所以我可以从网页接收的内容有限制吗?

我没有发布我的 JS 页面的代码,因为我觉得它没有必要,但如果不是,我会发布它。

【问题讨论】:

    标签: javascript html http arduino


    【解决方案1】:

    浏览器总是向 Favicon.ico 发出请求,阅读 this here

    AFAIK 您可以阻止它发生,但这并不是真正必要的,可以安全地忽略。

    对于第二个问题,如果在数组或字符串中找不到元素,indexOf() 将返回 -1,因此在您检查时 message 不包含 DATASTARTING

    可能是因为某种原因,c == '\n' &amp;&amp; currentLineIsBlank 你在c 中的第一行是空白的?但是您应该仔细检查这些值。我会删除逻辑并在您迭代时打印这些值,以便您更好地了解正在发生的事情。

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 1970-01-01
      • 2019-12-21
      • 2012-07-28
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多