Skip to content

Instantly share code, notes, and snippets.

@ma2shita
Last active September 2, 2015 08:16
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ma2shita/c9fd0bdcf69fd6c6c193 to your computer and use it in GitHub Desktop.
Save ma2shita/c9fd0bdcf69fd6c6c193 to your computer and use it in GitHub Desktop.

AWS IoTビジネスセミナー / ハンズオンテキスト

ma2shita @ Plat'Home Co., Ltd. v1 2015/4/14

イントロダクション

本テキストについて

AWS IoTビジネスセミナー内 ハンズオントラックの手順について記載しています

使用サービス、デバイスの紹介

Amazon Kinesis | http://aws.amazon.com/jp/kinesis/

大規模な分散データストリームをリアルタイムで処理するための完全管理型のクラウドベースのサービスです。センサーデータなど何万ものソースから送られてくる量のデータを連続的に取得し、格納します。本ハンズオンではTI SensorTag CC2541から発信されたセンサーデータ格納先として利用します。

※以降、文中ではKinesisと略記します

Amazon Cognito | http://aws.amazon.com/jp/cognito/

ユーザーアイデンティティおよびデータ同期に関する機能を提供するサービスです。いくつかのパブリックログインプロバイダ(Amazon、Facebook、Google)を通してユーザに意のアイデンティティを作成でき、未承認のゲストをサポートすることも可能です。本ハンズオンでは OpenBlocks IoT BX1 からデータを Kinesis に格納する際の認証に利用します。

※以降、文中ではCognitoと略記します

OpenBlocks IoT BX1 | http://openblocks.plathome.co.jp/products/special/bx1_sp/

ぷらっとホーム社の「クラウドネットワークと物理インターフェースを結ぶトータルIoTゲートウェイ」。Intel Edisonと3Gを搭載、Wi-Fi、Bluetoothといった無線通信機能を内蔵。さらにUSB、RS-232C、RS-485、GPIO、Ethernetなどの多様なインターフェースにも対応し、 業界特有の機器やセンサーであっても接続することが出来ます。

※以降、文中ではBX1と略記します

TI SensorTag CC2541 | http://www.tij.co.jp/tool/jp/cc2541dk-sensor

SensorTag は、ワイヤレス・センサ・アプリケーションに焦点を合わせた初めての Bluetooth スマート開発キットであり、スマートフォン向けアプリケーションの開発者をターゲットとした唯一の開発キットです。温度センサ、湿度センサ、圧力センサ、加速度計、ジャイロスコープ、および磁力計を内蔵しています。

※以降、文中ではsensorTagと略記します

前提環境

受講者環境

本ハンズオンでは、下記についてハンズオン受講者にご用意いただきます

  • ノートPC
    • USB: Aポート 2つ以上搭載
    • Wi-Fi接続
    • OS: Windows7以上、OSX10.8以上、Linux kernel 3.0以上
    • RS-232Cターミナルソフト (Teraterm、screen、minicom等)
  • AWSアカウント

スキル: Linux上でCLI(Command Line I/F)の操作を行います

運営側提供

本ハンズオンを行うにあたって、運営側から下記が貸与されます

  • OpenBlocks IoT BX1
    • BX1本体 x 1
    • USB給電コンソールケーブル x 1
  • TI SensorTag CC2541
    • sensorTag本体 x 1

※ハンズオン終了時には上記は返却いただきます

※紛失、受講者の責による破損については補償をご請求させていただく場合がございます

全体構成

全体構成

メインプログラム:

  1. BX1とsensorTagをBLE(Bluetooth Low Energy)にて接続し、sensorTagのボタン操作に反応するNode.jsプログラムを体験
  2. sensorTagのボタン操作の結果データをJSON化した上でKinesisに送信するNode.jsプログラムを体験

ステップアッププログラム:

  1. sensorTagのジャイロスコープ(物体の角度や角速度を検出する計測器)センサーのデータを読み出す
  2. Cognitoを使用して、Node.jsプログラム内からAPIアクセスキーを排除し、セキュアにKinesisへアップロードする

ハンズオンに入る前に

表記

固定長フォントでの表記はコマンドラインもしくはプログラムコードです

## on BX1
ls

## on BX1__と表記がある場合は、BX1上での操作を、## on NotePC__とある場合は、ノートPC上での操作を行ってください

