0

tcp/ip pc/arduino プロジェクトをプログラミングしています。Arduino にはイーサネット シールドがあり、クライアントとして機能します。PC はブーストを実行し、asio ライブラリを利用してクライアントとして機能します。

サーバーに接続しようとすると、接続を確立できません。サーバーには、192.168.1.1 の静的アデレスを持つネットワーク アダプターがあります。また、Arduino の IP アドレスは 192.168.1.2 です。両者は UTP ケーブルで直接接続されています。どちらもポート 5000 を使用しています。

Arduino コードの場合、テスト用にサンプル プログラムを使用しますが、これは失敗します。セットアップは次のようになります。

// Enter the IP address of the server you're connecting to:
IPAddress server(192,168,1,1); 

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 23 is default for telnet;
// if you're using Processing's ChatServer, use  port 10002):
EthernetClient client;

void setup() {
   // start the Ethernet connection:
   Ethernet.begin(mac, ip);
   // Open serial communications and wait for port to open:
Serial.begin(9600);
 while (!Serial) {
  ; // wait for serial port to connect. Needed for Leonardo only
}


 // give the Ethernet shield a second to initialize:
 delay(1000);
 Serial.println("connecting...");

 // if you get a connection, report back via serial:
 if (client.connect(server, 5000)) {
   Serial.println("connected");
 } 
 else {
   // if you didn't get a connection to the server:
   Serial.println("connection failed");
 }
}

PC サーバー コードも非常に単純です。クラス コンストラクターで次のことを行います。

    cout << "Setting up server" << endl;
    // Protocol and port
     boost::asio::ip::tcp::endpoint Endpoint(boost::asio::ip::tcp::v4(), 5000);

    // Create acceptor
    boost::asio::ip::tcp::acceptor Acceptor(IOService, Endpoint);

    // Create socket
    SmartSocket Sock(new boost::asio::ip::tcp::socket(IOService));

    cout << "Before accept..." << endl;

     // Waiting for client
         Acceptor.accept(*Sock);

    cout << "Server set up" << endl;

SmartSocket は typdef です。

typedef boost::shared_ptr<boost::asio::ip::tcp::socket> SmartSocket;

サーバーを起動すると、コンソールに「Before Accept」と表示され、accept 関数で着信クライアントを待ちます。しかし、Arduinoコードを実行すると、接続に失敗しました(ardunionシリアルモニターで)。

誰かが何がうまくいかないのか考えていますか? サーバーとクライアントがお互いを認識していないようです。ファイアウォールも停止しましたが、これは役に立ちませんでした。どんなコメントも役に立ちます!

4

1 に答える 1

2

サーバーとクライアントが通信しない理由はいくつもあります。コードのバグ、メッセージをブロックするファイアウォール、NIC 設定、または単に接続されていないデバイスから。これは、あなたが信じているよりもはるかに一般的です!

接続に問題がないことを確認するにはping、Arduio から PC に接続してみてください。

あなたのasio PCサーバーコードがOKであることを確認するため。HTTP リクエストのようにローカル TCP 接続を確立してみてください。たとえばhttp://127.0.0.1:5000/hello、PC で Web ブラウザの URL を入力します。これにより、localhost の GET 要求がサーバーのポート 5000 に送信され、少なくとも PC のコンソールに「サーバーのセットアップ」が表示されます。

そうでない場合は、PC サーバー コードと要求で 5000 の代わりにポート 80 (標準の TCP ポート) を使用してみてください。それが機能する場合は、ファイアウォールがポートをブロックしているか、Adruino コードにバグがある可能性があります。

ただし、それがうまくいかない場合は、サーバー コードを詳しく調べる必要があります。asio Daytime.2の例がうまくいくはずです。

また、@Igor のアドバイスに従ってWireshark、PC にインストールしてください。無料かもしれませんが、ネットワーク問題のデバッグに関しては非常に貴重です。

于 2013-10-30T19:58:51.000 に答える