忍者ブログ
ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
[400]  [399]  [398]  [397]  [396]  [395]  [394]  [393]  [392]  [391]  [390
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

今回はOmniORBpyの簡単なプログラムを作ってみます。
ここから簡単な例をダウンロードできます。
とは言ってもこのページのコードをパクッただけですが。
以前C++で作ったもののPython版なのでやっていることはほぼ同じです。

まず、IDLファイルのコンパイルを行います。
example_echo.idlと同じフォルダに移動して以下のコマンドを入力してください。


omniidl -bpython -Wba -nf example_echo.idl


するとExampleフォルダ、Example__POAフォルダ、example_echo_idl.pyが生成されます。


まずはクライアントから見ていきます。


#!/usr/bin/env python
import sys
from omniORB import CORBA
import CosNaming, Example
# ORBの生成と初期化
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
# RootPOA(ツリー構造のルート)への参照を取得
obj         = orb.resolve_initial_references("NameService")

#ルートコンテキストを取得
rootContext = obj._narrow(CosNaming.NamingContext)
if rootContext is None:
    print "Failed to narrow the root naming context"
    sys.exit(1)
name = [CosNaming.NameComponent("test", "my_context"),
        CosNaming.NameComponent("ExampleEcho", "Object")]
try:
   #指定した名前のオブジェクトリファレンスを取得
    obj = rootContext.resolve(name)
except CosNaming.NamingContext.NotFound, ex:
    print "Name not found"
    sys.exit(1)
#サーバントのオブジェクトリファレンス取得
eo = obj._narrow(Example.Echo)
if (eo is None):
    print "Object reference is not an Example::Echo"
    sys.exit(1)
message = "Hello from Python"

#サーバーに処理を要求
result  = eo.echoString(message)
print "I said '%s'. The object said '%s'." % (message,result)



こんな感じです。
次にサーバーです。




#!/usr/bin/env python
import sys
from omniORB import CORBA, PortableServer
import CosNaming, Example, Example__POA
class Echo_i (Example__POA.Echo):
    def echoString(self, mesg):
        print "echoString() called with message:", mesg
        return mesg
# ORBの生成と初期化
orb = CORBA.ORB_init(sys.argv, CORBA.ORB_ID)
poa = orb.resolve_initial_references("RootPOA")
ei = Echo_i()
eo = ei._this()
# RootPOA(ツリー構造のルート)への参照を取得
obj         = orb.resolve_initial_references("NameService")
#ルートコンテキストを取得
rootContext = obj._narrow(CosNaming.NamingContext)
if rootContext is None:
    print "Failed to narrow the root naming context"
    sys.exit(1)
name = [CosNaming.NameComponent("test", "my_context")]
try:
    #ネーミングコンテキストの作成
    testContext = rootContext.bind_new_context(name)
    print "New test context bound"
    
except CosNaming.NamingContext.AlreadyBound, ex:
    print "Test context already exists"
    obj = rootContext.resolve(name)
    testContext = obj._narrow(CosNaming.NamingContext)
    if testContext is None:
        print "test.mycontext exists but is not a NamingContext"
        sys.exit(1)
name = [CosNaming.NameComponent("ExampleEcho", "Object")]
try:
   #オブジェクトを登録
    testContext.bind(name, eo)
    print "New ExampleEcho object bound"
except CosNaming.NamingContext.AlreadyBound:
    testContext.rebind(name, eo)
    print "ExampleEcho binding already existed -- rebound"
#POAManagerオブジェクトの取得とアクティブ状態への遷移
poaManager = poa._get_the_POAManager()
poaManager.activate()
#ORBの破棄
orb.run()




と言う感じです。
では動作確認をしてみます。
ネームサーバーを立ち上げるには以下のコマンドを入力します。


omniNames -start -logdir tmp





次にサーバーを起動します。

pythonTestCORBAserver.py -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService

と入力してください。


最後にクライアントを起動します。


python TestCORBAclient.py -ORBInitRef NameService=corbaloc:iiop:1.0@localhost:2809/NameService


と入力してサーバー側のコンソールで文字列が表示されたら成功です。
今日はこれぐらいにしておきます。


次回と言いたいのですがネタがありません。
とりあえずRTCのプログラミングの話はやめてマニュアルの書き方でも考えてみるか。
というか本来そういうことを書きたいはずなのですが、何故か方向性が狂ってしまいました。
しばらくはRTCのプログラミングに関する話はやめます。あまり人の役にも立っていないみたいですし、特にやる意味も感じません。












にほんブログ村 科学ブログ ロボットへ
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・

人気ブログランキングへ
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
フリーエリア
最新CM
[08/31 ysuga]
[08/31 Nobu]
[08/31 ysuga]
[12/11 Nobu]
[12/11 Kanamura]
最新TB
プロフィール
HN:
Nobu
年齢:
36
性別:
男性
誕生日:
1988/09/22
職業:
あれ
趣味:
妄想、自堕落
バーコード
ブログ内検索
P R
カウンター
忍者ブログ [PR]