ソースコード

本ハンズオンで使用するコードは、すべて下記URLで掲載しています

https://github.com/plathome/handson_a/tree/master/a0417

TI SensorTag CC2541

TI SensorTag CC2541

サポーター

ハンズオン中は、サポーターが巡回しております お気軽にお声がけください

ご確認事項

  • 時間の関係上、全員が各チェックポイントを完了していなくともハンズオンを進める場合がございますが、ご了承ください
  • 当ハンズオンではAWSアカウント作成は行いません。事前に作成の上、ご参加ください
  • 講師の説明と資料を見ながらの自主トレーニング形式となります。PC等お忘れなきようお願い致します
  • シリアルコンソール経由でBX1にログインし、作業を行います。シリアルコンソールの操作方法やLinux等については事前にご確認いただきますよう、お願い致します

必ず「あとかたづけ」に記載されている削除作業を実施してください

スケジュール

13:30   受付開始
14:00   AWSのIoTへの取り組み(仮名称) ADSJ Business Development Dept  & Solution Architect
  ~~~ ハンズオン開始 (オープニング) ~~~
15:00   イントロ説明: 主催者説明、BX1やTI Sensor Tag諸元説明
15:15   ハンズオン (TI SensorTag + node.js => Amazon Kinesisアップロード体験)
   - 45 セットアップ
   - 15 Kinesisアップロード
16:15   フォロー&ステップアップ
17:00   クロージング
   - 15 ハンズオンに対する実地投入の問題点とBX1/POCパッケージ紹介
   - 15 Q&A
17:30 終了

ハンズオン 手順

準備

  1. BX1 設定

メインプログラム1 | sensorTag ボタン

  1. 作業ディレクトリ
  2. Node.jsプログラム

メインプログラム2 | Kinesisアップロード

  1. Kinesisストリーム作成
  2. Node.jsプログラム
  3. データ確認

ステップアッププログラム

  1. sensorTag ジャイロスコープ
  2. Amazon Cognito化

準備: BX1設定

電源接続

USB給電シリアルコンソールケーブルをBX1とノートPCに接続します

電源ボタンはありません。給電 = 電源ONです

シリアルコンソール

ノートPCと接続すると、下記のようになります。通信速度115200にて接続してください

OS デバイス
Windowsの場合 適切なCOMポート
OSXの場合 /dev/tty.usbserial-XXXXXXXX
Linuxの場合 /dev/ttyUSB0

※OSXのXX部分は機器により変化します

FTDI ドライバ

  • Windows:
    • USB接続をするとFTDIのドライバがインストールされます (要 インターネット接続)
    • ターミナルソフトウェアから適切なCOMポートを選択してください
  • OSX:
  • Linux:
    • 事前準備は不要です

※インストールに時間がかかる等問題があれば、スタッフに申し出てください

LEDを操作する

BX1は/tmp/.runledというファイルを通じて、_STATUS_のLEDを操作することが可能です

e.g.)

青を1秒間隔で点滅させる

echo -e "1000\n1000\n4" > /tmp/.runled

詳細は セルフ開発環境構築 をご覧ください

インターネット接続確認

本ハンズオンでは、BX1のWi-Fi設定を済ませてありますので、それの導通確認を行います

## on BX1
ip addr show dev wlan0
ntpdate ntp1.jst.mfeed.ad.jp

ntpdateによる時刻設定が正常に完了すれば、ネットワーク接続ができている状態です

メインプログラム1 | sensorTag ボタン

my_uuidはsensorTagに記載されているUUIDに置き換えてください

作業ディレクトリ

本日のハンズオンで使用する作業ディレクトリです

## on BX1
mkdir a0417 ; cd $_

Node.js プログラム

## on BX1
wget https://raw.githubusercontent.com/plathome/handson_a/master/a0417/ti_simplebutton.js
npm install sandeepmistry/node-sensortag
TI_UUID=my_uuid node ti_simplebutton.js

メインプログラム2 | Kinesisアップロード

my_streamは任意のKinesis stream名に置き換えてください

my_key_idmy_secretは、それぞれ各自のAWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYに置き換えてください

Kinesisストリーム作成

AWSコンソールで作成する他、aws-cliでも作成できます

