AWS IoTを使って、IoT Buttonを自作してみた-①

IoTNEWS新企画。IoTNEWSの技術チームが巷をにぎわす技術について、いろいろトライして感じたことなどをレポートする、「IoTNEWS テクノロジー」シリーズの第一回。

AWSディベロッパーの祭典「AWS re:Invent 2015」にて公開されてちまたで話題となっている「AWS IoT Button」をRaspberry Piを使って自作してみました。

構成はこんな感じです。

AWSIoT

【できること】

Raspberry Piにつながるスイッチを押すと、スイッチからAWS IoTにデータが飛び、AWS IoTからAmazon SNSを呼び出し、メールが飛ぶというデモです。

この流れを実装することで、実際には、多くのセンサーが家庭にあって、それをIoTゲートウェイが収集し、収集したデータをAWS IoTに集めることで、次のアクションを実行するという流れが実現できます。

 

re:Invent 2015で配られたAWS IoT Buttonにはいくつかの機能がありましたが、このうち、本記事ではRaspberry Piへタクトスイッチを設置するところからAWS IoT SNSを使ってスイッチが押されたらメールが送られるところまでを作成します。また、Raspberry Pi上で使用するユーザは全権限を持ったrootユーザを想定してます。

実装の手順は、

Ⅰ.Raspberry Piのデバイスの作成

  1. 電子工作
  2. Raspberry  Pi上のコマンドラインでタクトスイッチが動作するかを確認
  3. シェルスクリプトでタクトスイッチの動作を取得するUIを準備

Ⅱ.AWS(AWS IoT, AWS SNS)の設定

  1. AWS SNSの準備(メール送信のため)
    1. WebブラウザでAmazon SNSの設定画面にアクセスする
    2. 新しいTopicsをつくる
    3. メールの配信先を設定する
  2. AWS IoTの準備(データ受信と後処理のため)
    1. WebブラウザでAmazon IoTの設定画面にアクセスする
    2. Ruleを作成する
    3. Policyを作成する
    4. デバイス認証のための秘密鍵、公開鍵を作成する
    5. 鍵ポリシーを適用する
    6. 鍵をアクティベートする

Ⅲ.Raspberry Piの設定

  1. 鍵をフォルダにいれる
  2. iot_button.sh を書き換える
  3. コマンドラインでmosquitto-clientsをインストールする

Ⅳ.動作確認

ボタンを押したら、ボタンが押されたよ!とRaspberry Piのコンソールに表示され、メールが飛ぶことが確認できればよい

という流れになります。

 

Ⅰ.Raspberry Piのデバイス作成

用意したもの

  • Raspberry Pi 2(インストール済み)
  • BUFFALO WIFI(設定済み)
  • ブレッドボード
  • タクトスイッチ
  • 10kΩ抵抗器
  • ジャンパーワイヤー(オス-メス) × 3

電子工作の手順

  • タクトスイッチはeとf列の1と3に設置
  • 10kΩ抵抗器はブレッドボードのc列3と8(上から茶・黒・オレンジ・金)
  • ジャンパーワイヤー赤はRaspberry:3.3v/ブレッドボード:a列の1
  • ジャンパーワイヤー青はRaspberry:Ground/ブレッドボード:a列の8
  • ジャンパーワイヤー白はRaspberry:GPIO16/ブレッドボード:a列の3

AWS IoT

完成後はこんな感じになりました。

 

1.Raspberry  Pi上のコマンドラインでタクトスイッチが動作するかを確認します

①. GPIO16 をin モードで使用を宣言

echo 16 > /sys/class/gpio/export

echo in > /sys/class/gpio16/direction

②.cat コマンドで値を読み込む

タクトスイッチが押されていない状態は 0 が返ってくる

cat /sys/class/gpio/gpio16/value

0

タクトスイッチが押されている状態は 1 が返ってくる

cat /sys/class/gpio/gpio16/value

1

③.確認が終わったらGPIO ポートの使用終了を宣言

echo 16 > /sys/class/gpio/unexport

これで動作確認は終了です。

 

2.シェルスクリプトでボタン動作を検知するためのUIを準備します

gpioコマンドを使えるようにapt-getでwiringpiをインストールします。

apt-get install wiringpi

gpioコマンドの動作確認

# gpio

下記のように表示されれば成功です。

Usage: gpio -v
       gpio -h
       gpio [-g|-1] [-x extension:params] ...
       gpio [-p] <read/write/wb> ...
       gpio <read/write/aread/awritewb/pwm/clock/mode> ...
       gpio readall/reset
      ︙

