スマホアプリを使ってAWS IoTボタンのサーバとクライアントを一瞬で構築する
AWS IoTボタンを利用するには、サーバーサイド(AWS)の構築とボタンの初期設定が必要です。
ドキュメントを読みながらAWS管理画面とボタン管理画面とボタンを行ったり来たりしながら構築するのはそれなりの時間と労力を要します。
細かいことは良いから、プログラミング無しにAWS IoTボタンを瞬殺でとりあえず動かしてみたい人におすすめなのが、今回紹介するモバイルアプリ「AWS IoT Button Dev」です。
アプリの概要
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.
とあるように
- AWS リソースの作成
- AWS IoT ボタンの設定
- ボタン押下時の振る舞いを司るLambda 関数のデプロイ
までをウィザード形式でプログラミング無しに実現するモバイルアプリです。
完成形
アプリのダウンロード
アプリは "AWS IoT Button" で検索します。(居住地はドイツ)
アプリの地域が日本になっている場合は見つからないかもしれません。
アプリを起動
アプリの起動画面です。
AWS にログインする
AWS のリソースを操作するため、AWSマネジメントコンソールへのログイン(認証)します。
AWS IoTボタンを追加する
[Set up AWS IoT Button]を選択します。
アプリによるAWSリソース/ボタンに同意
アプリのセットアップ内容の確認とその同意を行います。
具体的には以下を行います。
- Register : ボタンがAWS IoTにメッセージ送信するためのリソースの作成
- Configure : ボタンにセキュリティクレデンシャルとWi Fi の設定
- Set Button action : ボタン押下時のアクション(Lambda関数)の設定
[Agree & get started]を選択します。
DSN を読み取る
ボタンを識別する16桁の英数字 Device Serial Number (DSN)を設定します。
IoTボタンの箱にはDSNと対応するバーコードがあります。
[Scan DSN Barcode]を押すと、このバーコードを読み込んで DSN を設定出来ます。
箱がない場合や手入力が苦でない場合は、[Manually Enter DSN]から手入力します。
バーコードから読み取った DNS が自動補完されます
[Register Button]を選択すると、AWSリソースの作成が始まります。
AWS リソースの作成
以下の AWS リソースが作成されます。
- AWS IoT thing
- Private key
- certificate
- Policy
AWS IoT ボタンのアクセスポイントに接続
AWS IoT ボタンはWi-Fiアクセスポイントになります。 この回線に接続し、ボタンが利用する Wi−Fi 回線情報を設定します。
青く点滅するまでボタンを長押しします(概ね6秒以上)
その後、記載のある Wi-Fi 回線に接続します。 なお、Wi-Fi のパスワードは DSN の下8桁です。
AWS IoT ボタンの Wi-Fi AP に接続すると、ボタンが利用する Wi-Fi の設定画面が表示されます。
入力が終わると[Confirm]を押します
- プライベートキーのアップロード
- 証明書のアップロード
- Wi-Fi 設定
でボタンの設定は完了です。
ボタンアクションの設定
ボタン押下時のアクションは Lambda 関数で定義します。
- ("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の一覧画面に戻ります。
ボタンをクリックすると
- Wi-Fi の設定
- Lambda 関数の設定
- ボタンの削除
を行えます。
左上の「+」ボタンからは新規ボタンの登録を行えます
ボタンを押して疎通確認
最後に疎通確認を行います
ボタンは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" とボタンの押し方も認識されています。
Amazon SES の疎通
メール送信には Amazon SES を利用しています。 この疎通メールはボタンの初回実行時に行われます。
「Amazon Web Services – Email Address Verification Request in region US West (Oregon)」というような件名で疎通メールが送信されるため、内容を確認の上、認証 URL をクリックします。
制限事項
このアプリを利用するには AWS マネジメントコンソールへのログインが必須です。
AWS リソースの操作は不要で Wi-Fi 設定だけを行いたい場合は別アプリ「AWS IoT Button 」をお使い下さい。
まとめ
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); }); };