## on NotePC
aws kinesis create-stream --stream-name my_stream --shard-count 1

Node.jsプログラム

## on BX1
wget https://raw.githubusercontent.com/plathome/handson_a/master/a0417/ti_simplebutton2kinesis.js
npm install aws-sdk moment-timezone
AWS_ACCESS_KEY_ID=my_key_id AWS_SECRET_ACCESS_KEY=my_secret TI_UUID=my_uuid AK_STREAM=my_stream node ti_simplebutton2kinesis.js

TIPS: history -c で オンメモリーヒストリーが消去できます

データ確認

※NotePC上にnode.jsの他、jqが必要となります

## on NotePC
wget https://raw.githubusercontent.com/plathome/handson_a/master/a0417/decode_kinesis_records.js

aws kinesis get-records --shard-iterator $(aws kinesis get-shard-iterator --stream-name my_stream --shard-id $(aws kinesis describe-stream --stream-name my_stream | jq -r ".StreamDescription.Shards[0].ShardId") --shard-iterator-type TRIM_HORIZON | jq -r ".ShardIterator") | node decode_kinesis_records.js

ステップアッププログラム1 | sensorTag ジャイロスコープ

https://github.com/plathome/handson_a/blob/master/a0417/ti_simplebutton_and_gyroscope.js

function ti_gyroscope(conned_obj) {
	var period = 1000; // ms
	conned_obj.enableGyroscope(function() {
		conned_obj.setGyroscopePeriod(period, function() {
			conned_obj.notifyGyroscope(function() {
				console.info("ready: notifyGyroscope");
				console.info("notify period = " + period + "ms");
				conned_obj.on('gyroscopeChange', function(x, y, z) {
					console.log(x, y, z);
				});
			});
		});
	});
}
  ti_simple_key(sensorTag);
+ ti_gyroscope(sensorTag);

※periodは100(ms)~設定可能ですが、現状1,000(ms)固定です (原因調査中)

その他のセンサーの使い方も、基本的にはジャイロスコープと同じです

https://github.com/sandeepmistry/node-sensortag

ステップアッププログラム2 | Cognito化

ここまでのプログラムでは、クレデンシャル情報をクライアント側(BX1上)に置く必要がありました

ここでは、Amazon Cognitoを使って、認証情報をハードコードする事無く、AWSへのアクセスを実現します

といっても極めて簡単で、AWS.config.credentials へ、AWS.CognitoIdentityCredentialsのインスタンスを放り込むだけです

※といっても、Amazon Cognitoの設定が必要ですが

Identity Pool Name を aws_iot_a0417 として進めていきます

Amazon Cognito 上に Identity Pool を作成する

AWSコンソールからCognitoを選択

AWSコンソールからCognitoを選択

Get startedをクリック

Get startedをクリック

Identify poolを作成

  • Identity Pool Name = aws_iot_a0417
  • Enable access to unauthenticated identities にチェックを入れる

Identify poolを作成

Cognito用 Roleの作成

※ここはデフォルトのまま、Update rolesをクリックします。Skipする場合は、後ほど自分でRoleを作成した上で、このIdentity poolにroleを割り当てる必要があります

Cognito用 Roleの作成

Cognito ゲストアクセスにポリシーを割り当てる

認証情報(Security Credentials)を表示

認証情報を表示

Roleを選択

ここではCognito_aws_iot_a0417Unauth_DefaultRoleを選択します

このRoleは、先ほどCognitoでIdentity poolを作成した際に、一緒に作成したRoleです。Unauthがゲストアクセス用Roleになります

Roleを選択

Policyを割り当てる

Attach Policyを選択

Attach Policyを選択

AmazonKinesisFullAccessを選択してAttach Policyをクリック

AmazonKinesisFullAccess

Cognito_aws_iot_a0417Unauth_DefaultRoleAmazonKinesisFullAccess が割り当てられたことを確認

Policy割り当てを確認

これで完了です。

Cognitoクレデンシャルを使うようにコードの修正

ti_simplebutton2kinesis.js であれば、下記の通り、AWS.config.regionの直下に AWS.config.credentials を追加するだけです

  AWS.config.region = "us-east-1";