シェルスクリプトを作り、ボタンの動作確認

PORT1=16
MESSAGE="ボタンが押されました!"

gpio -g mode $PORT1 in

echo "ボタンを押してね!"
while true ; do
  if [ `gpio -g read $PORT1` -eq 1 ] ; then
    echo "ボタンが押されました!"
  fi

  sleep 0.1
done

これを iot_button.sh として保存します。

シェルスクリプトを実行します。

# bash iot_button.sh

ボタンを押してね!

タクトスイッチを押して、下記が表示されれば成功です。

ボタンが押されました!

これでボタンを動作させるシェルスクリプトはできました!

 

Ⅱ.AWS側の設定(Amazon SNS, AWS IoT)

今回はボタンが押されたらメール送信をするため、Amazon Web Serviceマネージメントコンソールにログインし、設定をおこないます。現時点(2015/10時点)でAWS IoTはBeta版であるため利用できるリージョンが限定されます。今回はオレゴン(us-west-2)を使用します。

 

II-1. Amazon SNSの設定

まず最初にメール送信を行うAmazon SNSの設定をします。

1.WebブラウザでAmazon SNSの設定画面にアクセスします。

AWSマネージメントコンソールのサービス一覧にある”SNS”をクリックします。

 2. SNS画面の左メニューの”Topics”をクリックし、”Create new topic”をクリックします。

1

 

3. “Create new topic”ダイアログが表示されますので、今回は以下のように入力し、”Create topic”をクリックします。

  • Topic name: my-iot-sns
  • Display name: my-iot-sns

2

4. デバイスのボタンがクリックされた時に送信されるメールの送り先を登録します。

Topicの作成直後は”my-iot-sns”の情報画面が表示されていますので、”Create Subscription”をクリックします。

すると、ダイアログが表示されますので、以下の値を設定し、”Create Subscription”をクリックしてください。

  • Protocol: Email
  • Endpoint: 送信先のメールアドレス

3

“my-iot-sns”の情報画面に戻り、SubscriptionIDに”PendingConfirmation”と表示されていると思います。また、入力されたメールアドレスに対し、確認メールが送信されます。

confirm_mail

表示されている”Confirm subscription”リンクをクリックすると、登録が完了します。

confirm_success

これでSNSの設定は完了です。次からは、AWS IoTの設定を作成し、ここで作成したSNSの設定を割り当てます。

 

II-2. AWS IoT の設定

次に、AWS IoTの設定をします。これにより、Raspberry Piから送られてくるリクエストを受信し、上記で設定したAmazon SNSに対し命令を送ることができるようになります。

1. AWS IoTの管理画面にアクセスします

Amazon Web ServiceマネージメントコンソールのIoTをクリックします。

 

2. Ruleを作成します

次に、Raspberry Piから送られてきた命令を処理するためのルールを作成します。”Create a rule”ボタンをクリックします。

ここでは、以下の設定を入力します。

  • Name: MyIoTSNS
  • Attribute: *
  • Topic Filter: topic/mysns
  • Condition: 空

4

ここまで入力すると、”Rule Query Statement”が”SELECT * FROM ‘topic/mysns'”に変わります。

今回はAWSのSNSを利用するため、”Choose an action”には”Send message as a push notification”を選択します。すると、下図のように、SNS Targetのリストが表示されるため、先ほど作成したSNS設定 “my-iot-sns”を選択します。

さらに、”Role Name”が表示されますので、ここでは”Create new role”をクリックするとロール作成画面が表示されるので

  • IAMロール: 新しいIAMロールの作成
  • ロール名: my_iot_sns

を入力後、”許可”をクリックすると、”my_iot_sns”が設定されます。

7

ここまでの入力が終わったら、”Add Action”をクリックし、最後に”Create”をクリックするとルールの作成されます。

8

 

3.Policyを作成する

ポリシーを作成し、後ほど作成する鍵に割り当てることで、この鍵を使用しているデバイスに対しAWS IoTにアクセスする許可を与えます。

“Create a policy”をクリックし、表示された入力欄に以下の値を入力します。今回はお試しでおこなっているため、緩めの許可を与えます。実際にプロダクトとして使用する場合には、細かい設定をおすすめします。

  • Name: MyIoTPolicy
  • Action: iot:*
  • Resource: *
  • Allow/Deny: Allowをチェック

