HOME > ソフテックだより > 第475号(2025年6月4日発行) 技術レポート「AWS IoT Coreを用いたMQTT通信IoTデバイス開発」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第475号(2025年6月4日発行)
技術レポート

「AWS IoT Coreを用いたMQTT通信IoTデバイス開発」

1. はじめに

私は入社3年目の本社事業所勤務の社員です。
今回はこれまでに携わった案件のうち、タイトルのMQTT通信とAWS IoT Coreを用いた案件の構成を例として、MQTT通信とAWS IoT Coreについて紹介したいと思います。

2. どういったシステムに利用できるか

例えば、遠隔地からある機器の状態を監視・制御できるようなシステムを構築したいとします。 異常が起きたときだけメール通知するようなシステムではなく、定周期で値を取得できその変化まで監視できるようなシステムです。 また、遠隔地から送信された指令を受信することができ、それを機器に対して指令できるようなシステムです 。
機器は遠隔地にありますから、状態監視のために必要なデータ(機器から直接得られたデータや外部センサーの値)や、機器に対する指令内容はインターネットを通じて送受信する必要があるでしょう。 しかし多くの機器には「インターネットに接続して定期的にデータを送信する」ような機能はありませんので、上記のシステムを構築する際には別途端末を用意してデータ収集と送信を行う手法が考えられます (機器と端末の連携にはModbus通信などが利用されます)。
ここで検討しなければならないのが、端末の通信相手となるサーバーと、データの送信方法すなわちプロトコルです。 サーバーに関しましては、機器の状態監視のためにサーバーを用意することは手間や費用がかかりますし、サーバー側のアプリケーション開発や保守も負担になります。 したがって、サーバーはレンタル可能であり、サーバー側のアプリ開発が最小限となる方法が望ましいでしょう。 またプロトコルに関しましては、状態監視や指令といったことは単純な内容であるため、それに応じてできるだけ簡素で軽量なものが望ましいです。 端末がインターネット接続する際にモバイル回線を使用する場合は、とくに軽量であることが重視されるでしょう。 加えて、データの送信に失敗しても再送可能な仕組みも重要になります。
今回は上記のようなシステムを構築する際のひとつの方法として、AWS IoT Core(サーバー)とMQTT通信(プロトコル)について解説します。

3. MQTTとは

MQTT(Message Queueing Telemetry Transport) とは通信プロトコルの名称であり、このプロトコルでは非同期に1対多の通信を行えることや、メッセージ自体を軽量にすることが可能な点が特徴的です。 インターネットを介して機器との情報のやり取りを行うIoT(Internet of Things)はもちろんのこと、機器同士が情報のやり取りを行うM2M(Machine to Machine)に対しても適したプロトコルです。

3-1. MQTTの構成

MQTTは以下の図のように3つの要素によって構成されます。

MQTTの構成
図1. MQTTの構成

  • Subscriber(サブスクライバー=購読者)
    メッセージの受信者です。
    SubscriberはBroker(後述)に接続し、任意の「トピック」を「サブスクライブ」します。 このトピックとサブスクライブの詳細は後述しますが、これによってPublisher(後述)がBrokerに向けてトピックとデータを送信したときに、 自身がサブスクライブしたトピックのデータのみをBrokerから受信し、それ以外は受信しないということを実現できます。 現実世界における、雑誌などの出版社(パブリッシャー)と購読者(サブスクライバー)と同じ関係性と言えます。

  • Publisher(パブリッシャー=出版者)
    メッセージの送信者です。
    PublisherはBroker(後述)に接続し、「トピック」とデータをひとつのメッセージとして送信します。 先述の通り、Publisherが送信したトピックをSubscriberがサブスクライブしている場合、Subscriberはデータを受信することができます。
    なお、PublisherとSubscriberはそれぞれ異なる機器である必要はなく、Publisher / Subscriberの両方の役割をひとつの機器に対して持たせることが可能です。 「2. どういったシステムに利用できるか」で例として挙げた通信端末の場合、機器のデータ通知はPublisherとして行い、指令を受け取ることはSubscriberとして行う形になります。

  • Broker(ブローカー)
    Publisher – Subscriber間のデータ送受信を仲介します。
    BrokerはPublisher、Subscriberからの接続を受け入れ、Publisherからトピックとデータを受信し、そのトピックをサブスクライブしているSubscriberに対してデータを送信します。
    細かい機能としては他にもあるのですが、Brokerが行うべきことは上記の通りとてもシンプルです。 加えて、PublisherやSubscriberはデータを送信する前の処理(例えばセンサーから値を収集したりなど)やデータを受信した後の処理を自ら実装する必要がありますが、 Brokerに関しては単にデータの受け渡しをすればいいだけで独自の処理を入れ込む必要がありません。 そのためBrokerは新規に開発するのではなく、すでにあるBrokerを使用するほうが効率的です。 すでにあるBrokerの中にはクラウドサービスとして展開されているものもあり、そのうちのひとつがAWS IoT Coreに含まれています。

