IIoTプロトコルの比較：MQTT Sparkplug vs OPC-UA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/fed85444-99df-5453-6afb-8f9a04363ba2.png)

## はじめに

産業用IoTシステムは、データをシームレスに交換するために、効率的で安全な通信プロトコルに依存性があります。この分野では、MQTT SparkplugとOPC UAが2つの有力な候補となっています。このブログでは、MQTT SparkplugとOPC UA、およびその後継機種を包括的に比較し、特定の要件に最も適したプロトコルを明確に理解できるように解説します。

## OPC ClassicとOPC UA

OPC UAの前身はOPC Classic（OPC DAまたはOPC Data Accessとも呼ばれる）で、OPC Foundationが開発した産業用IoTオートメーション規格のプロトコル集です。1996年に発表されたOPC Classic仕様は、ソフトウェアアプリケーションとセンサー、コントローラー、プログラマブルロジックコントローラー（PLC）などの産業用IoTハードウェアデバイスの間でデータを交換するための標準的な方法を定義しています。

しかし、その大きな欠点は、OPC ClassicがMicrosoft Windowsオペレーティングシステムとその独自のDCOMテクノロジーと緊密に統合されていることです。この種の依存関係は、プロトコルの使いやすさ、拡張性、相互運用性、セキュリティ、プラットフォームの独立性を著しく損なうものであり、オープンスタンダードとしては重大な制約となる。

こうした制約に対応するため、OPC Foundationは、OPC Classic仕様の後継として、2006年にOPC Unified Architecture（UA）の策定を開始しました。両方の仕様は、機能的には同等のプロトコルを持ちながら、異なる基礎となる通信技術を使用しています。また、同年にはOPC Classic DA 3.0がリリースされ、現在も使用されています。

## IoTに対応したプロトコル：改善されたMQTT

1990年代後半、Andy Stanford-Clark氏とArlen Nipper氏は、リモートセンサーやデバイスと通信するための軽量プロトコルが必要なパイプライン監視プロジェクトに取り組んでいました。このプロジェクトでは、低消費電力、低帯域幅の環境下でのモニタリング機能が求められていました。しかし、HTTPやSMTPといった既存のメッセージングプロトコルは、この特定のユースケースには重すぎて非効率的であると考えられていました。