最後に”Create”をクリックすると、Policyが作成されます。

9

 

4. デバイスの認証を行うための証明書、秘密鍵、公開鍵を作成する

AWS IoTの画面の”Create a certificate”をクリックすると、”1-Click Certificate Create”のボタンが表示されますのでこれをクリックします。

10

すると、公開鍵、秘密鍵、証明書が生成され、ダウンロード可能になりますので、これらのリンクをクリックしてダウンロードし、Raspberry Piにscpで転送します。

11

 

5. 鍵にPolicyを適用する

上記で作成した鍵、Policyの関連付けをします。

作成した鍵にチェックを付け、Actionsリストの中の”Attach a policy”をクリックすると、”Confirm”ダイアログが表示されます。

12

13

 

入力欄に先ほど作成したPolicy名”MyIoTPolicy”を入力し、”Attach”ボタンをクリックします。

14

 

6. 鍵のActive化

先ほど作成した鍵は無効状態(”INACTIVE”)になっており、このままでは使用できませんので有効化します。

作成された鍵にチェックをつけ、Actionsリストの中の”Activate”をクリックします。これで先ほど生成された鍵が”ACTIVE”になります。

20

 

7.シマンテック社のRoot CA証明書

こちらからダウンロードし、ファイル名 aws-iot-rootCA.crt としてRaspberry Piにscpで転送します。

https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem

 

Ⅲ.Raspberry Piの設定

1.鍵をフォルダに入れる

Ⅰ-2で作成した iot_button.sh の下層フォルダ(keys)に、Ⅱ-2-4で作成した **********-certificate.pem.crt,  ***********-private.pem.key 、

Ⅱ-2-7で作成した aws-iot-rootCA.crt を入れます。

2.iot_button.sh を書き換える

赤い部分を追記します。key名は作成されたものに置き換えてください。

PORT1=16
MESSAGE="ボタンが押されたよ!"

gpio -g mode $PORT1 in


echo "ボタンを押してね!"
while true ; do
  if [ `gpio -g read $PORT1` -eq 1 ] ; then
    echo "ボタンが押されました!"
    mosquitto_pub --cafile keys/aws-iot-rootCA.crt --cert keys/**********-certificate.pem.crt --key keys/**********-private.pem.key -h 'A7W**********.iot.us-west-2.amazonaws.com' -p 8883 -q 1 -d -t topic/mysns -i clientid1 -m "{\"message\": \"$MESSAGE\"}"
  fi

  sleep 0.1
done

3.コマンドラインでmosquitto-clientsのインストールする

mosquitto_pub を使用しますのでインストールします。Raspberry Piのオフィシャルのリポジトリからインストールできるmosquitto-clientsはバージョンが古いため、ここではmosquitto.orgで公開されているdebをインストールします。

最初にmosquitto.orgのgpg keyをインストールします

wget  http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key

apt-key add mosquitto-repo.gpg.key

aptのsource listを追加します。

wget http://repo.mosquitto.org/debian/mosquitto-wheezy.list

# cp mosquitto-wheezy.list /etc/apt/sources.list.d/

mosquitto-clientsをインストールします。

# apt-get update

# apt-get install mosquitto-clients

4.動作確認

コマンドラインで iot_button.sh を実行します。

$ bash iot_button.sh

ボタンを押してね!

タクトスイッチを押して、下記が表示されれば成功です。

ボタンが押されました!
Client clientid1 sending CONNECT
Client clientid1 received CONNACK
Client clientid1 sending PUBLISH (d0, q1, r0, m1, 'topic/mysns', ... (45 bytes))
Client clientid1 received PUBACK (Mid: 1)
Client clientid1 sending DISCONNECT

メールも確認しましょう。

mail

上記のようなメールがⅡ-1-4で登録したメールアドレスで受け取れたら成功です。

 

Ⅳ感想

意外と簡単にできたので驚きました!AWS IoTの使いどころとしては、モノ側がある程度インテリジェントで、鍵を入れられ、MQTTでAWS IoTと通信できる程度の処理ができないと使えないのだが、実装が簡単なのと、AWS IoTに情報を渡してさえしまえば、そのあとの処理は別途定義すれば今回のデモのようにメールを飛ばしたりすることは簡単にできるということがわかりました。

Previous

チケイ、ウェアラブルトランシーバー「BONX」発表 クラウドファンディング開始から5日で支援総額750万円を突破

ファッション人工知能アプリ「SENSY」、アップデート版の使い方

Next