【发布时间】: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
接受编码:gzip、deflate
接受语言:it-IT,it;q=0.9,
客户端断开
两件事我不明白:
为什么我得到两个响应?一种使用 GET /whatisaftertheURL,另一种使用 GET /favicon.ico ?
为什么
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