これらの課題に対処するため、[**MQTT**](https://www.emqx.com/en/blog/the-easiest-guide-to-getting-started-with-mqtt)はパブリッシュ/サブスクライブ（pub/sub）メッセージングプロトコルとして開発されました。MQTTは、小さなコードフットプリントと最小限の帯域幅要件で設計されており、低電力、低帯域幅の環境での展開に適しています。MQTTの主な目的は、デバイスやシステム間の大規模なリアルタイムデータ交換を容易にすることであり、異なるフォーマットや構造が関与している場合でも、標準化されたデータ通信を可能にします。この特性により、MQTTはIoTやM2M（マシン・ツー・マシン）アプリケーションに特に適しています。

2010年、MQTTはOASIS（構造化情報標準化推進機構）によりオープンスタンダードとして公開され、幅広い組織や業界で利用できるようになりました。その後、2014年にMQTT 3.1.1が登場し、エラー処理の改善やQoS（Quality of Service）レベルのサポートなど、いくつかの新機能が盛り込まれました。そして2019年、カスタムプロパティのサポート、永続的なセッション、エラー報告の改善など、大幅な機能強化を含むMQTT 5.0がリリースされました。

## プロトコールの長所を組み合わせ：OPC UA over MQTT

[**MQTT パブリッシュ/サブスクライブ（pub/sub）**](https://www.emqx.com/en/blog/mqtt-5-introduction-to-publish-subscribe-model)モデルは、従来のOPC UAクライアント・サーバー・モデルと比較して、以下のようないくつかの利点があります：

* スケーラビリティがある：pub/subモデルは、多数のデバイスやシステムを効果的に扱うことができるため、産業オートメーションやIoTアプリケーションに適しています。
* リアルタイムのデータ交換を実現：pub/subモデルは、リアルタイムなデータ交換を可能にするために特別に設計されており、デバイスやシステムが環境の変化に迅速に対応することを可能にします。
* ネットワークトラフィックの削減：pub/subモデルは、すべてのソースからすべてのデータを受信するのではなく、デバイスやシステムが興味のあるデータだけを受信できるようにすることで、ネットワークトラフィックを削減します。

OPC Foundationは、2018年にOPC UA pub/sub仕様を公開しました。この仕様は、OPC UAのパブリッシュ・サブスクライブ通信モデルを定義しており、トランスポートメカニズムとしてMQTT（Message Queuing Telemetry Transport）プロトコルを使用して実装することができます。OPC UAのpub/subモデルは、産業オートメーションやIoTアプリケーションに大きなメリットを提供する強力な新機能です。

## 産業用コネクティビティを強化するMQTT Sparkplugの説明

MQTTプロトコルはIoTシナリオで大きな成功を収めています。しかし、相互運用性の欠如のために産業オートメーションシステムへの適用可能性は限定的です。この制限に対処するために、Cirrus Link Solutionsは2016年にSparkplug仕様を導入し、産業オートメーションシステムでのMQTTの実装を簡素化することを目的としています。この仕様はMQTTメッセージの標準化された形式を確立し、異なるデバイスやアプリケーション間でのデータ交換を容易にしています。

Sparkplugの注目すべき機能の1つは、デバイス間の双方向通信をサポートしていることです。この機能により、デバイスはコマンドを送信するだけでなく、ネットワーク内の他のデバイスから応答を受信できるようになります。

Sparkplugの設計原則を実装するためにMQTTブローカーが最適である5つの重要な概念：[**5 Key Concepts for MQTT Broker in Sparkplug Specification**](https://www.emqx.com/en/blog/5-key-concepts-for-mqtt-broker-in-sparkplug-specification)

## OSI モデル

MQTT と OPC UA は、産業オートメーションおよび IoT アプリケーションで使用される 2 つの汎用なプロトコルであり、両者は使用目的の違いを反映した異なるアーキテクチャと設計を持っています。ここでは、MQTT、OPC UA、およびそれらの亜種を、OSI（Open Systems Interconnection）モデルの観点から比較しています：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/6adbbc6e-46b9-9b08-0f2e-ff5a1a2ad9e3.png)

**トランスポート層:** MQTTとOPC UAのどちらも通信の基盤としてTCP/IPを利用しています。MQTT SparkplugとOPC UA over MQTTの場合、トランスポート層のプロトコルにMQTTを使用します。これらの2つのプロトコルはMQTTのパブリッシュ/サブスクライブモデルを活用しているためです。

**セッション層:** OPC UAには、クライアントとサーバー間の接続を管理するセッション層があります。セッションの確立、認証、暗号化などのタスクを処理します。一方、MQTTにはセッション管理機能がありません。しかし、MQTT Sparkplugはセッション層にSparkplugセッション認識を導入することでこの制限を解消します。

**プレゼンテーション層:** OPC UAにはUA-JSONやUA-バイナリなどの交換データの構造と意味を定義する明確な情報モデルがあります。一方、MQTTには正式な情報モデルはなく、クライアントとサーバー間のデータ通信にトピックベースのメッセージングに依存しています。しかし、MQTT SparkplugはメッセージフォーマットとしてGoogle Protobufを指定することで、MQTTの機能を強化し、このギャップを埋めています。

**アプリケーション層:** MQTTとOPC UAのアプリケーション層プロトコルは大きく異なります。MQTTはトピックを使ってメッセージを整理するパブリッシュ/サブスクライブモデルに従いますが、OPC UAはクライアント/サーバーモデルを採用し、階層的なオブジェクトモデルを使ってデータを整理します。OPC UA pub/sub仕様はOPC UAのクライアント/サーバーモデルの解決策として機能します。

## MQTT SparkplugとOPC UAを比較する

MQTT SparkplugとOPC UAは産業用IoT向けの人気の高いプロトコルで、特定のユースケースに応じて、どちらか一方が他方より適している場合があるような強みと弱みがあります。これら2つのプロトコルとそのバリアント間の主な違いは次のとおりです。

![Xnip2023-06-12_17-18-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469027/7e31416a-aeb2-b4f0-c595-5582ea4458fe.jpeg)

つまり、OPC UAはオープンスタンダードであり、データ型の仕様がしっかりと盛り込まれているのです。一方、MQTT Sparkplugもオープンスタンダードですが、OPC UAと比較してデータ型の標準化に関する取り組みが少ないです。そのため、MQTT Sparkplugはデータ送信時のプロトコルのオーバーヘッドが少なくなっています。

## まとめ

MQTT Sparkplugは、軽量なメッセージングプロトコルを採用しているため、帯域幅の狭いネットワークや信頼性の低いネットワークに適しています。一方、OPC UAは、より大容量のデータを扱うことができる堅牢なメッセージングプロトコルを採用しており、高速で安全なネットワークに適しています。

OPC UAとMQTTの競争は現在も続いている。EMQは自動車業界向けに[**MQTT over QUIC**](https://www.emqx.com/ja/blog/mqtt-over-quic)プロトコルを導入し、OPC FoundationはOPC UA over TSN (Time-Sensitive Networking)を発表しています。OPC UA over TSNは、複雑な産業オートメーションや制御システムの合理化を目指し、Ethernetネットワーク上でリアルタイムデータを伝送するための標準的な方法を提供します。

元々は [www.emqx.com](https://www.emqx.com/ja/blog/a-comparison-of-iiot-protocols-mqtt-sparkplug-vs-opc-ua) で公開されました