スマホアプリを使ってAWS IoTボタンのサーバとクライアントを一瞬で構築する

2017.08.02

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

AWS IoTボタンを利用するには、サーバーサイド(AWS)の構築とボタンの初期設定が必要です。

ドキュメントを読みながらAWS管理画面とボタン管理画面とボタンを行ったり来たりしながら構築するのはそれなりの時間と労力を要します。

細かいことは良いから、プログラミング無しにAWS IoTボタンを瞬殺でとりあえず動かしてみたい人におすすめなのが、今回紹介するモバイルアプリAWS IoT Button Devです。

アプリの概要

iTunes の概要には

Fast provisioning and set-up

This app walks you through a few easy steps to get your AWS IoT Button up and running: (1) Register - create the resources required for your Button to send messages to AWS IoT, (2) Configure - upload security credentials to your Button and connect it to your Wi-Fi network, and (3) Set Button action - use Lambda functions to trigger events in the Cloud.

とあるように

  1. AWS リソースの作成
  2. AWS IoT ボタンの設定
  3. ボタン押下時の振る舞いを司るLambda 関数のデプロイ

までをウィザード形式でプログラミング無しに実現するモバイルアプリです。

完成形

architecture-dev-app

アプリのダウンロード

アプリは "AWS IoT Button" で検索します。(居住地はドイツ)

dev 01

アプリの地域が日本になっている場合は見つからないかもしれません。

アプリを起動

dev 02

アプリの起動画面です。

AWS にログインする

AWS のリソースを操作するため、AWSマネジメントコンソールへのログイン(認証)します。

dev 03

AWS IoTボタンを追加する

[Set up AWS IoT Button]を選択します。

dev 04

アプリによるAWSリソース/ボタンに同意

アプリのセットアップ内容の確認とその同意を行います。

具体的には以下を行います。

  1. Register : ボタンがAWS IoTにメッセージ送信するためのリソースの作成
  2. Configure : ボタンにセキュリティクレデンシャルとWi Fi の設定
  3. Set Button action : ボタン押下時のアクション(Lambda関数)の設定

dev 04 agree

[Agree & get started]を選択します。

DSN を読み取る

ボタンを識別する16桁の英数字 Device Serial Number (DSN)を設定します。

 

dev 05 dsn reader

IoTボタンの箱にはDSNと対応するバーコードがあります。

[Scan DSN Barcode]を押すと、このバーコードを読み込んで DSN を設定出来ます。

箱がない場合や手入力が苦でない場合は、[Manually Enter DSN]から手入力します。

dev_06

バーコードから読み取った DNS が自動補完されます

[Register Button]を選択すると、AWSリソースの作成が始まります。

AWS リソースの作成

以下の AWS リソースが作成されます。

  • AWS IoT thing
  • Private key
  • certificate
  • Policy

dev 07 register

AWS IoT ボタンのアクセスポイントに接続

AWS IoT ボタンはWi-Fiアクセスポイントになります。 この回線に接続し、ボタンが利用する Wi−Fi 回線情報を設定します。

青く点滅するまでボタンを長押しします(概ね6秒以上)

dev_08_configure

その後、記載のある Wi-Fi 回線に接続します。 なお、Wi-Fi のパスワードは DSN の下8桁です。

iot-button-05-wifi

AWS IoT ボタンの Wi-Fi AP に接続すると、ボタンが利用する Wi-Fi の設定画面が表示されます。

dev_09_wifi_confirm

入力が終わると[Confirm]を押します

dev 10 configure

  • プライベートキーのアップロード
  • 証明書のアップロード
  • Wi-Fi 設定

でボタンの設定は完了です。

ボタンアクションの設定

ボタン押下時のアクションは Lambda 関数で定義します。

dev 11 set button action

  • ("Existing λ functions"タブ)ユーザーが作成済みのLambda関数を選択
  • ("New λ functions"タブ)以下のプリセットからLambda関数を作成
    • SES でEメール送信(Send Email)
    • SMS 送信(Send SMS)
    • IFTTT 連携(Trigger IFTTT Maker)

今回は「SES でEメール送信」を新規に作成します。

node.js 版 または python 版を選択後、ポップアップダイアログでメールアドレスを入力するだけです。

設定完了

Lambda の設定が終わると、AWS IoT Buttonsの一覧画面に戻ります。

dev_12_iot_buttons_list