3-2. トピックとサブスクライブ

さて先述した「トピック」を「サブスクライブ」するということについてですが、これが具体的にどのようなものであるかを説明します。

まず、トピックとは文字列です。 ではどのような文字列かというと、次のようなスラッシュ”/”区切りの文字列となっています。 勘の良い方ならもうわかるかもしれませんが、トピックは階層構造を表す文字列であり、この階層構造を利用してメッセージを受信する範囲を調整することができます。
例えば、A(Publisher)が「/tokyo/shinjuku/yotsuya」や「tokyo/shinjuku/ichigaya」といったトピックを送信するとします。 ここで、B(Subscriber)が「yotsuya」に関するデータのみ受信したい場合は 「tokyo/shinjuku/yotsuya」をサブスクライブすればいいことになります。
では、Bが「tokyo/shinjuku」より下の階層のすべてのデータを受信したい場合はどうすればいいでしょうか。 これに関しては、ワイルドカードを使用することで実現可能です。 ワイルドカードとして使用できる文字には2種類あり、階層の数にこだわらず「tokyo/shinjuku」より下の階層のすべてのデータを受信したい場合は「tokyo/shinjuku/#」でサブスクライブします。 1階層下のすべてのデータを受信したい場合は「tokyo/shinjuku/+」とします。
なお、サブスクライブできるトピックの数はひとつだけではなく、複数のトピックをサブスクライブ可能です。

ところで、「PublisherやSubscriberはどのようにして相手が取り扱うトピックを知ることができるのか」といったことを疑問に思う方がいるかもしれません。この問題の解決方法としては、事前の取り決めによって送受信するトピックを決めておく、ということになります。これはプロトコル上の取り決めというよりも運用上の話ですが、もしMQTT通信で連携する機器同士の開発者が異なる場合、何のトピックを送信するかといったことを事前に決めておきしっかりと管理する必要があります。

3-3. 再送機能とQOS

MQTTには再送の仕組みがあります。再送機能を有効にするには、メッセージを送信する際にQOS(Quality of Service)というパラメータを指定する必要があります。基本的にQOSによる再送の仕組みはメッセージを受信した後のパケット応答によって実現されますが、この応答の義務が発生するのはPublisher→Brokerのメッセージ送信だけでなくBroker→Subscriberのメッセージ送信でも同様です。そのため、以降のQOSの説明ではPublisherやSubscriberといった役割の表記ではなく「送信者」と「受信者」で表現します。
QOSは3段階あり、それぞれ次のように定められています。

  • QOS 0 (Publish once at most)
    送信者は受信者に最高で1回メッセージを送信します。再送機能はありません。
    送信者はメッセージを送信したあと、受信者からの応答を待機しないためメッセージの伝送効率が最も高くなります。 しかし、送信者は受信者へメッセージが届いたか否かをチェックしないため、メッセージが届いていない場合でも何もしません。

    QOS : 0
    図2. QOS : 0

  • QOS 1 (Publish once at least)
    送信者は受信者に最低で1回メッセージを送信します。
    送信者はメッセージを送信したあと、受信者からの「PUBACK」パケットを待機します。もし指定されたPUBACKを受信しなかった場合は再送が行われます。
    なお、受信者がメッセージを受信したにもかかわらず送信者がPUBACKを受信できなかった場合、メッセージが再送されてしまいますので、受信者は重複したメッセージを受信する可能性があります。

    QOS : 1
    図3. QOS : 1

  • QOS 2 (Publish only once)
    送信者は受信者に必ず1回だけメッセージを送信します。
    送信者はメッセージを送信したあと、受信者からの「PUBREC」パケットを待機します。 このPUBRECは受信者がメッセージを受信したことを示します。 その後、送信者は受信者に対して「PUBREL」パケットを送信し、送信済みとなったメッセージを破棄したことを通知します。 受信者は「PUBREL」パケットを受信したあと、送信者に向けて「PUBCOMP」パケットを通知することでメッセージの完了を通知します。

    QOS : 2
    図4. QOS : 2

3-4. セッション

MQTTでは、Publisher/SubscriberとBrokerの接続が途切れてしまった場合の挙動についても策定されています。 MQTTでは接続断後の再接続時に、前回のセッションを再使用するか、あるいは使用せず新たにセッションを開始するかの設定があります。

