AWS IoT Hands-‐‑‒on Ver.1.0 Amazon Data Service Japan ⾃自⼰己紹介 • 名前 – 榎並 利利晃(えなみ としあき) – [email protected] • 役割 – パートナーソリューションアーキテクト – 主にエマージングパートナー様を担当 • 好きなAWSのサービス – Amazon Kinesis – Amazon DynamoDB @ToshiakiEnami IoT ( Internet of Things )とは “The Internet of Things (IoT) is the network of physical objects or "things" embedded with electronics, software, sensors and connectivity to enable it to achieve greater value and service by exchanging data with the manufacturer, operator and/or other connected devices. Each thing is uniquely identifiable through its embedded computing system but is able to interoperate within the existing Internet infrastructure.” IoT ( Internet of Things )とは モノ(含むセンサー)などから収集されるデータを活⽤用し、⽣生活 やビジネスの価値向上のために活⽤用することができる。 ビジネスイノベーションへのきっかけ 様々なマーケットで利利⽤用可能 製造 交通 エネルギー • メンテナンス • オートメーション • ⾞車車両センサー • トラフィック • スマートメータ • メンテナンス 家電 ヘルスケア 農業 • スマート家電 • オートメーション • 医療療機器 • 遠隔医療療 • スマートメータ • ⾃自動制御 IoTが抱える様々な問題に対してAWSクラウドは 最良良の選択肢 様々な課題 " 不不確実なビジネスモデル " ユーザー数の増加 " 情報量量/通信量量の増加 " 多くのシステム構築 " セキュリティの確保 AWSで解決! " 使っていただいた分だけの利利 ⽤用料料、低コスト、低リスクで素 早く実験 " スケールイン・アウト " 40を超えるサービス " ⾼高いセキュリティ イノベーションにつなげるために 機械学習 データ可視化 検知 収集 分析 蓄積 IoTデータフロー 親機 センサー モバイル 収集 蓄積 分析 活用 インフラ インフラ インフラ インフラ Intel Edisonを⽤用いた開発 Intel Edisonのご紹介 超⼩小型、Dual Core Atomプロセッサ搭載Linuxマシン アンテナ搭載なのでボード単品で無線通信可能 (WiFi/BT) 低消費電⼒力力 各種Expansionボードに乗せてI/Oを拡張 Node.js (JavaScript), Python, C/C++, Arduino, Wyliodrin (Scratch⾵風)など幅広いプログラミング⾔言語をサポート " MRAA / UPMなどI/O操作ライブラリも充実 " " " " " IntelのExpansionボード 今日はコレ を使います Arduino Expansion Arduino Uno互換シールドコネクタ mSD, USB host/device/vCOM I/O電圧 3.3V/5V アナログ入力も(ADC)可能 PWMは4本のみ (Arduinoは6本) LiIon電池充放電回路 試作、実験用に Mini Breakout Board I/O電圧1.8V LiIon電池充放電回路 純粋にEdison I/Oピンをパッドに引き出したボード。 追加I/O無し 小型化したいときに さまざまなプログラミング環境をサポート 今日はコレ を使います Intel XDK IoT Edition (JavaScript + HTML5) " sshやシリアルコンソールでつなぎ、Edison 上でC/C++のセルフ開発も可能 Arduino Wyliodrin I/Oライブラリを使った簡単プログラム " MRAAを使えば、こんなに簡単にI/O操作できます var mraa = require("mraa"); import mraa var x = new mraa.Gpio(13); x.dir(mraa.DIR_OUT); x.write(1); x = mraa.Aio(0) print (x.read()) Node.js • • GPIO, Analog, PWM, I2C, SPIの操作が可能 JS/Python/C/C++で使えま す Python " UPMを使った、加速度度センサー読み出しの例例 var adxl345 = require('jsupm_adxl345'); var adxl = new adxl345.Adxl345(0); adxl.update(); // Update the data var raw = adxl.getRawValues(); // Read raw sensor data var force = adxl.getAcceleration(); // Read acceleration force (g) Edison ArduinoボードのI/O概要 名前 ⽤用途 説明 具体例例 補⾜足 GPIO (General purpose I/O) 汎⽤用⼊入出⼒力力 デジタル (1/0) LEDの点灯、モーター On/Off, スイッチ読み 込み 設定で⼊入⼒力力と出⼒力力を切切 り替えて使う Analog In アナログ⼊入⼒力力 (A/Dコンバータ ー) 0V~∼AREF(V)を0~∼1024 (10bit)と して表現 アナログセンサー、ボ リュームのアナログ値 の取得 AREFはジャンパで 3.3Vや5.0Vに設定可 能 Analog Out 実際にはPWM波 形 (PWM=Pulse Width Modulation) ⼀一定周期の中で、デジタル1と0の⽐比 率率率を変えることで平均出⼒力力を変化さ せる (デューティー⽐比) LEDの輝度度、モーターの 回転速度度の調整 ピンの出⼒力力は1と0を繰 り返す。1と0の⽐比率率率を 変えられる I2C デバイス間シリア ル通信 1つのバスで複数のデバイスをサ ポート可能。2線式。中速。 シリアルROM、⼩小型セ ンサーなどとの通信 SPI デバイス間シリア ル通信 1つのバスに複数デバイスつなげる が、デバイスごとにCS信号が必要。 3線式。中〜~⾼高速。 シリアルROM、⼩小型セ ンサーなどとの通信 PWM Duty = 10% Duty = 50% Duty = 90% Hardware Kit Intel® Edison開発キット • Intel® Atom™ デュアルコアプロセッサ Arduino* 互換I/O拡張ボード • Yocto* Linux* ベースのIntel® IoT Development Kitソフトウエア Seeed* Studio Grove Starter Kit V3 • ベースシールド + 便便利利なI/Oモジュール 類 + ケーブル その他 • micro-‐‑‒USB cable • 12V power adapter Seeed* Grove Starter Kit v3内容物 • Groveベースシールド • Groveモジュール⼀一式 (センサ、スイッチなど) • Groveケーブル 今回の接続図 12V電源 USB切切り替え スイッチを下側に 押しボタン スイッチ(D2) USB x2 -‐‑‒> PC 光センサー (A0) (CdS) LED (D3) ⾜足の⻑⾧長いほ うが(+) Knob (A1) (ボリューム) • Intel® EdisonとSeeed* Grove shieldをArduino拡張 ボードに接続 • D2に押しボタンスイッチ • D3にLED • A0に光センサー (CdS) • A1に回転ノブ (ボリューム) • 12V電源 • Micro USBx2をPCに接続 • Arduino拡張ボード上のUSB 選択スイッチを下側に設定 Intel® XDK for IoT Edition " JavaScript (Node.js), HTML5を使ったアプリケーション⽤用統合開発環境 " デバッガも装備 " 下記URLより無償でダウンロード可能 (使⽤用するにはユーザー登録、アカウント作成が必要です) https://software.intel.com/en-‐‑‒us/html5/xdk-‐‑‒iot XDK統合開発環境 デバッガ サンプルコードのダウンロード " 下記URLよりサンプルコードをダウンロード § http://toshiake-‐‑‒iot-‐‑‒handson.s3-‐‑‒website-‐‑‒ap-‐‑‒ northeast-‐‑‒1.amazonaws.com/classmethod-‐‑‒devday/iothandson-‐‑‒ edison.zip • PDFからのコピーアンドペーストの場合、余計な⽂文字が含まれることがあります。 テキストエディタで確認してください。 § 解凍後、SampleCode1フォルダに本章のハンズオンプロジェクトが 含まれております。 XDKの基本操作 – プロジェクトのインポート “OPEN AN INTEL XDK PROJECT”をクリック XDKプロジェクトファイルを選択 (*.xdk) * 新規でプロジェクトを作る場合、“INTERNET OF THINGS EMBEDDED APPLICATION” – “Templates”から適当なテン プレートを選んで作成 プロジェクトを編集する “DEVELOP”タブをクリックすると選択したプロジェクトを 編集できます 左のペインからmain.jsを選べばNode.jsのメインコード が表示されます EdisonのIPアドレスを確認 " Serial Terminalタブを選択。PortをEdisonとつながっているシリアルポートを指定し、Connectをクリック " ユーザ名 root, パスワード Password1を⼊入⼒力力してログイン " # ifconfig でEdisonに設定されているIPアドレスを確認してください。 Edisonと接続する Passwordは、Password1 です。 EdisonのIPアドレス Edisonのログイン情報 マニュアル接続時のダイアログボックス " " " XDKとEdisonはネットワーク経由で接続します。同⼀一サブネット内になるようにしてください 通常は、XDKがEdisonを⾃自動で検出し、”IoT Device”ドロップダウンリストにEdisonの名前が出てきますので選択してください Edisonが発⾒見見できない場合、”[+] Add Manual Connection”でIPアドレスを指定して繋ぐことができます プロジェクトの実⾏行行、停⽌止 ①編集 ②保存 (CTRL+S) ↓④転送 ↓⑤実行 ↑③停止 • • • XDKはソースの⾃自動保存をしません。「保存」せずに「転送」すると変更更が反映されずません Edison上でプロジェクトが実⾏行行されている時に転送すると正常に転送出来ません。「停⽌止」してから 転送してください 「④転送」を押した時にBuildが必要な場合はBuildするかどうか尋ねられます。使⽤用するパッケージ に変更更がない場合Buildは不不要です。Buildした場合はBuildのみで作業が終了了し、転送は⾏行行われませ ん。再度度転送ボタンを押して転送を⾏行行ってください。 Node.jsで使⽤用できるI/Oライブラリ インテルが開発したライブラリ mraa: Intel® GalileoとIntel® Edisonで 利利⽤用できるオープンソースのライブラリ。 GPIO, PWM, Analog IOなどの低レベルI/ Oアクセスを提供. Intel Developer Relationsが開発。 upm: 特定センサーやアクチュエータを操 作する、mraaを利利⽤用したオープンソース ⾼高レベルI/Oライブラリ。Intel Developer Relationsが開発。 iot-‐‑‒io: Intel® Galileo / Edisonで利利⽤用で きるオープンソースライブラリ。Arduino に似たAPIを持つ。RPCを経由したリモー トアクセスも提供。Intel Labs Chinaが開 発。 3rd partyが開発したライブラリ johnny-‐‑‒five: Intel® Galileo/Edisonを含む多 種多様なボードをサポートする、プラグイン形 式のオープンソースI/Oライブラリ。 インテル ボード⽤用プラグインはgalileo-‐‑‒io を使⽤用した時 と違い、Firmataを経由しないダイレクトイン ターフェースを利利⽤用。 cylon: オブジェクト指向、⾮非同期、オープン ソースなポータブルロボットフレームワーク onoff: sysfs経由でGPIO/PWMを直接操作する オープンソースI/Oライブラリ i2c: sysfsを利利⽤用したNode.js⽤用 I2Cライブラリ NOTE: sysfsを利利⽤用したI/O操作にはボードの 詳細情報を知っている必要があります MRAA – 初期化部 (Arduinoのsetup()相当) var mraa = require("mraa"); モジュールのロード var button = new mraa.Gpio(2); button.dir(mraa.DIR_IN); D2をGPIO2として使う GPIO 2を⼊入⼒力力モードに設定 var led = new mraa.Pwm(3); led.period(1); led.enable(true); D3をPWM出⼒力力として使う PWM周期を1msに設定 PWM出⼒力力ON var knob = new mraa.Aio(1); A1をアナログ⼊入⼒力力として使 う ピンの初期化、変数の初期化など一度だけ実行される処理 MRAA – 実⾏行行部 (Arduinoのloop()部相当) setInterval(function() { var push = button.read(); if (push) { led.write( knob.readFloat() ); } }, 100); // every 0.1s (100ms) 何かの処理理を周期的に実⾏行行 ボタン状態を読み込み ボタンが押されていたら ノブの状態を読み、 PWM値(LED輝度度)を 書き込む この処理理を 0.1s (100ms) 毎に実⾏行行 厳密にはloop()のように連続して実行されるわけではなく、指定周期ごとに繰り返し 実行される。でも、大体同じことが出来る。 課題1 -‐‑‒ Project ʻ‘A0ʼ’ setInterval(function () { var push = button.read(); if (push) { led.write( knob.readFloat() ); } }, 100); // every 0.1s (100ms) * 初期化部分は省略されています このコードは以下の動作をしています: ボタンが押されている:ノブ(ボリューム) の状態に応じてLEDの輝度度をコントロール ボタンが押されていない:何もしない ボタンでLEDのOn/Offコントロールができ ていません コードを変更更し、ボタンが離離された時には LEDが消灯するようにしてください 課題1: 解答 – Project ʻ‘A1ʼ’ setInterval(function() { var push = button.read(); if (push) { led.write( knob.readFloat() ); } else { led.write( 0 ); } }, 100); // every 0.1s (100ms) 何かの処理理を周期的に実⾏行行 ボタン状態を読み込み ボタンが押されていたら ノブの状態を読み、 PWM値(LED輝度度)を書き込む それ以外の時は PWM (LED輝度度)に0 を書き込む この処理理を 0.1s (100ms)毎に実⾏行行 課題2 -‐‑‒ Project ʻ‘A1ʼ’ setInterval(function() { var push = button.read(); if (push) { led.write( knob.readFloat() ); } else { led.write( 0 ); } }, 100); // every 0.1s (100ms) 正直、ボタンを押しっぱな しにしていないとLEDが付 かないのはしんどいです コードを変更更し、ボタンを 押す毎にOn/Offが切切り替 わるようにしてください (トグル動作) 課題2: 解答 – Project ʻ‘A2ʼ’ LEDの状態を保持する変数 var light_state = 0; 前回のボタン状態を保持する変数 var last_push = button.read(); setInterval(function() { 何かを周期的に実⾏行行 var push = button.read() ボタンの状態を読み込み、 今はボタンが押されていて、かつ前回は押されてい if (push && !last_push) { ない時(=押された瞬間) light_state = !light_state; LEDの状態をトグル(反転)させる } last_push = push; 次回ループのために現在のボタン状態を保存 if (light_state) { led.write( knob.readFloat() ); LED状態がONの時 ノブの状態を読み込み、PWM(LED輝度度)に書き込 } else { む led.write( 0 ); それ以外(LED状態がON以外)の時 } }, 100); // every 0.1s (100ms) PWMに0を書き、LEDを消灯 100ms毎に繰り返し実⾏行行 課題 3 -‐‑‒ Project ʻ‘A2ʼ’ var light_state = 0; var last_push = button.read(); setInterval(function() { var push = button.read() if (push && !last_push) { light_state = !light_state; } last_push = push; if (light_state) { led.write( knob.readFloat() ); } else { led.write( 0 ); } }, 100); // every 0.1s (100ms) 周囲の明るさに応じて輝度度を⾃自動調 整するようにしてください (周囲が暗い=LEDを暗めに、周囲が 明るい=LEDを明るめに) ヒント1: 光センサーはA0につながっています ヒント2: readFloat()で、アナログ値が正規化 値(0.0f~∼1.0f)で読み出せます http://iotdk.intel.com/docs/master/mraa/ classmraa_̲1_̲1_̲aio.html 課題 3: 解答 – Project ʻ‘A3ʼ’ var ambient = new mraa.Aio(0); “ambient”を宣⾔言し、A0をアナログ var light_state = 0; ⼊入⼒力力とする var last_push = button.read(); setInterval(function() { var push = button.read() if (push && !last_push) { light_state = !light_state; } last_push = push; if (light_state) { led.write( knob.readFloat() * ambient.readFloat() ); } else { led.write( 0 ); 光センサーの値を読み出し } }, 100); // every 0.1s (100ms) (0.0~∼1.0)、掛け合わせることで輝 度度を調整する Amazon Kinesis " Amazon Kinesisはリアルタイムにデータを収集、分析するためのフルマネージド型ク ラウドサービスです。 " 最後に、今回のスマートライトにKinesisに情報を送信する機能を追加することで、今 回のスマートライトをIoT化します Amazon Kinesis Amazon* Kinesis*へのデータストリームの送信 var AWS = require('aws-sdk'); AWS.config.loadFromPath( "/home/root/aws_config.json"); var kinesis = new AWS.Kinesis(); AWS SDKの読み込み AWS認証情報の読み込み (Credentials)*1 Kinesis sub-‐‑‒APIオブジェクト生成 aws_config.jsonは、こんな感じのJSONファイルを用意してください { "accessKeyId": "akid", "secretAccessKey": "secret", "region": "us-west-2“ } *1 今回の例題プログラム’A9s’ではCredentialsの取得にAmazon Cognitoを使用しています Amazon* Kinesis*へのデータストリームの送信 function submit(status) { var log_data = { 'Data': JSON.stringify(status), 'StreamName': 'Light', 'PartitionKey': … }; kinesis.putRecord(log_data, function(err,data) { if (err) { … } } } 送信データの作成 データの送信 例例題4: Amazon Kinesisにつないでみる – Project ʻ‘A4ʼ’ " A3をベースに、Amazon Kinesisにデータをputするコードを追加します " AWSのCredentials取得にはAmazon Cognitoを使⽤用しています http://aws.amazon.com/jp/cognito/ A9sの56行目(name: ‘dev25’,’)を自席の番号に書き換えてください 書き換えが終わったらA9sをEdisonで実行してください 以下のURLに接続し、Kinesisにデータが送られていることを確認して下さい http://iot-dashboard.toshiake.be:9000/ 実行画面 AWSクラウド側の設計 設計上の考慮点 " 対象デバイス数 • トランザクション数(tps), 通信量量 • フロントシステムの柔軟性 " データ処理理 • ETL処理理、アーカイブ、分析などどのような処理理を⾏行行うか " セキュリティ • デバイス認証 " 通信プロトコル • HTTP(S), MQTTなど Pragma architecture Intermittent Layer Device DevOps Serving Layer Web Apps Audit & Authorization Small Thing Commands Telemetry Speed Layer re:invent 2014 -‐‑‒ ARC 306 http://www.slideshare.net/AmazonWebServices/arc306-‐‑‒iot-‐‑‒small-‐‑‒things-‐‑‒and-‐‑‒the-‐‑‒cloud-‐‑‒aws-‐‑‒reinvent-‐‑‒2014 Pragma architecture Intermittent Layer Device DevOps Serving Layer Web Apps Audit & Authorization Small Thing Commands Telemetry Speed Layer re:invent 2014 -‐‑‒ ARC 306 http://www.slideshare.net/AmazonWebServices/arc306-‐‑‒iot-‐‑‒small-‐‑‒things-‐‑‒and-‐‑‒the-‐‑‒cloud-‐‑‒aws-‐‑‒reinvent-‐‑‒2014 構成例例 • • クラウドの柔軟性を活かしてビジネスやシステムのトライ&エラー 要件に合わせた最適なサービスの選択 構成例例 親機 センサー モバイル その他にも通知をするための機能、機械学習などとのインテグレーションもニーズあり Amazon Kinesis Amazon Kinesis " データのストリーミング処理理のためのマネージドサービス " ⼤大量量のセンサーやデバイス、モバイル端末などからのデータ を受け取り、バックエンドの処理理へつなぐことが可能 Data Sources Data Sources Data Sources AWS Endpoint Amazon Kinesis データINPUT Availability Zone Availability Zone Shard 1 Shard 2 データ保持 Shard N Availability Zone データOUTPUT App.1 [Aggregate & De-‐Duplicate] 各種処理理 S3 App.3 [Sliding Window Analysis] Redshift Amazon Kinesis 特徴 容易易なトライ&エラー • 1つのデータを複数のアプリ ケーションで利利⽤用できるため アプリケーション毎に追加・ 削除できる データ処理理・インテグレーション • • Kinesis Client Libraryを使うこと により容易易にKinesisアプリケー ションの開発ができる Kinesis Connectorを⽤用いること でAmazon S3, Redshiftや DynamoDBなどAWSのサービス とのインテグレーションが容易易 Amazon Kinesis 基本構成パターン • • ⽬目的毎にアプリケーションを構成するパターン それぞれのアプリの可⽤用性・信頼性に合わせた設計 例例:リアルタイムダッシュボード センサー Dashboard アプリ1 DynamoDB センサー センサー アプリ2 Kinesisからのデータ取り出しと処 理理にAWS Lambdaも利利⽤用可能 Redshift AWS Lambda " AWS Lambdaは、スケーラブルかつ信頼性の⾼高いクラウド上で、イベ ントをトリガーにお客様独⾃自のコードを稼働させるComputeサービス § § § § インスタンスやOS等インフラの管理理作業が不不要 毎⽇日数件から毎秒数千件のリクエストまで⾃自動的にスケール 従量量課⾦金金、実際にコードが稼働した時間に対してのお⽀支払 新たに追加された情報に対して即座に応答するアプリケーションを、特別な仕組みな く簡単に実装できる イベント KinesisやDynamoDBへのデータ⼊入⼒力力 S3へのオブジェクトPut 結果 Amazon DynamoDB Amazon DynamoDB • NoSQL as a Service • 超⾼高速・予測可能な⼀一貫したパフォーマンス • シームレスなスケーラビリティ、そして低コスト 運⽤用管理理必要なし 低レイテンシ、SSD プロビジョンスループット 無限に使えるストレージ DynamoDB streams • DynamoDBテーブルに対する変更更情報をストリームとしてデータ処理理するアプリや Lambda Functionが受信し、データ処理理することができる センサー アプリ • • センサー センサー Lambda Function 変更更情報は24時間保存 テーブル内データの複製を 作成することも可能 Amazon Cognito Amazon Cognitoとは? • アプリのデータをセキュアに、オフラインでも参照可能な形で保存 し、かつ、デバイス間でSync可能にするサービス • Identity Broker – IDとアクセスの管理理 • • 複数のIDプロバイダとの連携 パブリックなIDプロバイダを利利⽤用することで認証基盤の実装が不不要 当然、パスワードの保管も気にしなくていい – ユニークIDの作成と管理理、識識別 • Sync – デバイスをまたいだデータ同期 – アプリケーションはオフラインでも機能 – あらゆるデータをKey/Value形式で保存可能 • アプリケーションの設定、ゲームにおける状態など – ⼿手間のかかるサーバサイドの実装と運⽤用が不不要 Guest AWS Identity and Access Management • AWS操作をよりセキュアに⾏行行うための認証・認 可の仕組み • AWS利利⽤用者の認証と、アクセスポリシーを管理理 § AWS操作のためのグループ・ユーザー・ロールの作成が可能 § グループ、ユーザーごとに、実⾏行行出来る操作を規定できる § ユーザーごとに認証情報の設定が可能 IAM動作イメージ 全操作可能 S3はすべて 操作可能 S3参照だけ APIやマネジメントコンソールからの アクセスに対して、権限をチェック リアルタイムデータとヒストリカルデータ リアルタイムデータとヒストリカルデータ • ⽤用途に応じたデータの可視化 – リアルタイム=トレンドの把握 – ヒストリカル=データ分析 Stream Query センサー Dashboard センサー Data Insight DynamoDB センサー Kinesis Redshift S3 EMR ハンズオン 1. Edisonでの開発 • 基本的なEdisonでの開発⽅方法を学びます。 2. Amazon Kinesisの設定 • Intel Edisonで取得されたセンサーデータを取得、格納するためのストリーム を 作成します。 3. Amazon Cognitoの設定 • Intel Edisonに対してKinesisへのデータputを許可するためにCognitoによる認証 を設定します。 4. Amazon Identity and Managementの設定 • AWSの各リソースを利利⽤用するための権限設定を⾏行行います。 5. アプリケーション⽤用EC2インスタンスの起動 • アプリケーションが稼働するEC2インスタンスをハンズオン⽤用AMIから起動します。 6. Intel Edisonの設定 • Intel Edisonにセンサーを接続し、Kinesisへセンサーデータを上げるための設定 を⾏行行います。 7. アプリケーションの実⾏行行 • 実際にIntel EdisonからセンサーデータをKinesisに送信し、アプリケーション上 でデータが可視化できることを確認します。 注意事項 • リージョンを意識識してください! – Cognitoはバージニア、その他は東京です • VPCの上限に注意! • 終わったら後⽚片付けしましょう! – 利利⽤用したリソースは削除、消すリソース間違えないように!
© Copyright 2024 ExpyDoc