+ AWS.config.credentials = new AWS.CognitoIdentityCredentials({
+    AccountId: "YYYYYYYYYYYY",
+    RoleArn: "arn:aws:iam::YYYYYYYYYYYY:role/Cognito_aws_iot_a0417Unauth_DefaultRole",
+    IdentityPoolId: 'us-east-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
+ });

各パラメータの参照方法は下記の通り aws-cli で確認できます

  • AccountId
    • aws iam get-account-authorization-details | jq .UserDetailList[0].Arn | cut -d ":" -f 5
  • RoleArn
    • aws iam get-role --role-name Cognito_aws_iot_a0417Unauth_DefaultRole | jq .Role.Arn
  • IdentityPoolId
    • aws cognito-identity list-identity-pools --max-result 1 | jq .IdentityPools[0].IdentityPoolId

フォローアップ

BX1 セットアップ

本ハンズオンでご利用いただいたBX1は、ハンズオン用にセットアップ済のものを提供いたしました

セットアップ内容は下記にてご確認いただくことが出来ます

https://github.com/plathome/handson_a/blob/master/tools/bx1_nodejs_setup.bash

https://github.com/plathome/handson_a/blob/master/tools/bx1_wifi_setup.bash

POC(Proof of Concept / 概念実証)パッケージ

本ハンズオンでは、BLEセンサーデータを簡単に読みだすことを体験いただきました

ビジネス展開には本ハンズオンの内容に加え、下記を検討いただくことが必要となります

  • センサー/IoTゲートウェイ と AWS間のネットワーク品質 (3G利用時の切断,再送等の仕組み)
  • IoTゲートウェイ自体のアップデートの仕組み

Plat'Homeでは、お客様のIoTビジネスを実際の品質で検証可能なPOCパッケージを、近日中にリリースいたします

パッケージの内容

  • 接続検証済 センサー (TODO:)
  • IoTゲートウェイ (OpenBlocks IoT BX1)
    • Amazon Kinesis/RedShift/S3等 AWS対応済 IoTネットワークスタック同梱
  • 動作検証済 3G回線 SIM (Docomo網)

詳しくは当社IoTセールス担当までお声がけください

あとかたづけ等

BX1: Bash History 削除

BX1は返却となるため、~/.bash_history等の削除を行うようにしてください

rm -f ~/.bash_history
history -c

BX1: シャットダウン

shutdown -h now

[info] Will now halt.が表示されたら、USBケーブルを抜いてOKです

AWS: Kinesis ストリーム削除

aws kinesis delete-stream --stream-name my_stream

AWS: Cognito Identity Pool、Roleの削除

Cognito Identity Pool以外にも、Roleが作成されているので、その削除を忘れないようにしてください

aws cognito-identity list-identity-pools --max-results 1
aws cognito-identity delete-identity-pool --identity-pool-id us-east-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

aws iam list-roles

aws iam list-role-policies --role-name Cognito_aws_iot_a0417Unauth_DefaultRole
aws iam delete-role-policy --role-name Cognito_aws_iot_a0417Unauth_DefaultRole --policy-name Cognito_Authentication_Policy
aws iam detach-role-policy --role-name Cognito_aws_iot_a0417Unauth_DefaultRole --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFullAccess

aws iam list-role-policies --role-name Cognito_aws_iot_a0417Auth_DefaultRole
aws iam delete-role-policy --role-name Cognito_aws_iot_a0417Auth_DefaultRole --policy-name Cognito_Authentication_Policy
aws iam delete-role --role-name Cognito_aws_iot_a0417Auth_DefaultRole

トラブルシュート

  • BX1からのネット接続
  • BX1とsensorTagのBLE接続
    • # hciconfig
    • # cd ~/a0417 ; npm list
    • sensortag (最新でないと動かない npm install sensortag は古いのが入る)
    • aws-sdk, moment-timezone
  • AWSやKinesis
    • credential (AWS_ACCESS_KEY_ID 等)
    • Kinesis stream
  • 操作対象がBX1 or NotePCの区別が付いているか

Consoleサイズ

シリアルポート接続のため、行=24 桁=80になっています

これを変更するにはsttyコマンドを使用します

stty cols 120
stty rows 35
stty rows 40 cols 200

表示サイズよりも大きくした場合、vi等のスクリーンエディタでの表示が崩れる場合があります

[EoT]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment