当我从arduino发送http请求到linux mysql服务器时,我遇到了问题。它在一些请求(~150)之后随机挂起,但在Windows上它运行顺畅。
因此我认为问题不在于arduino代码,而是在其他地方。
linux服务器运行在raspberry pi(Raspbian)上。
有什么建议吗?
arduino代码HERE
if(!getPage(server,serverPort)) Serial.print(F("Fail "));
byte getPage(IPAddress ipBuf,int thisPort)
{
int inChar;
Serial.print(F("connecting..."));
if(client.connect(ipBuf,thisPort))
{
Serial.println(F("connected"));
strcpy(outBuf,"GET /write3.php?value0=");
itoa(value0,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value1=");
itoa(dht_humidity,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value2=");
itoa(temperature,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value3=");
itoa(pressure,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value4=");
itoa(altitude,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value5=");
itoa(gust,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value6=");
itoa(dir,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value7=");
itoa(rain,tBuf,10);
strcat(outBuf,tBuf);
strcat(outBuf,"&value8=");
itoa(knots,tBuf,10);
strcat(outBuf,tBuf);
client.write(outBuf);
client.println(" HTTP/1.1");
client.println("Host: 192.168.1.3");
client.println("Connection: close");
client.println();
编辑:刚刚在DEBUG ___ 3
被绞死Serial.println("DEBUG___2");
client.write(outBuf);
Serial.println("DEBUG___3");
client.println(" HTTP/1.1");
Serial.println("DEBUG___4");
client.println("Host: 192.168.1.3");
Serial.println("DEBUG___5");
client.println("Connection: close");
client.println();
我在挂机时使用wireshark捕获了网络流量:
(大图片:hanged http request ---- successfull http request)
这是挂起的http请求
这是一个成功的请求:
任何想法的家伙?仍然卡在那里!!!
答案 0 :(得分:1)
假设您确定outBuf没有溢出(它小于最大可能的请求字符串大小并且您使用的是strcat(所有邪恶的来源))
服务器可能会在连接打开和实际发送任何字节之间的较长时间内超时。预构建outBuf,以便在连接打开时准备就绪。
strncat(outBuf,...,127);
... request is fully constructed
if(client.connect(ipBuf,thisPort)) {
client.write(outBuf);
client.println(" HTTP/1.1");
client.println("Host: 192.168.1.3");
...
对于服务器,SYN'd但未使用的连接是要恢复的资源。 Arduino会很慢,看起来像是一个空闲的连接。此外,SYN泛洪是一种旧的拒绝服务向量,大多数服务器都会对其进行防范。
超时值的差异可以解释为什么基于Linux和Win的服务器的行为不同。您可以通过在流量上运行Wireshark来确认这一点。如果服务器在Arduino上超时,您将看到以下序列: