テックブログ

AWS IoTのShadowを使ったデバイス管理

みなさん、こんにちは。前回のテックブログでは、SORACOM Conference “Connected.”で展示したデモアプリの在庫管理部分についてご説明しました。今回はその続編として、AWS IoTを用いてパトランプ操作を行った部分についてご説明します。
 

AWS IoT Shadowの仕組み

パトランプの操作はAWS IoTのShadow機能を使用して実現していますので、デモアプリの説明の前に簡単にこの機能について説明しておきます。 

AWS IoTでは、デバイスなどをThingとして登録し、その状態を保持する機能を持っています。この「状態(state)」がShadowです。アプリケーションでは、この状態の変更を通してデバイスを操作します。

 
状態には”reported””desired”の2つの要素が存在します。
 
  • “reported”: デバイス自身がどういった状態なのかを示すのに使用します。この状態を変更するのは基本的にはデバイス自身です。
  • ”desired”: アプリケーションとして期待する状態を示すのに使用します。アプリケーションで状態の変更要求を出す場合は、この状態を更新します。
 
今回のデモアプリであれば、Thingはパトランプ、Shadowはパトランプ(lamp)が光っている状態(on)か、消えている状態(off)かを保持します。ここまでの説明を図にすると、以下のようになります。
 
デバイスとの通信にMQTTを使用するのであれば、次のトピックに対してJSON形式の変更メッセージを送ることで"desired"の状態を変更します。
 
       トピック: $aws/things/[Thing名]/shadow/update
 
 

アプリケーションにより"desired"が変更され "reported"と"desired"に差分が出た場合は、デバイス側に状態の変更を指示するために、次のトピックにAWS IoTからメッセージが送信されます。


       トピック: $aws/things/[Thing名]/shadow/update/delta

 
 AWS IoTのstatus変更メッセージの流れ

デモアプリにおける実現方法

ここからは本題であるデモアプリでどのように実装したかについて、具体的に説明したいと思います。
 
デモアプリの全体機能などはこちらのブログを参照いただきたいと思いますが、今回のブログで扱う機能は、商品の在庫がしきい値以下になった場合にパトランプを点灯させ、一定時間後にパトランプを消灯させる部分です。Salesforce側の在庫管理ロジックの中で制御しています。
 

AWS IoTの設定

AWS IoTでは、パトランプをThingとして「WarningLamp」を登録します。
Shadow操作を行う際に使用するMQTTトピックは下記です。
 
       トピック: $aws/things/WarningLamp/shadow/update
 
また、実際に変更が発生する場合にメッセージが送信されるMQTTトピックは下記です。
 
       トピック: $aws/things/WarningLamp/shadow/update/delta
 
 

パトランプの起動時の初期処理 

パトランプの制御はIntel Edison上に実装しており、アプリケーションを起動すると、下記の2つの処理を行います。
 
①初期状態の通知
初期状態は消灯している状態であり、Edisonからメッセージを送信してShadowのreported状態を更新します。
 
トピック: $aws/things/WarningLamp/shadow/update
メッセージ:

 

②変更メッセージ受信用のトピックをsubscribeする
変更が必要な場合の変更指示を受けるため、差分情報を受信するトピックをsubscribeします。

 

在庫が少なくなった際の動き

まず、全体としての流れは下図の通りです。
パトランプ点灯の流れ
 
Salesforceからの要求送信からパトランプが点灯するまでの流れを、順に説明していきます。
 
まず、Salesforceの在庫管理処理で在庫が少なくなった際、SalesforceからAWS API Gatewayのパトランプ点灯用APIをコールします。今回のデモではパトランプを点灯することのみが目的だったため、特にメッセージは渡さす、Lambda functionの起動のみを行うようにしました。
 
API GatewayはLambdaのパトランプのShadowを変更するfunctionを呼び出します。functionでは、AWS IoTに対して下記のメッセージを送り、状態を変えるよう要求します。

パトランプ起動時は”reported”の状態を更新するメッセージを送っていますが、今回はアプリケーションで変更を要求するということで、”desired”を使っています。

 
 AWS IoTはLambdaからのメッセージを受けて、Shadowの状態を変更します。

“reported”と”desired”の間で、状態の差分が発生したため、パトランプ側に対して下記の変更指示を出します。

 
トピック名:$aws/things/WarningLamp/shadow/update/delta
メッセージ:

 

この時、変更指示を出した後のShadowの状態は下記の通りになります。

一番下のdeltaは状態ではなく、"desired"と"reported"に差分が発生していることを表しています。

 

パトランプ側は変更指示を受けて点灯したのち、現在の状態が変わったことをShadowに通知します。
 
トピック名:$aws/things/WarningLamp/shadow/update
メッセージ:

 

AWS IoTはこれを受けて、Shadowの状態を変更します。
”reported”と”desired”の差分がない場合にはShadowの状態に”delta”が含まれることはありません。
※”desired”はnullを送る必要はありませんが、Shadowの状態をわかりやすくするために設定しています。
 
一定時間後にパトランプ側から消灯のための変更要求をAWS IoTにリクエストしますが、LambdaからAWS IoTに点灯要求を出す場合と同様の実装となります。
 

いかがだったでしょうか。AWS IoTプラットフォームを用いることで、簡単にデバイス管理が可能となることがおわかりいただけたかと思います。今回のデモアプリでは使用していませんが、Shadowの状態がバージョン管理されていることを用いた楽観ロックの仕組みがあります。より詳しく知りたい方はAWSのドキュメントを参照いただければと思います。
 
Tags:  ,

About Yoshihisa Sato

Yoshihisa Sato

SIベンダーでの経験を経て、2015年11月にアピリオへJoinしました。アピリオのクラウドの活用したスピード感のあるシステム開発、コミュニティを生かしたシステム開発に魅力を感じています。進化するクラウド技術、次々と生まれる新しい技術…少しでも多くのことを得られるよう日々勉強しています。

Appirio