[openrtm-users 02742] Re: TCP/IP通信によるPC同士の相互通信方法について

Noriaki.Ando @ gmail.com Noriaki.Ando @ gmail.com
2012年 12月 25日 (火) 18:30:29 JST


産総研 安藤です
TCPレベルのプログラムを直接するのではなく、通信にはOpenRTMを
利用するものとして回答させていただきます。
ご希望の、「1台のPCで入力した数値をTCP/IP通信で送信し、もう1台の
PCでそれを受信し
ターミナルに表示する」というものでしたら、サンプル
にあるCosoleIn、ConsoleOutコンポーネントがまさにそれに当たります。
http://www.openrtm.org/openrtm/ja/node/999 の「動作確認
(Windows編)」にConsoleInとConsoleOutを利用して
通信テストさせる方法が書いてあります。
ソースコードはそれぞれこちらになります。
http://svn.openrtm.org/OpenRTM-aist/trunk/OpenRTM-aist/examples/SimpleIO/ConsoleIn.cpp
http://svn.openrtm.org/OpenRTM-aist/trunk/OpenRTM-aist/examples/SimpleIO/ConsoleOut.cpp
コンポーネントの作り方については、この辺を参考にしてみてください。
http://www.openrtm.org/openrtm/ja/node/5022
また、データの送受信に関してはデベロッパーズガイドの
http://openrtm.org/openrtm/ja/content/rtc%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-0
データポートの項目を参考にしてください。
http://openrtm.org/openrtm/ja/content/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9D%E3%83%BC%E3%83%88-%E5%9F%BA%E7%A4%8E%E7%B7%A8
基本的な考え方が書いてあります。 といっても簡単で
・送信側(OutPort)ではデータポート変数に値を代入して
write()関数を呼ぶ
・受信側(InPort)ではデータポートのisNew()でデータの到着を確認したうえでread()関数を呼んで
 データポート変数から値を読みだす だけです。
ConsoleInとConsoleOutについてみてみますと、まず、コンソールから文字列を入力して
RTコンポーネントのデータポートから出力する部分ですが、ConsoleIn.cpp
の onExecute関数の中で std::cout << "Please input number: "; std::cin
  >> m_out.data; if (m_out.data == 666) return RTC::RTC_ERROR;
m_outOut.write(); cin
でコンソールから受け取った数値をOutPortのデータ変数
m_out.data に代入しています。その後 m_outOut.write() で
接続されているInPortへデータを送っています。
次に、InPortから受け取ったデータをコンソールに表示させる部分です。
ConsoleOut.cpp の onExecute関数の中を見てください。 if
(m_inIn.isNew()) { m_inIn.read(); std::cout << "Received: " << m_in.data <<
std::endl; std::cout << "TimeStamp: " << m_in.tm.sec << "[s] "; std::cout <<
m_in.tm.nsec << "[ns]" << std::endl; } coil::usleep(1000); return
RTC::RTC_OK; m_inIn.isNew()
でデータが到着したかどうか確認しています。
データが来ていたら、m_inIn.read() でデータをデータ変数
m_inに 読み込みます。データ変数の m_in.data
に数値データが入っているので これを cout
で表示させています。
わからなかったら、またメーリングリストに質問してください。



More information about the openrtm-users mailing list