現在、デバイスが接続してWebリクエストを送信できるアドホックネットワークを構築しようとしているArduinoで作業しています。私が現在抱えている問題は、接続を 1 つしかセットアップできず、その接続が (でclient.stop()
) 終了すると、後続のすべての接続がサーバーによって取得されず、cURLコマンドが回転しているだけであるということです。サーバーをリセットしたときに開始した最初の接続は正常に機能し、サーバーと通信できます。しかしその後、Arduino は新しいクライアントを見つけることができなくなります (与えられたライブラリを試しているにもかかわらず)。
GitHub から複製された WiFly シールド用の SparkFun ライブラリと、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を使用すると、(初めて) 接続に成功し、「終了」を含むコマンドをArduinoclient.stop()
に送信して接続を終了できます (メソッドを呼び出します)。しかし、Telnetを介して再接続しようとすると、接続は成功したと表示されますが、Arduinoでは、クライアントがまだ false であると考えてループしています。何??
私は正しいことを知っています、私はTelnetと Arduinoから混合メッセージを受け取っています。Arduioは 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が常にクライアントを見つけたと考え、クライアントが存在しない場合でも trueclient
と評価することです。client.connected()
接続が終了し、ゴースト「クライアント」が見つかった場合でもclient.available()
true と評価されますが、その後最初に if ステートメントを実行すると、ゴースト「クライアント」はもはや存在しません。available()
. この欠陥があっても、新しいクライアントが来るとそれを拾うので、うまくいきます.
このコメント ハックを使用せずに、この問題の根本にたどり着くにはどうすればよいでしょうか?
この方法で実行する可能性のあるリスクや将来の問題はありますか?
そもそもコメントアウトしたブロックの目的は何ですか?