Connext DDSを使用してリアルタイム ネットワークに接続する
はじめに
このユースケースは、複数のリアルタイムのローカル ネットワークを接続しようとしている場合、または広域ネットワーク (WAN) を介して単一のリアルタイムなローカル ネットワークを別のネットワークに接続しようとしている場合に適用されます。このソリューションは、各ローカル エリア ネットワーク (LAN) サイトが、大量のデータ配信を行う多数のRTI Connext DDSアプリケーションのクラスタであり、WANを経由してデータが送られるべきではないときのユースケースをサポートします。また、このソリューションはサイト間に地理的な距離があり、帯域幅を節約する必要がある場合のユースケースをサポートします。いくつかの例を、以下に示します:
- 広域ネットワークを介してロボットを制御または監視する
- リモート モニタリング ステーションから多数の装置を監視する
- リモート サイト間でリアルタイムのレーダー情報を送信する
- パブリック ネットワークを介して複数の車両を監視する
- UAV(無人航空機)とグランド ステーション間の通信を行う
RTI Connext DDSは、LAN内またはオプションとしてWANを介して、リアルタイム データの送信が可能な高パフォーマンスのピアツーピア ミドルウェアです。RTI Connext Professionalの一部であるRTI Routing Serviceでは、異なるサブシステム間でデータのサブセットを結合することができます。ここでは、Routing Serviceは、広域ネットワークを介してローカル データのサブセットを送信するのに使用されます。
WANを介して2つのリアルタイム ネットワークを接続する必要がある場合、この設定を使用して通信を行えます。
このサンプルで説明すること
このサンプルでは、2つのLAN環境を表す2つの論理サブシステムについて説明します。これらのLAN環境は、同じネットワークで実行する場合、DDS ドメイン によって論理的に分離されています。複数のネットワークで実行する場合は物理的に分離されます。
単一のLANで実行しているアプリケーションは、温度センサとアラームからサンプル データを生成しています。これらの2つのデータ ストリームは、「Temperature(温度)」と「Alarm(アラーム)」という名前が付けられたDDSトピックを使用してモデリングされています。温度センサは「Temperature(温度)」データの定期的な書き込みを実行します。またアラーム ライターは「Alarm(アラーム)」データの書き込みを実行しますが、アラームは温度が100度を超えたか、32度以下になった場合のみ送信します。
Routing Serviceは、アラーム データがWANを通過できるようにしながら、32 〜 100度の温度範囲内にある温度データのフィルタリングを実行して、これらのデータがWANを介して送信されることを防止するように設定されています。 この温度範囲外のデータのみを送信することによって帯域幅の節約が実現します。
またこのサンプルでは、ランタイムでRouting Serviceの設定を更新する方法について説明します。これは、Routing Serviceが通信しているIPアドレスを更新したり、異なるデータがWANを通過することを許可するためにフィルタリングされているデータを変更するなど、さまざまな形で使用できます。
サンプルの実行
サンプルをダウンロード
サンプルファイルをダウンロードし [ Linux | Windows ] 、選択した場所に解凍します。このドキュメントの場所をEXAMPLE_HOMEとして参照します。
あらかじめビルドされた実行可能ファイル無しにサンプルのソースコードを表示してダウンロードするには、 RTI Community DDS使用例リポジトリGitHubをご利用ください。
これは以下の目的の設定ファイルを提供します:
- WANの設定でRTI Routing Serviceを実行する
- 関連データを提供するために、LuaでRTI Prototyperを実行する
RTI Connext DDS Professionalのダウンロード
RTI Connext DDS Professionalをまだインストールしていない場合は、ダウンロードしてインストールしてください。 30日間の試用ライセンス で、製品を試すことができます。ダウンロードには、サンプルを実行するために必要なライブラリと、分散システムの可視化およびデバッグに使用できるツールが含まれています。
これはWANを介してデータを結合するのに使用されるRTI Routing Serviceを提供します。
サンプルの実行
このサンプルを実行するには、すべてのプラットフォームで、2つの環境変数を設定する必要があります。
まず最初に実行する必要があるのは、ROUTER_HOMEと呼ばれる環境変数を設定することです。この環境変数は、RTI Connext DDSインストール内のRTI_Routing_Service_5.1.0ディレクトリを指している必要があります。環境変数の設定方法の詳細については、 RTIコアライブラリとユーティリティ入門ガイドを参照してください。
このサンプルでは、NDDSHOMEと呼ばれる環境変数も設定する必要があります。これは、RTI Connext DDSインストール内のndds.x.x.xディレクトリを指している必要があります。
環境変数の設定後、EXAMPLE_HOME\ExampleCodeに移動するか、ディレクトリをEXAMPLE_HOME\ExampleCodeに変更して、起動スクリプトと設定を検索します。
ライター アプリケーションを起動するn
バッチ ファイル「scripts\StartSend.bat」またはシェル スクリプト「scripts/StartSend.sh」を実行します
これにより、DDSドメイン6にデータが送信されます。
リーダー アプリケーションを開始する
バッチ ファイル「scripts\StartReceive.bat」またはシェル スクリプト「scripts/StartReceive.sh」を実行します
これにより、ドメイン5でデータが受信されます。これら2つのドメインは論理的に分離されているため、このアプリケーションはRouting Serviceを実行するまでデータを受信しません。
Routing Serviceの設定
このサンプルには、3つのRouting Serviceの設定ファイルが含まれています。最初のファイルは、UDPを使用してLANで実行することを可能にします。 2番目のファイルは、TCPを使用してLANで実行することを可能にします。3番目のファイルは、WANで実行することを可能にします。
- 設定1は、ドメインを使用した論理ネットワークの分離を示します
- 設定2は、ドメインとトランスポートの両方を使用した論理ネットワークの分離を示します
- 設定3は、ドメイン、トランスポート、ルータ、NATを使用したネットワークの分離を示します
設定1
最初の設定では正しく機能するための変更を行う必要がないため、この設定を実行することから開始します。
設定2
その後、2番目の設定を実行します。2番目の設定を実行するために、いくらか変更を行う必要があります。
設定3
最後に、WANへの接続を必要とする最後の設定とポートを開くためのルータの設定機能を実行します。
UDP LAN設定を使用してRouting Serviceを開始する
UDP LAN設定でRouting Serviceを開始するには、以下のコマンドを入力します:
scripts\StartRouterUDPLAN.bat Router1 scripts\StartRouterUDPLAN.bat Router2
サンプル出力
XMLファイルを変更して、すべてのアプリケーションを開始したら、この出力と同様の出力が表示されるはずです。温度データが32〜100度の範囲内にある場合はRouting Serviceによってフィルタリングされるため、即時出力が表示されない場合があることに注意してください。XMLファイルのフィルタリングの設定を変更してコンテンツフィルタリングを無効にするか、フィルタ値を変更することができます。
DataReader "AlarmReader" received sample 3 on Topic "Alarm" sent at 1373936124.699991 s
appID: 234
alarmType: TOO_COLD
alarmLevel: WARNING
DataReader "TemperatureReader" received sample 16 on Topic "Temperature" sent at 1373936125.699991 s
appID: 234
value: 30.000000
DataReader "TemperatureReader" received sample 17 on Topic "Temperature" sent at 1373936126.699991 s
appID: 234
value: 29.000000
DataReader "TemperatureReader" received sample 18 on Topic "Temperature" sent at 1373936127.699991 s
appID: 234
value: 28.000000
設定2でRouting Serviceを開始する:TCP LANの設定
注意: これらのファイルを実行する前に、正しいIPアドレスを含めるように、Routing-TCP-LAN.xml設定ファイルを編集する必要があります。2つのRouting Serviceインスタンスを実行しているため、Router1とRouter2の両方の設定セクションで設定を変更する必要があります。
<!-- CHANGE THIS TO THE MACHINE YOU WANT TO CONTACT --> <!-- NOTE: do not change the port unless you change --> <!-- the server_bind_port the OTHER configuration --> <!-- specifies --> <element>tcpv4_lan://10.211.55.3:9401</element>
ミドルウェアによって開かれているポートを変更する必要がある場合、ここで変更を行うことができますが、 もうひとつのRouting Serviceの設定を一致させるように更新する必要があります。
<!-- Change this to the local port you want to use --> <!-- If you change this, you must change the initial --> <!-- peers of the OTHER Routing Service configuration --> <element> <name>dds.transport.TCPv4.tcp1.server_bind_port</name> <value>9400</value> </element>
XMLを編集したら、Routing Serviceの各インスタンスを開始するバッチファイルを実行します:
scripts\StartRouterTCPLAN.bat Router1 scripts\StartRouterTCPLAN.bat Router2
設定3でRouting Serviceを開始する:TCP WANの設定
注意: これらのファイルを実行する前に、正しいIPアドレスとパブリック ポートを含むように、Routing-TCP-WAN.xml設定ファイルを編集する必要があります。ネットワークがNATを使用している場合、RTI Routing Serviceによって使用されている内部ポートにパブリックポートのセットをマッピングするようにルータを設定する必要もあります。ルータの設定に関する追加情報は、以下の DomainParticipantsとWANの設定セクションで参照できます。
<initial_peers> <!-- --> <!-- CHANGE THIS TO THE MACHINE YOU WANT TO CONTACT --> <!-- NOTE: Both the IP address and port MUST MATCH --> <!-- the public address used by the other --> <!-- configuration --> <!-- --> <element>tcpv4_wan://18.181.0.32:8500</element> </initial_peers> ... <!-- CHANGE THIS TO THE PUBLIC ADDRESS OF YOUR --> <!-- LOCAL MACHINE. YOU WILL HAVE TO FORWARD A --> <!-- PORT THROUGH YOUR FIREWALL/ROUTER TO MAP --> <!-- FROM THIS PUBLIC PORT TO LOCAL PORT 9400 --> <element> <name>dds.transport.TCPv4.tcp1.public_address</name> <value>18.181.0.31:8500</value> </element> <!-- Change this to the local port you --> <!-- configure in your router/firewall --> <element> <name>dds.transport.TCPv4.tcp1.server_bind_port</name> <value>9400</value> </element>
XMLを編集したら、Routing Serviceの各インスタンスを開始するバッチファイルを実行します:
scripts\StartRouterTCPWAN.bat Router1 scripts\StartRouterTCPWAN.bat Router2
その他の重要点
3つのRTI Routing ServiceのXML設定ファイルはそれぞれ非常に似ています。ファイルはすべて、データストリームの通過が許可されているRouting Serviceが稼働するドメインの設定とそのデータ ストリームのQoSの設定を含みます。もっともシンプルな設定にはこれ以上の設定は含まれていません。より複雑な設定では、TCPトランスポートの情報も指定します。
これらの設定に3つの主要なコンポーネントがあることを覚えておく必要があります。
ルート設定
これら3つのサンプル設定はすべて、2つのRTI Connext DDSトピックが2つのRouting Serviceインスタンスを介して送信されることを示します。Routing Serviceは、すべてのトピックまたはトピックのサブセットのルートを設定できます。このケースでは、Routing Serviceは、タグを使用して、温度とアラームのトピックのみを送信するように明示的に設定されています。LAN内のその他のトピックは、WAN上でRouting Serviceを通じて送信されません。
<topic_route name="AlarmForward"> ... <!-- The DomainParticipant in domain 6 that uses UDP --> <input participant="1"> <topic_name>Alarm</topic_name> ... </input> <!-- The DomainParticipant that uses TCP in domain 0 --> <output> <topic_name>Alarm</topic_name> ... </output> </topic_route>
トピックルートは一方向性です。そのため、WANを介してトピック データを両方向に送信したい場合、2つのトピックルートを作成する必要があります。前方と後方のトピックルートの唯一の違いは、入力に設定されているDomainParticipantです。
データモデルとQoSの考慮事項
状態データ
このサンプルで送信されているアラームデータは、状態データのパターンに従います。これが意味することは、このデータは常に変化していないこと、またネットワークに後でアクセスするあらゆるアプリケーションにとってデータが取得可能である必要があるということです。
TRouting Serviceは、TCPを使用してデータを送信します。その結果、トランスポートレベルでの信頼性が向上します。しかしデータの移動速度がRouting Serviceによって処理可能な範囲を超えている場合は、Routing Serviceでデータの上書きを防止できないことがあります。これはアラームの更新が急増した場合、Routing Serviceが対応できない可能性があることを意味します。さらに、最新のアラームデータは、オンラインになる新しいすべてのクラスタに送信される必要があります。この機能をサポートするには、アラームデータにおいてRELIABLEの信頼性とTRANSIENT_LOCALの耐久性を有効にするように設定する必要があります。
<datareader_qos name="StateDataReader"> ... <reliability> <kind>RELIABLE_RELIABILITY_QOS</kind> </reliability> <durability> <kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind> </durability> <history> <kind>KEEP_LAST_HISTORY_QOS</kind> <depth>1</depth> </history> </datareader_qos> <datawriter_qos name="StateDataWriter"> ... <reliability> <kind>RELIABLE_RELIABILITY_QOS</kind> </reliability> <durability> <kind>TRANSIENT_LOCAL_DURABILITY_QOS</kind> </durability> <history> <kind>KEEP_LAST_HISTORY_QOS</kind> <depth>1</depth> </history> </datawriter_qos>
周期的データ
温度トピックは周期的に送信されます。必然的に温度トピックの更新情報を取得し損なうことが考えられるため、Routing ServiceはBEST_EFFORTの信頼性を使用するように設定されています。TCPトランスポートは温度データがWANを介して2つのRouting Servicesk間で確実に送信されるようにしますが、Routing Serviceのキューで内部的に上書きされないという保証はありません。
<datareader_qos name="SensorDataReader"> <reliability> <kind>BEST_EFFORT_RELIABILITY_QOS</kind> </reliability> </datareader_qos> <datawriter_qos name="SensorDataWriter"> <reliability> <kind>BEST_EFFORT_RELIABILITY_QOS</kind> </reliability> </datawriter_qos>
Reliability QoS(信頼性QoS)のほか、WANを介して周期的データが移動してはならない場合、データのコンテンツに基づいて、一部の周期的データをフィルタリングするオプションを選択できます。このオプションは、トピックルート内のタグを使用して設定できます。フィルタの文字列は、SQL文のWHERE句に似ています。このサンプルでは、フィールド「値」が100以上で32以下の場合のみ、WANを介して温度データを送信させる必要があります。
<content_filter> <expression>value > 100 OR value < 32</expression> </content_filter>
DomainParticipantsとWANの設定
WANを介して通信を行っているRouting Serviceの設定は、Routing-TCP-WAN.xmlファイルに含まれています。WANを介してデータを送信するのに必要な設定ファイルはこれだけです。このファイルには、WANのエッジのいずれかで実行している2つのRouting Serviceインスタンスのそれぞれに対する設定セクションが含まれています。
Routing Serviceインスタンスが使用すべき ドメイン と トランスポート を設定するには、Routing Serviceの各インスタンスに対して少なくとも2つのDomainParticipantsを設定する必要があります。 DomainParticipantsは、とタグを使用して設定されます。ここで以下を指定する必要があります:
- 各DomainParticipantで使用したいドメイン ID。
- 各DomainParticipantで使用したいトランスポート。
- 検出の開始時に各DomainParticipantが通信すべき最初のピア。
- 通信を開始するのにDomainParticipanが使用するTCP通信モード(対称または非対称)。(このサンプルでは対称通信のみについて説明しますが、 Routing Serviceユーザー マニュアルで非対称モードの詳細を参照できます)
DomainParticipantのトランスポート設定は、タグで参照できます。使用すべきトランスポート、パブリック アドレスを使用してリモート アプリケーションに通信する方法に関する情報が含まれています。パブリック アドレスと各LANのアドレス間のマッピングを実行する必要があります。
<participant_qos> <!-- Turning off the shared memory and UDPv4/UDPv6 transports --> <transport_builtin> <mask>MASK_NONE</mask> </transport_builtin> <discovery> <initial_peers> <!-- --> <!-- CHANGE THIS TO THE MACHINE YOU WANT TO CONTACT --> <!-- NOTE: Both the IP address and port MUST MATCH --> <!-- the public address used by the other --> <!-- configuration --> <!-- --> <element>tcpv4_wan://18.181.0.32:8500</element> </initial_peers> </discovery> <property> <value> <element> <name>dds.transport.load_plugins</name> <value>dds.transport.TCPv4.tcp1</value> </element> <element> <name>dds.transport.TCPv4.tcp1.library</name> <value>nddstransporttcp</value> </element> <element> <name>dds.transport.TCPv4.tcp1.create_function</name> <value>NDDS_Transport_TCPv4_create</value> </element> <element> <name>dds.transport.TCPv4.tcp1.parent.classid</name> <value>NDDS_TRANSPORT_CLASSID_TCPV4_WAN</value> </element> <!-- CHANGE THIS TO THE PUBLIC ADDRESS OF YOUR --> <!-- LOCAL MACHINE. YOU WILL HAVE TO FORWARD A --> <!-- PORT THROUGH YOUR FIREWALL/ROUTER TO MAP --> <!-- FROM THIS PUBLIC PORT TO LOCAL PORT 9400 --> <element> <name>dds.transport.TCPv4.tcp1.public_address</name> <value>18.181.0.31:8500</value> </element> <!-- Change this to the local port you --> <!-- configure in your router/firewall --> <element> <name>dds.transport.TCPv4.tcp1.server_bind_port</name> <value>9400</value> </element> </value> </property> </participant_qos>
この設定の詳細は、 RTI Routing Serviceユーザー マニュアルの第7章で参照できます。
次のステップ
ランタイムに設定を変更する
RTI Routing Serviceの設定は、Routing Serviceで使用されるフィルタの変更を含め、ランタイムに変更することができます。パラメータによっては、更新を行う前にRouting Serviceを無効にする必要がある場合や、最初にRouting Serviceを無効にする必要なしにランタイムに変更できる場合があります。最初にRouting Serviceを無効にする必要のない、コンテンツ フィルタのパラメータをランタイムに更新する操作について説明します。
RTI Routing Serviceシェルを使用してコンテンツ フィルタを更新するには、まず、ディレクトリをEXAMPLE_HOME/ExampleCode/routingディレクトリに変更します。次に、シェルを開きます。このサンプルでは、管理コマンドはドメイン3に送信されます:
"C:\Program Files\rti_connext_dds-5.3.0\bin\rtirssh.bat" - domainId 3
この操作により、2つのRouting Serviceアプリケーションにコマンドを送信できるようになります。各コマンドには、2つの重要な要素が含まれています:
- コマンドを実行しているRouting Serviceインスタンスの名前
- コマンドが単一のエンティティに固有である場合(特定のtopic_routeなど)は、階層内のそのエンティティの識別子。この識別子は、それぞれ「::」で区切られた、親エンティティとコマンドを実行しているエンティティを含みます。
このケースでは、設定のこの部分でフィルタ式を更新することが推奨されます。
<routing_service name="Router1"> ... <domain_route name="DataDomain"> ... <session name="SessionForward"> <topic_route name="TemperatureForward"> ... <content_filter>
Routing Serviceの設定を更新するコマンドは、以下のパラメータを含みます:
update <target_routing_service> [<entity_name>] [<xml_url>|<assignment_expr>] [remote|local]
このサンプルでは、コンテンツがフィルタリングされたトピックに対して変更されたパラメータを含む、Filter-Update.xmlという名前のファイルを作成します。このファイルの値でRouting Serviceを更新するには、以下を入力します:
update Router1 DataDomain::SessionForward::TemperatureForward Filter-Update.xml local
コマンドの最初のパラメータはルータの名前、次に変更している階層のエンティティ。3番目のパラメータは、更新情報を含むファイル名です。最後のパラメータは、ファイル パスがRouting Serviceアプリケーションではなく、Routing Serviceシェルにローカルであることを指定します。
Luaの詳細
このサンプルでは、Luaを使用して関連データ セットを生成します。この機能に関する詳細は、 コミュニティ ポータルのこのサンプルで参照できます。
コミュニティに参加する
コミュニティに参加する に、質問を投稿してください。
これらの RTIコミュニティGitHub でCase + Codeでのサンプルに貢献してみましょう。 指示を使用して、
RTI Connext DDSの詳細
RTI Connext DDS製品ファミリーの詳細を参照して、RTI Connext DDS製品が分散システムの構築にどのように貢献できるかをご確認ください。 まだお済みでない場合は、 無料評価版をダウンロードしてください。