通过防火墙隧道传输红鹰组件CORBA接口



我有一个特殊的问题,我正在努力解决,这个问题涉及使用红鹰组件通过防火墙实现的接口
我在omniORB站点上找到了以下如何通过防火墙隧道传输CORBA接口的方法(向下滚动到SSH隧道w/omniORB):

http://www.omniorb.net/omniwiki/UsefulTips

简言之,操作指南说在隧道的一侧启动服务器(用名称服务注册接口对象),然后使用omniORB工具"nameclt"one_answers"convertior"将IOR修改为指向隧道的另一侧,并将IOR重新绑定到接口对象。

使用omniORB Echo示例,我可以成功地使用上面的技术来隧道传输GIOP消息,并让一台机器上的客户端通过隧道访问另一台机器的Echo接口。(假设隧道两端的两台机器都可以看到名称服务)。

我遇到的问题是使用Redhawk组件复制这种技术。如果我有一个实现"echo"接口的组件,我不清楚如何检索IOR并使用上面的技术进行修改,以便隧道另一端的组件可以看到它。我看不到向名称服务注册的接口,只有托管该组件的域和设备管理器。我可能错了,但我相信这是因为SCA CF将这些接口封装在域管理器/设备管理器中。

我想我可以使用Redhawk Python环境来获得我想要的东西,但我不确定如何继续。我相信我可以得到如下的域、设备、接口和IOR:

from ossie.utils import redhawk
from omniORB import CORBA
orb = CORBA.ORB_init(0, CORBA.ORB_ID)
dom1 = redhawk.attach("Domain1")
device1 = dom1.devices[0]
echoIF = device1.getPort("EchoIn")
echoIOR = orb.object_to_string(echoIF)

这似乎给了我Echo接口的IOR(使用catior工具显示正确的接口),但我不确定如何继续。我尝试复制IOR,并在终端中使用"convertior"来修改IOR,然后在Python中使用命名服务来重新绑定:

namesvc = orb.resolve_initial_references("NameService")
namecontext = namesvc._narrow(CosNaming.NamingContext)
namecontext.rebind(echoIOR, echoIF)

但这引发了一个异常"Expecting sequence,get-type'str'"。看看rebind接口,我可能需要一个对象键来配合IOR,但我不知道如何获得它。我希望Python环境只允许我使用对象引用作为参数来重新绑定IOR,特别是因为orb提供了一种直接在对象引用和IOR字符串之间切换的机制。

另一个问题是,假设客户端组件在隧道另一侧的另一个域中运行,一旦我成功地重新绑定了服务器IOR,客户端组件如何让它解决连接?如果名称服务中没有按名称列出接口,那么客户端域将如何查看它?

我觉得我离这项工作很近了——我只是错过了一两步。如有任何帮助,我们将不胜感激。

重新绑定操作需要一个CosNaming名称和一个引用。名称的形式为"naming_context/object_name",但需要将其放入类CosNaming.NameComponent的序列中。omniORB包括一个助手:

from omniORB import URI
name = URI.stringToName("naming_context_1/naming_context_n/object_name")

所以在你的情况下:

echoName=URI.stringToName('name_in_nameservice')
namecontext.rebind(echoName, echoIF)

如果您使用nameclt查看名称服务,您将在那里看到您的绑定。

设置您的系统以能够通过防火墙工作是非常特定于配置的,所以我提供见解的能力非常有限

最新更新