ボタンをクリックすると

  • Wi-Fi の設定
  • Lambda 関数の設定
  • ボタンの削除

を行えます。

dev 13 button detail

左上の「+」ボタンからは新規ボタンの登録を行えます

ボタンを押して疎通確認

最後に疎通確認を行います

ボタンは3種類の押し方があります。

  • 1回押し
  • 2回押し
  • 長押し(1.5秒以上)

例えば「1回押し」をすると「Hello from your IoT Button G030PT1234567890」という件名で

Hello from your IoT Button G030PT1234567890. Here is the full event: {"serialNumber":"G030PT1234567890","batteryVoltage":"1547mV","clickType":"SINGLE"}.

というような本文のメールが届きます。

"clickType": "SINGLE" とボタンの押し方も認識されています。

dev_13_mail

Amazon SES の疎通

メール送信には Amazon SES を利用しています。 この疎通メールはボタンの初回実行時に行われます。

「Amazon Web Services – Email Address Verification Request in region US West (Oregon)」というような件名で疎通メールが送信されるため、内容を確認の上、認証 URL をクリックします。

制限事項

このアプリを利用するには AWS マネジメントコンソールへのログインが必須です。

AWS リソースの操作は不要で Wi-Fi 設定だけを行いたい場合は別アプリ「AWS IoT Button 」をお使い下さい。

iOSアプリを使ってAWS IoT ButtonのWi-Fi設定をする

まとめ

AWS IoTボタンのプロビジョニングとボタン設定を行うモバイルアプリ「AWS IoT Button Dev」を紹介しました。

  • AWS IoT ボタンをすぐに動かしてみたい
  • Lambda関数を切り替えながらAWS IoTボタンを使ったデモをする

というようなケースにおいては有用かと思われます。

node.js 版 Eメール送信で実際に作成された Lambda のコード

/**
 * This is a sample Lambda function that sends an email on click of a
 * button. It requires these SES permissions.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:GetIdentityVerificationAttributes",
                "ses:SendEmail",
                "ses:VerifyEmailIdentity"
            ],
            "Resource": "*"
        }
    ]
}
 *
 * The following JSON template shows what is sent as the payload:
{
    "serialNumber": "GXXXXXXXXXXXXXXXXX",
    "batteryVoltage": "xxmV",
    "clickType": "SINGLE" | "DOUBLE" | "LONG"
}
 *
 * A "LONG" clickType is sent if the first press lasts longer than 1.5 seconds.
 * "SINGLE" and "DOUBLE" clickType payloads are sent for short clicks.
 *
 * For more documentation, follow the link below.
 * http://docs.aws.amazon.com/iot/latest/developerguide/iot-lambda-rule.html
 */

'use strict';

const AWS = require('aws-sdk');

const SES = new AWS.SES();
const EMAIL_ADDRESS = 'foo@example.com'; // change it to your email address

// Send a verification email to the given email address.
function sendVerification(email, callback) {
    SES.verifyEmailIdentity({ EmailAddress: email }, (err) => {
        callback(err || 'Verification email sent. Please verify it.');
    });
}

// Check whether email is verified. Only verified emails are allowed to send emails to or from.
function checkEmail(email, callback) {
    SES.getIdentityVerificationAttributes({ Identities: [email] }, (err, data) => {
        if (err) {
            callback(err);
            return;
        }
        const attributes = data.VerificationAttributes;
        if (!(email in attributes) || attributes[email].VerificationStatus !== 'Success') {
            sendVerification(email, callback);
        } else {
            callback(err, data);
        }
    });
}

exports.handler = (event, context, callback) => {
    console.log('Received event:', event);

    checkEmail(EMAIL_ADDRESS, (err) => {
        if (err) {
            console.log(`Failed to check email: ${EMAIL_ADDRESS}`, err);
            callback(err);
            return;
        }
        const payload = JSON.stringify(event);
        const subject = `Hello from your IoT Button ${event.serialNumber}`;
        const bodyText = `Hello from your IoT Button ${event.serialNumber}. Here is the full event: ${payload}.`;
        const params = {
            Source: EMAIL_ADDRESS,
            Destination: { ToAddresses: [EMAIL_ADDRESS] },
            Message: { Subject: { Data: subject }, Body: { Text: { Data: bodyText } } },
        };
        SES.sendEmail(params, callback);
    });
};

参考