AWS IoTでコネクテッドデバイスのモバイルアプリを実装する #アドカレ2015

2015.12.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。

AWSモバイルアドベントカレンダー12日目の記事になります。

今回はコネクテッドデバイスを操作するモバイルアプリをAWS IoTを使って開発する構成をご紹介します。

概要

コネクテッドデバイスは、インターネットに接続することを前提に設計されたデバイスです。インターネットに接続することで遠隔のアプリケーションから操作したり、ソフトウェアアップデートで機能追加できるなどで注目されています。Philips Hueなどが有名ですね。

コネクテッドデバイスのモバイルアプリは、下図のようにクラウドを介してデバイスと通信する形になります。

awsiot01

AWSには様々なサービスがありますが、今回はAWS IoTのDevice Shadowという機能を利用してみます。Device Shadowは以下のようなJSONドキュメントの保管とその差分通知、バージョン管理機能を持ちます。

{
  "state": {
    "reported": {
      "light": "off"
    }
  }
}

JSONドキュメントには、デバイスの現在の状態(Reported State)とあるべき状態(Desired State)をそれぞれ保存します。AWS IoTではDevice Shadowをデバイスごとに持つことができるので、モバイルアプリはReported Stateでデバイスの現在の状態を読み取ることができ、Desired Stateを書き換えてデバイスの操作を行います。対してデバイスではDesired Stateを読み取ってモバイルアプリからの操作を確認し、Reported Stateに自身の状態を報告するというわけです。

Device Shadowの概念についてはこちらのブログ記事、デバイスのコード例はこちらのブログ記事を参照してください。

モバイルアプリからAWS IoTへのアクセス

Device Shadowへのアクセスには、AWS IoTのMQTT APIWeb APIが利用できます。MQTT APIへのアクセスにはX509証明書が必要ですが、モバイル端末にそれを個別配布するのは難しい *1ので、Web APIを検討してみます。

Web APIは他のAWSサービス同様にAPIキー、シークレットキーを用いたRESTful APIですので、AWS SDKを利用するのが正攻法でしょう。Cognitoを組み合わせた一時認証キーを利用するとモバイル端末にAPIキーを配置せずに済みます(下図の青線)。

また、アプリ側の実装をよりシンプルにしたいのであれば、API Gateway経由でLambdaからAWS IoTを呼び出す構成もあります(下図の赤線)。API Gatewayには通常のHTTPSリクエストでアクセスできますし、API GatewayにAPIキーを設定すれば最低限の認証を含めることもできます *2

実際のコードは、アドベントカレンダー11日目の田中の記事がまるっと使えます(LambdaのコードにDevice Shadowへの接続処理が入ります)。

awsiot02

なお、AWS IoTのAPIはDevice Shadow関係のみIoT Dataという別サービス扱いになっているので、APIリファレンスを参照するときは気をつけましょう。AWS CLIも、aws iot-data <サブコマンド>を利用します。

まとめ

あまり具体的なコードが提示できず恐縮ですが、モバイルアプリでAWS IoTのDevice Shadowを扱う概念は理解いただけたのではないでしょうか。

明日(というか今日)は、藤村のLambdaネタです!お楽しみに!

脚注

  1. SORACOM Beamといった認証プロキシを利用する方法もあります
  2. こちらもSORACOM BeamでAPIキーによる認証をプロキシできます