5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS IoT で固定IPの振られていないPCを緊急停止してピンチを回避する(サンプルコード付き)

Last updated at Posted at 2017-03-24

はじめに

  • 仕事やプライベートでもAWS IoTを活用するシーンが増えている今日このごろです。

  • AWS IoTを使えば、簡単にMQTTのPub/Subが実現できます。自分としては、なんとなく読めるJavaのSDKも用意されてるので、デバイス側の実装も容易です。

  • Subscribeを活用したデバイス側の実装としては、以下のような構成で固定IPの振られていない自宅PC(デバイス)に、Subscribeをトリガに処理するといったことが考えられます。
    skitch.png

  • 例えばリモートから自宅PCを緊急停止してピンチを回避することが可能だったりします。今まで、外出中に急に母親からLINEで「あなたの部屋掃除しておくね」とか言い出された時に \(^o^)/オワタ となってた人必見です。

  • ということで、AWS IoTの簡単な使い方を説明しつつ、IoTとは少し違ったカタチでAWS IoTを活用する方法を紹介します。

  • 因みに、今回はDeviceShadowは登場しません。

  • 今回は自宅PCをWindowsと仮定して実装していますが、ちょっとアレンジすればラズパイでも使えますし、シャットダウン以外の処理でも流用可能です。

実現すること概要

  • 自宅PCの常駐プログラムが一定時間毎にPublishすることでPCのステータスチェックを知る機能と、常駐プログラムが特定TopicのSubscribeを行い、SubscribeをトリガにOSシャットダウンを知らせるPublishして、シャットダウンコマンドの実行を行う機能を実現します。
  • 以下 3Topicのやりとりで実現します。
    • topic/healthcheck:常駐プログラムが定期的にPublishするTopic。
    • topic/shutdown:常駐プログラムがSubscribeするTopic。当該Topicを受け取るとシャットダウンコマンドが実行される。
    • topic/shutdownNotify:常駐プログラムがシャットダウンコマンド実行直前にPublishするTopic。

貼り付けた画像_2017_02_24_0_02.png

AWS IoTのセットアップ

Thingsの登録

  • Register Thingsを選択します。
    AWS_IoT.png

  • Nameは適当に指定してください。
    AWS_IoT.png

Ruleの作成

  • 自宅PC(デバイス)から定期に生存情報を送信して、AWS IoT経由でSNSでEMail送信するための設定情報としてRuleを作成します。

  • トップのRuleメニューからCreate a ruleを選択します。
    AWS_IoT.png

  • RuleNameとActionの条件である、Attribute、Topic filterを指定し、Add ActionからSNSを指定して、Create roleしてください。
    貼り付けた画像_2017_02_22_1_06.png

  • Add ActionからSNSを指定するのも以下のとおりです。(簡単です。)
    貼り付けた画像_2017_02_22_1_04.png

  • この時点でAWS IoTに「topic/healthcheck」TopicがPublishされるとRuleが発動して、SNS経由でEmailが送信されるはずです。

  • AWS IoTにはTestSimulatorが用意されているので、そこからPublishしてEmailが受信されるか確認しましょう。

Thingsに紐付ける証明書の作成・ダウンロード

  • デバイスからはAWS IoTから発行される証明書を利用して、AWS IoTに接続するため、証明書の作成・ダウンロードを行います。

  • Create Certificateを選択します。
    AWS_IoT.png

  • 証明書をダウンロードして有効化してます。
    AWS_IoT.png

Policyの作成

  • 証明書のPolicyを作成します。

  • トップのSecurity-PoliciesメニューからをCreate a Policyを選択します。
    AWS_IoT.png

  • PolicyNameの入力、statement(Action「iot:」、ResourceARN「」、Effect「Allow」)を設定し、Createを選択します。
    skitch.1.png

  • 先程作成した証明書にPolicyをAttacheします。
    AWS_IoT.png

エンドポイントの確認

  • エンドポイントをチェックして、控えておいてください。
    AWS_IoT.png

自宅PCに常駐させるJavaプログラムのセットアップ

証明書の配置

  • 先程AWS IoTからダウンロードした証明書をPCの適当な場所に配置します。

    • 例: C:/aws/xxxxxx-certificate.pem.crt
    •    C:/aws/xxxxxx-private.pem.key
  • 以下からJavaのソースをcloneします。
    https://github.com/ukitiyan/desktop-iot

  • 必要に応じてapplication.ymlの以下を編集して、ビルドしてください。(もちろん編集せずに起動時に環境変数で渡してもOKです。)

    • clientEndpoint:AWS IoTで取得したendpoint
    • clientId:任意のClientId
    • certificateFile:xxxxxx-certificate.pem.crtの配置パス
    • privateKeyFile:xxxxxx-private.pem.key
    • thingName:AWS IoTで設定したThingsName
  • target/desktop-iot-0.0.1-SNAPSHOT.jarがビルドされるので、以下のコマンドで実行します。(jre8は入ってる前提です。)
java -jar target/desktop-iot-0.0.1-SNAPSHOT.jar

動作確認

3600秒(1時間)毎に「topic/healthcheck」TopicがPublishされるか

  • 自宅PCに配置したプログラムは、3600秒(1時間)毎に「topic/healthcheck」TopicをPublishします。
  • プログラム実行してから、1時間後にSNSに設定したEmail宛に{"status": "Active"}のようなメッセージが受信されるか確認します。

AWS IoTに「topic/shutdown」TopicをPublishすると自宅PCがシャットダウンするか

  • 自宅PCに配置したプログラムは、「topic/shutdown」TopicをSubscribeしていて、Topicを受信すると「topic/shutdownNotify」TopicをPublishしてから、OCシャットダウンコマンドを実行します。
  • Publish用のアプリを作っても良いですが、今回もTestコンソールを使って、当該TopicをPublishします。
* 「topic/shutdownNotify」がPublishされること、その後「topic/healthcheck」Topicが送信されなくなることを確認します。 * おそらく無事にPCがシャットダウンされ、難を逃れたはずです。

まとめ

  • 冗談っぽい内容が混じってますが、AWS IoTの基礎や可能性について、触れられたと思います。
  • AWS IoT SDKのJavaサンプルも確認しときましょう。
    https://github.com/aws/aws-iot-device-sdk-java
  • 次回はDeviceShadowとか、引き続きAWS IoTついて触れてみたいと思います。
5
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?