DDS：基本、限界、およびMQTTとの統合について

![DDS：基本、限界、およびMQTTとの統合について](https://assets.emqx.com/images/974836f30e2c083a9334d2839e212a57.jpg?imageMogr2%2Fthumbnail%2F3040x1368)

## DDSの理解

### DDSの紹介

DDS（Data Distribution Service）は、OMG組織が発表したデータ中心のミドルウェアプロトコルおよびAPI標準です。システムコンポーネントを統合して低遅延のデータ接続、高信頼性、高いスケーラビリティを提供し、さまざまな商用グレードのIoTアプリケーションに適しています。

![DDS](https://assets.emqx.com/images/4fe1d6ec1d35cf82bdf769f461d1e514.png?imageMogr2/thumbnail/1520x)

DDSはパブリッシュ-サブスクライブメッセージングプロトコルとして動作し、リアルタイム、信頼性の高い、スケーラブルなデータ配信を可能にします。当初、DDSは産業オートメーションで使用され、大量のデータをリアルタイムで捕捉し、高性能で信頼性の高い制御のために伝送する必要がありました。リアルタイム性能、信頼性、スケーラビリティにより、DDSはすぐに産業オートメーションの標準プロトコルとなりました。長年にわたり、DDSは航空宇宙、自動車、医療など他の分野でも応用されてきました。

![DDS通信](https://assets.emqx.com/images/0cb794d5e2c7daf813c0472ac6ff98f3.png?imageMogr2/thumbnail/1520x)

### DDSの特徴

DDSの核心はデータを中心に展開され、伝送、保存、処理などの機能を含みます。これらの機能は以下の特徴にまとめることができます：

- **データ中心性**：DDSは本質的にどのデータが保存されているかを理解し、その共有方法を管理します。従来のメッセージ中心のミドルウェアとは異なり、プログラマーがデータ共有を指定するコードを書く必要がなく、DDSが内部的にこれを処理します。

- **グローバルデータ空間**：この機能により、すべてのDDSノードが統一された空間にあるかのように同じデータソースにアクセスできます。実際には、DDSノードはメッセージを送信してリモートノードを更新することでデータを共有し、ネットワーク内のすべてのノードが一貫した最新のデータを持つことを保証します。

- **サービス品質（QoS）**：DDSは信頼性、システムパフォーマンス、セキュリティなどのさまざまなQoSパラメータを通じてデータをフィルタリングします。すべてのノードがデータセンターからすべてのデータを必要とするわけではありません。DDSノードはQoSによってフィルタリングされた必要な情報のみを共有します。DDSはデータが意図した宛先に確実に到達するようにし、システムの変化に基づいてデータ伝送を動的に調整し、マルチキャストメッセージを使用して迅速に更新します。セキュリティが重要なアプリケーションでは、DDSはアクセスを制御し、データフローを強制し、リアルタイムでデータを暗号化します。

- **動的ディスカバリー**：DDSはパブリッシャーとサブスクライバーの動的ディスカバリーをサポートし、ノードが事前に設定された通信ポートなしで実行時に互いを見つけることができます。これにより、DDSアプリケーションの「プラグアンドプレイ」機能が可能になります。

- **スケーラブルなアーキテクチャ**：DDSは複数のノードと異なる制御ドメインにわたって水平方向にスケールできます。

- **セキュリティ**：DDSは認証、アクセス制御、機密性、データの整合性を含む強力なセキュリティメカニズムを提供します。

  ![DDSスケール](https://assets.emqx.com/images/c944a141da983a66f8283a0ce2177e9f.png?imageMogr2/thumbnail/1520x)

## 産業におけるDDS

### DDSと産業オートメーション

DDSのスケーラビリティとサービス品質は、信頼性、規模、カスタマイズに焦点を当てた産業オートメーションの要求に合わせて調整されています。以下の主要な分野に対応します：

- **データ収集と伝送**：DDSは産業機器やセンサーからのリアルタイムデータ収集と伝送を可能にします。例えば、ロボット制御システムでは、DDSはPub-Subを使用してロボットセンサーからデータを収集し、位置、速度、角度などのQoSパラメータを通じてフィルタリングし、このデータをコントローラーに送信してロボットの動きを管理します。

- **制御と調整**：DDSは産業機器やシステムの制御に使用され、異なるシステム間の調整を促進します。産業生産制御システムでは、DDSはPub-Sub通信を通じて制御コマンドを送信して生産設備を管理します。水平および垂直スケーリングを通じて、さまざまな生産ユニットや地域間の調整を確保し、生産効率を向上させます。

- **監視と診断**：DDSは産業機器やシステムの状態を監視し、故障を診断します。産業安全システムでは、DDSはグローバルデータ空間機能を活用して、監視されているすべての機器の状態に簡単にアクセスし、異常が検出された場合に警告を発します。

### DDSと自動車

自動車産業では、リアルタイムで信頼性の高いデータ伝送が重要です。DDSはリアルタイムデータ伝送を保証し、さまざまなQoSメカニズムを採用して車両内のデータの信頼性を保証します。自動車分野におけるDDSの主な応用は以下の通りです：

- **車両センシング**：DDSは、レーダー、カメラ、LIDARなどのさまざまな車両センサーからデータを収集し、このデータを車両安全コントローラーに送信して衝突検知と防止を行います。

- **車両制御**：自動運転システムでは、DDSは車両センサーからデータを収集し、自動運転コントローラーに送信します。このコントローラーはデータを処理して、ステアリング、ブレーキ、加速などのアクションを決定し、車両の動きを制御します。

- **車両通信**：DDSは車両ネットワーク内で車車間（V2V）および車両とインフラストラクチャ間（V2I）の通信を促進し、協調走行を可能にします。

- **車両診断**：車両メンテナンスシステムでは、DDSは車両センサーからデータを収集し、故障検出と分析のために診断システムに送信します。

## DDSの利点

### 業界標準

DDSは、OpenFMB、Adaptive AUTOSAR、MD PnP、GVA、NGVA、ROS2などのさまざまな業界プロトコルとシステムフレームワーク標準の基礎となっています。

### 豊富なQoSポリシー

DDSは、データ伝送と通信の品質を管理するための包括的なQoSポリシーセットを提供し、適時性、トラフィックの優先順位付け、信頼性、リソースの制約などの側面に対応します。これらのQoSポリシーは以下のように大まかに分類されます：

- **信頼性**：信頼性の高いデータ伝送を保証します。
- **耐久性**：システム再起動後のデータ保存と回復を管理します。
- **デッドライン**：データの有効期限を指定します。
- **ライフスパン**：データの寿命を定義します。
- **所有権**：データ所有権の移転を制御します。
- **時間ベースフィルター**：時間条件に基づいてデータをフィルタリングします。
- **リソース制限**：データ処理に使用されるリソース（メモリ、帯域幅、プロセッサーなど）を制限します。

これらのQoSパラメータは、データ転送と通信の特定のアプリケーション要件を満たすように設定できます。

### セキュリティ、拡張性、自動発見

DDSは、標準化された認証、暗号化、アクセス制御、ロギングを含む堅牢なセキュリティ機能を提供し、IoTシステムにおけるエンドツーエンドのデータ接続の安全性を確保します。スケーラビリティに関しては、DDSは水平方向と垂直方向の両方に拡張して、多数のデバイスをサポートできます。ポイントツーポイントの遅延を最低30μsまで達成し、1秒あたり数百万のメッセージを処理できます。大規模システムでは、DDSは自動発見とプラグアンドプレイ機能を提供し、システムの展開を簡素化します。

## 現在のDDSの限界

### 異なるDDSミドルウェア間の互換性

DDSミドルウェアは、アプリケーションをオペレーティングシステム、ネットワークトランスポート、低レベルデータフォーマットの詳細から抽象化します。さまざまなプログラミング言語にわたって一貫した概念とAPIを提供し、アプリケーションが異なるオペレーティングシステム、言語、プロセッサアーキテクチャ間で情報を交換できるようにします。ミドルウェアは、データフォーマット、ディスカバリー、接続性、信頼性、プロトコル、トランスポート、QoS、セキュリティなどの基礎となる詳細を管理します。

DDSプロトコルは普遍的に設計されていますが、異なるDDSミドルウェア実装間の互換性は一貫性がない場合があります。特に以下の分野で：

- **バージョンの非互換性**：DDS標準は時間とともに進化するため、異なるバージョンや実装間で潜在的な非互換性が生じる可能性があります。2つの実装が異なるDDSバージョンを使用している場合、通信プロトコル、API、機能が互換性を持たない可能性があります。
- **QoSパラメータの非互換性**：DDS仕様は一連のQoSパラメータを定義していますが、異なる実装は様々なQoSパラメータまたは値をサポートする可能性があり、異なるDDS実装間の相互作用を妨げる可能性があります。
- **データ型の非互換性**：DDSはユーザー定義のデータ型をサポートしていますが、これらは様々な実装によって異なる方法で定義および解釈される可能性があります。実装間でデータ型が一貫していない場合、データの解析や伝送が正しく行われない可能性があります。
- **トランスポートプロトコルの非互換性**：DDSはデータ転送に異なるトランスポートプロトコル（TCP/IP、UDP、共有メモリなど）を使用できます。異なる実装が異なるトランスポートプロトコルを使用する場合、直接のデータ交換が妨げられる可能性があります。
- **シリアル化フォーマットの非互換性**：DDS実装は、データのエンコードとデコードに異なるシリアル化フォーマットを使用する可能性があります。シリアル化フォーマットが異なる場合、データが正しく解析または伝送されない可能性があります。
- **セキュリティメカニズムの非互換性**：DDSはデータ伝送のための暗号化や認証などのセキュリティメカニズムをサポートしています。異なる実装が様々なセキュリティメカニズムや仕様を使用する場合、安全なデータ交換が複雑になる可能性があります。

### クロスドメイン

DDSはクロスドメイン操作をサポートするように設計されていますが、実際には以下のような一般的な問題が発生します：

- クロスドメインパフォーマンスの制限：DDSは同一ドメイン内でよく機能しますが、HTTPやMQTTなどのプロトコルと比較して、ドメイン間では効率が低下します。

- 異なるクロスドメインアプローチ：様々なDDS実装は異なるクロスドメイン戦略を持っています。例えば、FastDDSはしばしばマルチドメイン構成を使用し、CycloneDDSはZenohから実装する傾向があります。

- 同じDDS実

- 装の異なるバージョンでは、ドメイン間通信の方法が異なります。

  ### MCUサポートの欠如

  現在のDDS実装（FastDDS、CycloneDDS、RTI Connext DDSなど）は、MCU（非Linux）上では動作しません。産業オートメーションや自動車分野でのMCUデバイスの普及により、大規模なデバイスサポートにDDSを活用する能力が制限されています。DDS-XRCEというDDSの簡易版はMCUをサポートできますが、まだ未成熟で同様の互換性の問題に直面しています。

  ## MQTTによるDDSの課題への対応

  ### MQTTの紹介

  [**MQTT**](https://www.emqx.com/en/blog/the-easiest-guide-to-getting-started-with-mqtt)は、パブリッシュ/サブスクライブモデルに基づく軽量メッセージングプロトコルで、低帯域幅で不安定なネットワーク環境におけるIoTアプリケーション向けに特別に設計されています。最小限のコードで接続されたデバイスにリアルタイムで信頼性の高いメッセージングサービスを提供します。MQTTは低帯域幅消費、非同期通信、スケーラビリティを特徴とし、大規模なデバイス接続とパブリッシュ/サブスクライブメッセージングモデルに適しています。MQTTプロトコルは、IoT、モバイルインターネット、スマートハードウェア、IoV、スマートシティ、遠隔医療、電力、石油、エネルギー分野で広く使用されています。

  MQTTプロトコルの主な特徴は以下の通りです：

  - 軽量：バイナリデータ形式を使用し、パケットサイズが小さく、帯域幅消費が低い。
  - 非同期通信：クライアントはトピックをサブスクライブしてメッセージを受信でき、アクティブにリクエストする必要がない。
  - スケーラビリティ：複数のQoSレベル、保持メッセージ、最後の遺言メッセージなど、必要に応じて設定できる機能をサポート。
  - データ非依存：ペイロードデータ形式を気にしない。
  - 永続セッション認識：デバイスがオンラインかどうかを常に把握。

  ### MQTTの異なるバージョン間の良好な互換性

  MQTTの主要バージョンはMQTT 3.1、MQTT 3.1.1、[MQTT 5](https://www.emqx.com/en/blog/introduction-to-mqtt-5)です。これらのバージョン間の主な違いは、MQTT 5がMQTT 3.1.1と比較して新機能を導入していることですが、MQTT 5メッセージをMQTT 3.1.1ノードに転送する際にはこれらの新機能が無効化され、通信には影響しません。MQTT 3.1.1はMQTT 3.1のバージョン番号のみを変更し、通信自体には影響を与えません。

  主要な[MQTTブローカー](https://www.emqx.com/en/blog/the-ultimate-guide-to-mqtt-broker-comparison)はすべて3つのMQTTバージョンと互換性があり、すべてのMQTTクライアント間でシームレスな相互作用を保証しています。

  ### MQTTによるクロスドメイン問題の解決

  MQTTとDDSは、通信モデルや分散化など、いくつかの点で異なります。クロスドメイン通信における主な違いを以下の表にまとめます：

  ```
  トランスポート層通信モードプロトコル解析のオーバーヘッド帯域幅消費ドメイン内遅延クロスドメイン遅延
  MQTTTCP, QUICPUB-SUB低低低低
  DDSTCP, UDPPUB-SUB, REQ-REP高高低高
  ```

  表に示すように、DDSはドメイン内通信に優れていますが、MQTTは軽量性によりクロスドメイン通信に有利で、帯域幅使用量と遅延が低くなります。

  DDSはクロスドメイン通信にMQTTを活用できます：

  Show Image

  MQTT-DDSプロキシを導入することで、DDSノードとMQTTノードの両方として機能します。DDSドメインからの必要なデータはMQTT-DDSプロキシを通じてMQTTブローカーに送信され、その後対応するDDSドメインに転送され、DDSクロスドメイン通信を可能にします。このプロセスには2つの重要な考慮事項があります：

  1. DDSメッセージをMQTTメッセージに変換する（およびその逆の）複雑さ。
  2. 追加のMQTT-DDSプロキシによって導入される可能性のあるパフォーマンス低下。

  最初の問題については、変換プロセスはシリアル化のオーバーヘッドを追加するだけで、一般的に無視できます。2番目の問題については、DDSネットワークに単一のノードを導入してもパフォーマンスに大きな影響はありません。代わりに、DDSグローバルデータ空間の設計により、MQTT-DDSプロキシは必要なデータのみを別のドメインに転送し、2つのDDSドメインのノードのデータを直接組み合わせてグローバルデータを一緒に管理するよりもコストが低くなります。

  ### すべてのMQTT機能に対するMCUサポート

  MQTTプロトコルはDDSよりも軽量で、IoT空間でより広く使用されています。poho-c、Adafruit MQTT、[MQTT-SN](https://www.emqx.com/en/blog/connecting-mqtt-sn-devices-using-emqx)など、多くの実装がMCU上での実行をサポートしています。

  これらのオープンソースライブラリに加えて、ほとんどの組込みシステムやフレームワークには独自のMQTT SDK実装が付属しており、通常MQTT 3.1とMQTT 3.1.1のすべての機能を完全に実装しています。

  したがって、MCUからのデータをMQTTを介してDDSネットワークに統合し、より良い互換性を実現できます。

  Show Image

  LANにMQTTブローカーを配置し、MCU上の[MQTTクライアント](https://www.emqx.com/en/blog/mqtt-client-tools)を介してデータをMQTT-DDSプロキシに送信することで、DDSノードの数を減らし、DDSネットワークサイズを縮小し、パフォーマンスを向上させることができます。また、MQTT-DDSプロキシでルールを設定して、必要なデータのみをDDSドメインに渡すこともできます。

  ## NanoMQ DDSProxy: MQTTとDDS間のデータ共有を容易に

  [NanoMQ DDSProxy](https://github.com/emqx/nanomq/blob/master/docs/en_US/gateway/dds.md)は、DDSノードとMQTTノードの両方として機能するMQTT-DDSプロキシです。NanoMQ DDSProxyは、トピックによってデータをフィルタリングすることで、MQTTとDDSネットワーク間でデータを共有できます。主な特徴は以下の通りです：

  - MQTT 3.1、MQTT 3.1.1、MQTT 5のサポート。
  - [ほとんどのIDL構文](https://github.com/nanomq/idl-serial)の解析をサポート。
  - DDSからMQTTへ、およびMQTTからDDSへの両方向の転送ルールをサポート。
  - [共有メモリを介したDDSデータの共有](https://cyclonedds.io/docs/cyclonedds/0.8.2/shared_memory.html)をサポート。
  - TCP、TLS、QUICからMQTTネットワークへのサポート。
  - REST APIサポート。

  NanoMQ DDSProxyは以下のように動作します：

  Show Image

  DDSはメッセージのシリアル化とデシリアル化を内部的に処理し、デシリアル化された構造は上位層アプリケーションでのみ利用可能なため、DDSプロキシはIDLファイルを必要とし、対応するシリアル化とデシリアル化コードを生成してDDS構造をMQTTメッセージに変換します。NanoMQ DDSProxyはMQTTとDDSの両方のノードを統合し、それぞれ別々に初期化する必要があります。初期化後、ノードはDDSとMQTTの両方のネットワークからメッセージを受信します。いずれかのネットワークからメッセージを受信すると、それはシリアル化またはデシリアル化され、設定ファイルで指定されたとおりに転送され、MQTTとDDSネットワーク間のデータ共有を可能にします。