ここで、セッションとはPublisher/SubscriberとBrokerの接続開始から終了までを指します。 セッションを再使用するとは、接続開始から終了までの状態を引き継ぐということであり、 例えばBrokerがPUBACKを受信していないQOS=1のメッセージを再度送信することや、すでにあるトピックをサブスクライブしていた場合はそれらをサブスクライブした状態でセッションを再開することが可能です。 これによって、状況にもよりますが切断状態中に受信できなかったメッセージを受信することが可能です。
Brokerは複数のセッションを「クライアントID」というパラメータを使用して管理しています。 クライアントIDはBrokerに接続する時点でBrokerに通知し、再接続する際にもBrokerに通知します。 セッションを再使用する設定にしている場合、Brokerは同じクライアントIDの接続があった場合にセッションを再使用します。

MQTTは一般的に信頼性の高い通信プロトコルと言われますが、その理由は上記のQOSやセッションといったプロトコル的な要因以外にBrokerの存在も大きいと言えます。 Publisher/Subscriberが直接通信する場合、通信相手側で通信トラブルが頻発する可能性がありますが、 Brokerを外部サービスによって調達すれば24時間管理された非常に信頼性の高い通信相手との通信の成否のみを気にすればよくなるからです。

4. AWS IoT Coreとは

先述した通りMQTT通信においてはBrokerが必須であり、このBrokerは自ら開発するよりも何らかの形で購入するかレンタルしたほうが開発コストや運用コストが低くなることが期待できます。 今回は、数ある購入・レンタル可能なBrokerのうち、AWS IoT Coreについて紹介します。
AWS IoT Coreとは、言わずと知れたIT企業Amazonが展開するクラウドサービス「AWS」のうち、IoT向けの機能をまとめたサービスです。 こちらのサービスを契約することで、インターネット回線を介してBrokerが利用可能になります。
今回は、実際に「モノ」(AWS IoT Coreでは物理的な機器のことを「モノ」と表現します)の作成から認証・接続までを行いたいと思います。 認証関係の処理は独自に実装することが難しいため、Amazon自身が公開しているSDK(AWS IoT Device SDK)を利用します。 以降は全体の流れの説明のみとし、詳細な説明については省略します。(https://github.com/aws/aws-iot-device-sdk-python-v2)

AWS IoT Coreを使用するまでの流れは概ね以下の図の通りです。
証明書の発行まで完了しましたら、先述したSDKを使用して認証を行います。サンプルとして提供されているコードはコマンド引数として認証ファイルや鍵ファイルのパスを受け取るため、ここで先ほどダウンロードしたファイルを指定します。

モノの作成から証明書の発行まで
図5. モノの作成から証明書の発行まで

  • モノの作成・選択
    モノを作成します。 先述の通りAWS IoT Coreでは物理的な機器のことを「モノ」と表現しますが、モノを作成するとはそれら物理的な機器をアプリ上で管理できるようにするための識別子を与えるようなものです。
    ここでモノとして作成すべきは、AWSと実際に通信する機器です。「2. どういったシステムに使用できるか」を例とすると、別途用意された通信端末が該当します。

  • 証明書の設定
    新しい証明書を自動発行するか、あるいはすでに用意された証明書を使用するかの設定を行います。以下では、新しい証明書を自動発行する設定とした場合を前提にします。

  • ポリシーの選択
    証明書のポリシーを選択します。 ポリシーとは、モノなどのリソースへのアクセス権限です。対象の証明書を使用して認証されたユーザーは、ここで定められたリソースへのアクセス権限に従います。 独自のポリシーを適用したい場合は、ポリシーを作成し選択します。

  • 証明書の発行
    新しい証明書を自動発行する設定を行っていた場合、証明書の発行が行われ、ダウンロードが可能になります。ダウンロードしたファイルは安全な場所に保管しましょう。

5. おわりに

ここまでAWS IoT CoreとMQTT通信についての紹介を行いましたが、はじめに紹介したようなシステムだけでなくその他さまざまなIoTデバイスを開発するうえで利点がありそうだと多くの方々に感じていただけたら幸いです。
ところで、はじめの例にあげたような通信端末は何で作るのがいいでしょうか。機器が設置される場所、耐用年数、消費電力、通信環境などの条件によって、最適な端末は変わってきます。
ソフテックではアプリケーションの開発だけでなく、こうしたアプリケーションを実行するための機器類の選定も行っています。 現場で使用する機器類からプロトコル・サーバーに至るまで、あらゆる範囲をカバーするのは大変なことですが、 これが可能なエンジニアは開発の現場において重宝され、お客様が望むシステムを実現するうえで非常に大きな力を発揮することが可能です。
今後も広範囲にまたがって知識や経験を積み重ねていき、多くの人から信頼されるエンジニアを目指して努力を続けていきたいと思います。

(H.K.)


関連ページへのリンク

関連するソフテックだより

ページTOPへ