我目前正在与 Arduino 合作,试图构建一个设备可以连接到该网络并向其发送 Web 请求的自组织网络。我目前遇到的问题是我只能建立一个连接,然后当该连接终止时(使用client.stop()
),服务器不会接收所有后续连接,即使cURL命令也只是在那里旋转。当我重置服务器时我开始的第一个连接工作正常,我能够与服务器交谈;但在那之后,Arduino 无法再找到新客户(即使它正在尝试使用给定的库)。
我正在使用 SparkFun 库,用于从 GitHub 克隆的 WiFly 防护罩,以及Arduino Uno。
我当前的代码基于他们的默认示例“WiFly_AdHoc_Example”,但我必须删除一些东西才能让网络启动,这可能是导致此问题的原因。
这是我正在运行的.ino文件。
#include <SPI.h>
#include <WiFly.h>
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial( 5, 4); //Part from example not used (see below)
WiFlyServer server(80); //Use telnet port instead, if debugging with telnet
void setup()
{
Serial.begin(9600);
//The code below is from the example, but when I run it the WiFly will hang
// on Wifly.begin(). Without it, the WiFly starts up fine.
//mySerial.begin(9600);
//WiFly.setUart(&mySerial); // Tell the WiFly library that we are not
// using the SPIUart
Serial.println("**************Starting WiFly**************");
// Enable Adhoc mod
WiFly.begin(true);
Serial.println("WiFly started, creating network.");
if (!WiFly.createAdHocNetwork("wifly"))
{
Serial.print("Failed to create ad hoc network.");
while (1)
{
// Hang on failure.
}
}
Serial.println("Network created");
Serial.print("IP: ");
Serial.println(WiFly.ip());
Serial.println("Starting Server...");
server.begin();
Serial.print("Server started, waiting for client.");
}
void loop()
{
delay(200);
WiFlyClient client = server.available();
if (client)
{
Serial.println("Client Found.");
// A string to store received commands
String current_command = "";
while (client.connected())
{
if (client.available())
{
//Gets a character from the sent request.
char c = client.read();
if (c=='#' || c=='\n') //End of extraneous output
{
current_command = "";
}
else if(c!= '\n')
{
current_command+=c;
}
if (current_command== "get")
{
// output the value of each analog input pin
for (int i = 0; i < 6; i++)
{
client.print("analog input ");
client.print(i);
client.print(" is ");
client.print(analogRead(i));
client.println("<br />");
}
}
else if(current_command== "hello")
{
client.println("Hello there, I'm still here.");
}
else if (current_command== "quit")
{
client.println("Goodbye...");
client.stop();
current_command == "";
break;
}
else if (current_command == "*OPEN*")
{
current_command == "";
}
}
}
// Give the web browser time to receive the data
delay(200);
// close the connection
client.stop();
}
}
这个脚本只是我设置用来测试的一个迷你协议。与 wifly 模块连接后,您可以发送诸如“get”、“hello”或“quit”之类的文本,wifly 模块应该会回复。
使用Telnet我可以成功连接(第一次)并向Arduino发送命令,包括“退出”以终止连接(调用client.stop()
方法)。但是当我尝试通过Telnet重新连接时,它说连接成功,但在Arduino上它仍然循环认为客户端仍然是错误的。什么??
我知道,我从Telnet vs Arduino收到了混杂的信息。由于Ardunio仍在循环等待评估为 true 的客户端,因此这些命令都没有明显工作。我将从我导入的库中查看 WiFlyServer,看看我是否可以挖掘问题,因为不知何故server.available() 方法没有找到新客户端。
我注意到库代码中有很多 TODO ......
所以我找到了问题的原因。它在SparkFun 库WiFlyServer.cpp
的文件中。导致重新连接问题的代码实际上是方法。在方法的顶部,有一个检查:server.availible()
// TODO: Ensure no active non-server client connection.
if (!WiFly.serverConnectionActive) {
activeClient._port = 0;
}
出于某种原因,当我对此发表评论时,我可以完美地连接和重新连接,并且一切正常。我现在将深入图书馆,看看我是否可以解决这个问题,我不确定这是在做什么,但是当服务器连接不活动并且以某种方式阻止后续连接时,它会被调用。这个解决方案的问题是,Arduino总是认为它已经找到了一个客户,client
并且client.connected()
即使一个客户不存在,它也会评估为 true。当连接终止并找到幽灵“客户端”时,甚至client.available()
评估为真,但在第一次运行 if 语句之后,幽灵“客户端”不再存在available()
. 即使有这个缺陷,当它出现时它仍然会吸引一个新客户,这就是它起作用的原因。
如果不使用这个评论技巧,我怎样才能找到这个问题的根源?
他们这样做有什么风险或未来的问题吗?
我首先注释掉的块的目的是什么?