5

我目前正在与 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(). 即使有这个缺陷,当它出现时它仍然会吸引一个新客户,这就是它起作用的原因。

  • 如果不使用这个评论技巧,我怎样才能找到这个问题的根源?

  • 他们这样做有什么风险或未来的问题吗?

  • 我首先注释掉的块的目的是什么?

4

1 回答 1

0

好吧,当您打电话时client.stop();,Arduino 如何知道客户端是否必须重新开始?

记住setup()只执行一次。

您是否尝试在循环中包含以下代码来告诉 Arduino 再次创建 WiFly AdHoc 网络?这可能会也可能不会。我自己没有,也没有玩过 Wifly 盾牌,但值得一试。

请记住,每次需要再次连接时只执行一次代码,因为它位于始终运行的循环中。

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.
    }
}
于 2012-10-24T22:38:51.860 回答