Question

I am trying to run a waveform with components operating on distinct machines. That is, I want A->B where component A runs on the GPP on machine 1 and component B runs on the GPP on machine 2. The CORBA nameserver on system A is visible in REDHAWK on system B, but I cannot access remote devices or components when I run a waveform. How can I make the devices on one machine available to REDHAWK running on another?

Thanx for your assistance!

-jerhill

Was it helpful?

Solution

The essential thing for spreading REDHAWK components and devices across multiple machines is making sure that your CORBA communication works correctly between the machines. This usually amounts to configuring /etc/omniORB.cfg correctly. First, on one machine, you should have omniNames and omniEvents running, and setup your config per section 2.6 of the documentation. For reference:

InitRef = NameService=corbaname::127.0.0.1
InitRef = EventService=corbaloc::127.0.0.1:11169/omniEvents

On the second machine, your InitRef's must point to the first machine. If the first machine was 192.168.1.100, then your second machine's config could contain:

InitRef = NameService=corbaname::192.168.1.100
InitRef = EventService=corbaloc::192.168.1.100:11169/omniEvents

You should be able to verify this is working correctly on the second machine with:

$ nameclt list

The next issue you need to tackle is making sure that CORBA objects are listening on the appropriate network interfaces, and are publishing information in their IORs that allows them to be reached. In each of your config files, I recommend you add a line to tell omniORB what endpoint CORBA objects created on that machine should listen on. For example, on your first machine:

endPoint = giop:tcp:192.168.1.100:
endPoint = giop:unix:

This tells omniORB that CORBA objects should listen on a TCP port of their choosing on 192.168.1.100. It also adds a Unix pipe for fast access by objects on the same machine. omniORB will publish this information in the IOR for that object. What you choose here is important - if you use an IP that other machines can't reach, or use a hostname that other machines can't resolve then CORBA connections will fail.

After you've configured the endPoint setting on both machines, you may find it useful to inspect the information contained in your IORs. If you can access the naming service then you can retrieve IORs for your objects. For example, if you had a domain named 'REDHAWK_DEV' running, you can get the domain manager's IOR via:

$ nameclt resolve REDHAWK_DEV/REDHAWK_DEV

Then, feed the IOR to catior:

$ catior IOR:012345...

catior will decypher the IOR for you and show you what address and port a client would connect to.

OTHER TIPS

Based on the fact that programs on B can see the name service on A, then I assume that the problem relates to Device/Device Manager configuration.

Make sure that the Device Manager on B meets these criteria:

  • the id attribute of the deviceconfiguration element of the dcd.xml file is unique
  • the id attribute of the GPP's componentinstantiation element on the dcd.xml file is unique
  • the name attribute of the namingservice element on the dcd.xml file is the Domain you are trying to connect to (of the form DomainName/DomainName)
  • you do not have a Domain Manager running on B that has a colliding name with the Domain Manager on A (an error should occur if you do that)

If these criteria are met and your system still does not work, please post the stdout from running nodeBooter from command-line for both the Device Manager that's not registering and the Domain Manager you're trying to register with.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top