ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
omniORB単体だとやたら面倒くさい.
正直な所,OpenRTM-aistを使うだけなら別にソースなんか読まなくても良いような気がする.
でもこの前の卒論発表で,「OpenCVのライブラリをそのまま使っているので,どんなアルゴリズムかは知りません」とか平気な顔で言う人を見たので,読んだ方が良いような気もするんだよなぁ.
まあ,OpenCVはちょっと探せば情報はすぐに出てくるから別に読まなくても良いんだけど.
ちなみに僕は画像処理に興味がないのでOpenCVのアルゴリズムなんか知りません.
それはさておき,今回はネームサーバーを使ってクライアントとサーバーを分けます.
今回のサンプルはここからダウンロード出来ます.
・・・・とは言っても,omniORBのサンプルとほぼ同じですが.
では,クライアントから見ていきます.
TestCORBAclientのTestCORBAcliant.cppを見てください.
//ネームサーバーよりオブジェクトリファレンスを取得
CORBA::Object_var obj = getObjectReference(orb);
//サーバントのオブジェクトリファレンス取得
Example::Echo_var echoref = Example::Echo::_narrow(obj);
//サーバーに処理を要求
for (CORBA::ULong count=0; count < 10; count++)
hello(echoref);
重要なのはgetObjectReferenceなので,そちらを見ます.
//ネーミングサービスの参照を取得
obj = orb->resolve_initial_references("NameService");
rootContext = CosNaming::NamingContext::_narrow(obj);
・・・
//test.mycontext/Echo.Objectに名前を設定
CosNaming::Name name;
name.length(2);
name[0].id = (const char*) "test"; // string copied
name[0].kind = (const char*) "my_context"; // string copied
name[1].id = (const char*) "Echo";
name[1].kind = (const char*) "Object";
・・・
//指定した名前のオブジェクトリファレンスを返す
return rootContext->resolve(name);
重要なのはこんなところかな.
例の如く,example_echo.idlからomniidl -bcxx -Wba -nf example_echo.idlとコマンドを打ってファイル生成してください.
次はサーバーです.
TestCORBAserverのTestCORBAserver.cppを見てください.
main文では
//ネームサーバーにオブジェクトを登録
if( !bindObjectToName(orb, obj) )
return 1;
・・・
//サーバアプリケーションの終了待機
orb->run();
重要なのはこれだけ.
あとは前と同じ.
bindObjectToNameでは,
//test.my_contextの下に登録するため,ネーミングコンテキストの名前設定
CosNaming::Name contextName;
contextName.length(1);
contextName[0].id = (const char*) "test";
contextName[0].kind = (const char*) "my_context";
・・・
//ネーミングコンテキストの作成
testContext = rootContext->bind_new_context(contextName);
・・・
//Echo.Objectという名前を設定
CosNaming::Name objectName;
objectName.length(1);
objectName[0].id = (const char*) "Echo";
objectName[0].kind = (const char*) "Object";
・・・
//オブジェクトを登録
testContext->bind(objectName, objref);
みたいな感じ.
最後に動作確認してみます.
ネームサーバーを起ち上げるのは
omniNames -start -logdir tmp
とコマンド入力します.
この際,tmpのフォルダの中のファイルは削除してないと実行できないみたいですね.
続いて,サーバーを起ち上げます.
コマンドから
TestCORBAserver -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とネームサーバーのポート番号を指定して起ち上げます.
クライアントも同様に
TestCORBAclient -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とします.
すると,クライアントでサーバーのechoStringから"hello"と返されて,サーバーでも今回は受け取った文字列を表示するようにしたので表示されるはずです.
これで完了です.
・・・・うん,面倒くさい.
次回は他のPCでサーバーを起ち上げて通信させます.
後,普通のソケット通信との比較でもやってみようと思います.
少し比べる次元がおかしいような気もしますが.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
正直な所,OpenRTM-aistを使うだけなら別にソースなんか読まなくても良いような気がする.
でもこの前の卒論発表で,「OpenCVのライブラリをそのまま使っているので,どんなアルゴリズムかは知りません」とか平気な顔で言う人を見たので,読んだ方が良いような気もするんだよなぁ.
まあ,OpenCVはちょっと探せば情報はすぐに出てくるから別に読まなくても良いんだけど.
ちなみに僕は画像処理に興味がないのでOpenCVのアルゴリズムなんか知りません.
それはさておき,今回はネームサーバーを使ってクライアントとサーバーを分けます.
今回のサンプルはここからダウンロード出来ます.
・・・・とは言っても,omniORBのサンプルとほぼ同じですが.
では,クライアントから見ていきます.
TestCORBAclientのTestCORBAcliant.cppを見てください.
//ネームサーバーよりオブジェクトリファレンスを取得
CORBA::Object_var obj = getObjectReference(orb);
//サーバントのオブジェクトリファレンス取得
Example::Echo_var echoref = Example::Echo::_narrow(obj);
//サーバーに処理を要求
for (CORBA::ULong count=0; count < 10; count++)
hello(echoref);
重要なのはgetObjectReferenceなので,そちらを見ます.
//ネーミングサービスの参照を取得
obj = orb->resolve_initial_references("NameService");
rootContext = CosNaming::NamingContext::_narrow(obj);
・・・
//test.mycontext/Echo.Objectに名前を設定
CosNaming::Name name;
name.length(2);
name[0].id = (const char*) "test"; // string copied
name[0].kind = (const char*) "my_context"; // string copied
name[1].id = (const char*) "Echo";
name[1].kind = (const char*) "Object";
・・・
//指定した名前のオブジェクトリファレンスを返す
return rootContext->resolve(name);
重要なのはこんなところかな.
例の如く,example_echo.idlからomniidl -bcxx -Wba -nf example_echo.idlとコマンドを打ってファイル生成してください.
次はサーバーです.
TestCORBAserverのTestCORBAserver.cppを見てください.
main文では
//ネームサーバーにオブジェクトを登録
if( !bindObjectToName(orb, obj) )
return 1;
・・・
//サーバアプリケーションの終了待機
orb->run();
重要なのはこれだけ.
あとは前と同じ.
bindObjectToNameでは,
//test.my_contextの下に登録するため,ネーミングコンテキストの名前設定
CosNaming::Name contextName;
contextName.length(1);
contextName[0].id = (const char*) "test";
contextName[0].kind = (const char*) "my_context";
・・・
//ネーミングコンテキストの作成
testContext = rootContext->bind_new_context(contextName);
・・・
//Echo.Objectという名前を設定
CosNaming::Name objectName;
objectName.length(1);
objectName[0].id = (const char*) "Echo";
objectName[0].kind = (const char*) "Object";
・・・
//オブジェクトを登録
testContext->bind(objectName, objref);
みたいな感じ.
最後に動作確認してみます.
ネームサーバーを起ち上げるのは
omniNames -start -logdir tmp
とコマンド入力します.
この際,tmpのフォルダの中のファイルは削除してないと実行できないみたいですね.
続いて,サーバーを起ち上げます.
コマンドから
TestCORBAserver -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とネームサーバーのポート番号を指定して起ち上げます.
クライアントも同様に
TestCORBAclient -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService
とします.
すると,クライアントでサーバーのechoStringから"hello"と返されて,サーバーでも今回は受け取った文字列を表示するようにしたので表示されるはずです.
これで完了です.
・・・・うん,面倒くさい.
次回は他のPCでサーバーを起ち上げて通信させます.
後,普通のソケット通信との比較でもやってみようと思います.
少し比べる次元がおかしいような気もしますが.
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
PR
この記事にコメントする