Hello,
I am using RTI ConnextDDS with ROS2 on a distributed embedded system consisting of two computers connected to one another over a WiFi mesh link. These two computers are the only participants in the network, neither have internet access.
My WiFi radio support DSCP/DiffServe. I have sucessfully been able to use Routing Service to forward traffic from domain 0 (local computer) to domain 1 (Wireless Route) while setting the DSCP field so traffic is prioritized at the radio using the DSCP field.
The first issue I faced was that domain 0 traffic was being sent over the WiFi mesh link, even if there was no subscribers on domain 0 of the other computer. I was able to fix this by adding `<creation_mode>ON_DOMAIN_AND_ROUTE_MATCH</creation_mode>` to the input participant on the domain 0 to domain 1 route, and the same on the output participant on the domain 1 to domain 0 route.
The issue I face now is that once subscription starts using this configuration, even if the subscriber dies and stops sending acks, it will continue to send the topic data over the link. I need to insure that a subscription dies if there is no valid DataReader on domain 0 of the recipiant computer.
I can provide wireshark traces if that is helpful, but attached is my current configuration file.
I tried to add ON_DOMAIN_AND_ROUTE_MATCH to all participants in the routing service configuration file, but when I do this, I get no communication at all, and wireshark shows ICMP "Port Unreachable" errors in both directions durng the discovery phase. I have attached a screenshot of what this looks like in wireshark, both the config and the screenshot are in the .zip file.
Thanks for any insight,
Gabe
code
Attachment | Size |
---|---|
![]() | 184.47 KB |
ON_DOMAIN_MATCH = true, when there is a matching endpoint (for <output> a DataReader, for <input> a DataWriter) in the domain
ON_ROUTE_MATCH = true, if the other side has been created (for <output> if the <input> was created, for <input> if the <output> was created)
I assume that you are running the Routing Service twice. So you have
App1 (domain 0) --> RS1 (domain 0 <input> to domain 1 <output>) --> RS2 (domain 1 <input> to domain 0 <output>) --> App2 (domain 0)
And you only want data to go over domain 1 if App2 is running (and have subscribed to the topic that App1 is sending).
If so, then, you want the Topic Route from domain 1 to domain 0 to have
<input> ON_ROUTE_MATCH
<output> ON_DOMAIN_MATCH
And for the Topic Route from domain 0 to domain 1 to have
<input> ON_ROUTE_MATCH
<output> ON_DOMAIN_MATCH
This will cause the output of the route in RS2 to be created only if App2 is running, which will cause the input of the route in RS2 to be created, which will cause the output of the route in RS1 to be created which will cause the input of the route in RS1 to be created.
And if App2 shuts down, then it will trigger a cascade of deletions of <outputs> and <inputs>.