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

Ando Noriaki n-ando @ aist.go.jp
2012年 12月 25日 (火) 18:37:56 JST


安藤です

先ほどの件ですが、今回のRTMコンテストの作品にちょうど
いいドキュメントがありました。
Hiroaki MatsudaさんのFutaba製サーボモータRSシリーズ制御用RTC
http://www.openrtm.org/openrtm/ja/node/5208
という作品の付属ドキュメント
https://github.com/downloads/HiroakiMatsuda/MultiTypeConsoleIn/OpenRTMside-Windows_ver.121211.pdf
がちょうどConsoleInとかを題材にコンポーネントの
作り方を解説しています。


> 産総研 安藤です
> 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
> で表示させています。
> わからなかったら、またメーリングリストに質問してください。
>
> _______________________________________________
> openrtm-users mailing list
> openrtm-users @ openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-users

-- 
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
    統合知能研究グループ 主任研究員, 博士(工学)
    〒305-8568 つくば市梅園1-1-1 中央第2
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org

Noriaki Ando, Ph.D.
    Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
    AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org


More information about the openrtm-users mailing list