「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私は入社3年目の本社事業所勤務の社員です。
今回はこれまでに携わった案件のうち、タイトルのMQTT通信とAWS IoT Coreを用いた案件の構成を例として、MQTT通信とAWS IoT Coreについて紹介したいと思います。
例えば、遠隔地からある機器の状態を監視・制御できるようなシステムを構築したいとします。
異常が起きたときだけメール通知するようなシステムではなく、定周期で値を取得できその変化まで監視できるようなシステムです。
また、遠隔地から送信された指令を受信することができ、それを機器に対して指令できるようなシステムです 。
機器は遠隔地にありますから、状態監視のために必要なデータ(機器から直接得られたデータや外部センサーの値)や、機器に対する指令内容はインターネットを通じて送受信する必要があるでしょう。
しかし多くの機器には「インターネットに接続して定期的にデータを送信する」ような機能はありませんので、上記のシステムを構築する際には別途端末を用意してデータ収集と送信を行う手法が考えられます
(機器と端末の連携にはModbus通信などが利用されます)。
ここで検討しなければならないのが、端末の通信相手となるサーバーと、データの送信方法すなわちプロトコルです。
サーバーに関しましては、機器の状態監視のためにサーバーを用意することは手間や費用がかかりますし、サーバー側のアプリケーション開発や保守も負担になります。
したがって、サーバーはレンタル可能であり、サーバー側のアプリ開発が最小限となる方法が望ましいでしょう。
またプロトコルに関しましては、状態監視や指令といったことは単純な内容であるため、それに応じてできるだけ簡素で軽量なものが望ましいです。
端末がインターネット接続する際にモバイル回線を使用する場合は、とくに軽量であることが重視されるでしょう。
加えて、データの送信に失敗しても再送可能な仕組みも重要になります。
今回は上記のようなシステムを構築する際のひとつの方法として、AWS IoT Core(サーバー)とMQTT通信(プロトコル)について解説します。
MQTT(Message Queueing Telemetry Transport) とは通信プロトコルの名称であり、このプロトコルでは非同期に1対多の通信を行えることや、メッセージ自体を軽量にすることが可能な点が特徴的です。 インターネットを介して機器との情報のやり取りを行うIoT(Internet of Things)はもちろんのこと、機器同士が情報のやり取りを行うM2M(Machine to Machine)に対しても適したプロトコルです。
MQTTは以下の図のように3つの要素によって構成されます。
図1. MQTTの構成
さて先述した「トピック」を「サブスクライブ」するということについてですが、これが具体的にどのようなものであるかを説明します。
まず、トピックとは文字列です。
ではどのような文字列かというと、次のようなスラッシュ”/”区切りの文字列となっています。
勘の良い方ならもうわかるかもしれませんが、トピックは階層構造を表す文字列であり、この階層構造を利用してメッセージを受信する範囲を調整することができます。
例えば、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通信で連携する機器同士の開発者が異なる場合、何のトピックを送信するかといったことを事前に決めておきしっかりと管理する必要があります。
MQTTには再送の仕組みがあります。再送機能を有効にするには、メッセージを送信する際にQOS(Quality of Service)というパラメータを指定する必要があります。基本的にQOSによる再送の仕組みはメッセージを受信した後のパケット応答によって実現されますが、この応答の義務が発生するのはPublisher→Brokerのメッセージ送信だけでなくBroker→Subscriberのメッセージ送信でも同様です。そのため、以降のQOSの説明ではPublisherやSubscriberといった役割の表記ではなく「送信者」と「受信者」で表現します。
QOSは3段階あり、それぞれ次のように定められています。
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時間管理された非常に信頼性の高い通信相手との通信の成否のみを気にすればよくなるからです。
先述した通り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とMQTT通信についての紹介を行いましたが、はじめに紹介したようなシステムだけでなくその他さまざまなIoTデバイスを開発するうえで利点がありそうだと多くの方々に感じていただけたら幸いです。
ところで、はじめの例にあげたような通信端末は何で作るのがいいでしょうか。機器が設置される場所、耐用年数、消費電力、通信環境などの条件によって、最適な端末は変わってきます。
ソフテックではアプリケーションの開発だけでなく、こうしたアプリケーションを実行するための機器類の選定も行っています。
現場で使用する機器類からプロトコル・サーバーに至るまで、あらゆる範囲をカバーするのは大変なことですが、
これが可能なエンジニアは開発の現場において重宝され、お客様が望むシステムを実現するうえで非常に大きな力を発揮することが可能です。
今後も広範囲にまたがって知識や経験を積み重ねていき、多くの人から信頼されるエンジニアを目指して努力を続けていきたいと思います。
(H.K.)
関連ページへのリンク
関連するソフテックだより