Armadillo-IoTを使い、データをクラウド上のサーバーにアップロードするサンプルアプリケーションを動かし、IoTの基本部分を体験してみましょう。
サンプルアプリケーションは、Armadillo-IoT上で動作するクライアントサイドアプリケーションとクラウドプラットフォーム上で動作するサーバーサイドWebアプリケーションの2つのアプリケーションから構成されています。サンプルアプリケーションは、Armadillo-IoT(クライアント)からデータをサーバーにアップロードする機能と、サーバーからクライアントに対して操作指示(Push通知)を行う機能の二つを備えています。
クライアントからサーバーへのデータアップロードの例として、Armadillo-IoTが本体の状態監視用に内蔵している温度センサの値をアップロードします[]。また、サーバーからのPush通知の例として、ブラウザに表示されたボタンをクリックすると、その状態(ONまたはOFF)をArmadillo-IoTに通知します。
クライアントサイドアプリケーションは、Rubyのコンソール(CLI)アプリケーションとして実装されています。実装を簡単にするために、Ruby用ライブラリの一般的な配布形式である、gem[]をいくつか使用しています。データのアップロードはREST API(HTTP POST)で行うため、rest-clientを使用します。また、サーバーからのPush通知にはPusher[]を使用しているため、pusher-clientを使用します。
サーバーサイドWebアプリケーションは、クラウドアプリケーション開発プラットフォームのHeroku上で動作しています。Node.jsで実装されており、クライアントサイドアプリケーションからのデータを受信するとデータベース(PostgreSQL)に格納します。格納したデータは、Webブラウザからリアルタイムに変化を確認できるようになっています。また、ブラウザ上に表示されたボタンをクリックすると、それがクライアント(Armadillo-IoT)への操作指示として、Push通知されるようになっています。
| REST API |
---|
REST(REpresentational State Transfer)は、WebアプリケーションのAPIに関するアーキテクチャスタイル(設計思想)の一つです。
ネットワーク上のリソースに対し一意のURIを割り当て、リソースに対する操作をHTTP GET(取得)/POST(新規作成)/PUT(更新)/DELETE(削除)で行います。RESTの原則に従いAPIを設計すると、クライアントからのリクエストをステートレスにできるため、サーバー側の実装をスケールアウトしやすいと言われています。サンプルアプリケーションでは、時々刻々と変化する温度センサデータのアップロードは、常にリソース(温度データの時系列情報)の新規作成となるためHTTP POSTで行っています。
なお、厳密にはREST原則に従っていないAPIもREST APIと称することが多くなっているため、原則に忠実に従って設計されたAPIのことを、RESTful APIということもあります。
|
| Heroku |
---|
Heroku(ヘロク)は、Webアプリケーションの開発、公開が簡単に行えるクラウド上のプラットフォームです。
一昔前のWebアプリケーション開発現場では、まず開発環境にLinuxやApache、MySQL、PHP(LAMP)をインストールして開発を行い、開発がうまくいったら公開用のサーバーを購入するなり、レンタルサーバーを借りるなりして、また色々インストールして、一般公開するためにドメインを購入して、というようにアプリケーションの実装以外に多くの付随する作業が必要でした。
Herokuを使うと、1. Herokuアカウントを作成する、2. アプリケーションを実装する(アプリケーションの実行に必要なサーバーやデータベースの設定は、Herokuのツールが面倒を見てくれるので、開発者は何を使うか指定するだけです)、3. サーバーに「push」する、という単純なステップで、アプリケーションを一般公開できます。また、サーバーで使用するCPUの数やメモリサイズ、データベース容量を動的に変更できるなど、急にアクセスが増えた場合でも、簡単にスケールアウトできるような仕掛けがなされています。
また、Webアプリケーションを開発する際に必要となる様々な機能が「アドオン」として用意されており、それらを活用することで、アプリケーションの本質的な部分に開発リソースを集中することができます。サンプルアプリケーションでは、データベースとしてPostgreSQLを、Push通知を行うためにPusherのアドオンを使用しています。
課金体系としてフリーミアムモデルを採用しており、一定時間までは無料で使用することができます。このことも、利用の敷居を下げる一因になっています。サンプルプログラムも無料枠の範囲内で運用しています。
|
| Node.js |
---|
Node.jsは、javascriptで構成されたサーバーサイドアプリケーションの開発フレームワークです。わざわざサーバーサイドと謳っているのは、Node.js登場以前は、javascriptはクライアント(ここではWebブラウザのことを意味します)上で動作するプログラムに使用することが一般的であったためです。
Node.jsが登場した背景には、10,000台のクライアントが一斉にWebアプリケーションにアクセスすると急激に性能が劣化する、いわゆるC10K問題と呼ばれる課題がありました。これは、それまでのWebアプリケーション開発フレームワークが、クライアントからのリクエストがあるたびに、プロセス(ないしはスレッド)を生成する構成になっていたため、接続が重複すると、サーバーのメモリを使い切ってしまう事が一因です[]。
Node.jsでは、非同期I/Oを活用し一つのプロセスで全てのリクエストを処理することで、この課題の解決を試みています。Webアプリケーションのサーバーサイドロジックが単純な場合、サーバーサイドアプリケーションはほとんどの時間、I/O待ちをしていることになります(CPU boundではなく、I/O boundな状態)。非同期I/Oを使うと、その間も他の処理ができるため、一つのプロセスで複数のリクエストを捌くことができるようになります。
例えば、APIをRESTfulにしておくと、HTTP POST(新規作成)リクエストは、クライアントから受けとったデータを(ほとんど何も処理せずに)DBに書き込むだけになり、HTTP GET(取得)はDBからデータを取得してレスポンスを返すだけになるため、I/O boundな状態となります。このようなアプリケーションの場合、Node.jsのアプローチは非常にうまくスケールします。サンプルアプリケーションはまさにこのような状況なため、Node.jsを使って実装しています。
反対に、Node.jsでは数値計算などが必要でCPU処理が長くなるアプリケーションには適しません。また、非同期I/Oを活用することで、必然的にイベント駆動型のプログラミングスタイルが強制されるため、複雑なロジックが必要なアプリケーションでは、それに応じてコードも複雑化しがちです。どのようなアプリケーションにも適しているわけではない点には注意が必要です。
|
クライアントから https://armadillo-iot-sample.herokuapp.com/api/series というURIに対して、下記の内容でHTTP POSTリクエストを発行すると、データが格納されます。
表4.1 POST時のQUERYパラメータ パラメータ名 | 値 | 型 |
---|
uid | UID | character varing(制限付き可変長文字列) 255文字 | latitude | 緯度 | double precision(8byte 浮動小数点) | longitude | 経度 | double precision(8byte 浮動小数点) | value | 摂氏温度 | real(4byte 浮動小数点) | created_at | 温度取得時刻 | timestamp without time zone(日付と時刻両方、時間帯なし) | token | トークンID("12345") | 文字列 |
uidは、重複しない値であれば何でも構いません。クライアントサイドサンプルアプリケーションでは、MACアドレスから「:」を抜いた文字列を使用します。サンプルアプリケーションは、実装の簡単な例を示すことを目的としているため、誰でもデータをアップロードし、閲覧することができます。tokenは、Armadillo-IoTのことを全く知らない人が、簡単にデータをアップロードできないようするための簡易的な仕掛けとして使用します。
データアップロードは単純なHTTP POSTリクエストですので、例えばcurlコマンドを使用し、下記のように実行することでも、データをアップロードすることができます[]。自分でクライアントアプリを実装する際の参考としてください。
サーバーからのPush通知は、下記のパラメータで行われます。
表4.2 Push通知パラメータ パラメータ名 | 型 | 値 |
---|
チャンネル | 文字列 | UID | イベント | 文字列 | "button" | データ | JSON文字列 | {"value": "on"} か {"value": "off"} |
Armadillo-IoTに電源を投入する前に、USBシリアル変換アダプタのスライドスイッチを次のように外側になるようにしてください。[]
Armadillo-IoTに電源を接続すると、シリアル通信ソフトウェアには次のように表示されます。
Linuxシステムを起動するには、次のように "boot"コマンドを実行してください。コマンドを実行するとブートローダーがLinuxシステムを起動させます。シリアル通信ソフトウェアにはLinuxの起動ログが表示されます。
ここでは、rootユーザーでログインします。デフォルトのパスワードは、"root"となっています。
クライアントサイドサンプルアプリケーションを動作させるためには、次の項目を設定する必要があります。
Armadillo-IoTは、WAN用インターフェースとして、LAN、無線LAN、及びモバイル通信(3G)を備えています。ここでは、LANを使ってネットワークに接続する設定方法について説明します。無線LAN、3Gの設定方法や、LANの設定方法の詳細については、製品マニュアルを参照してください。
Armadillo-IoTでは、通常のLinuxシステムと同様、ネットワークインターフェースの設定はNetworkManagerが管理します。NetworkManagerは標準でeth0(LANのネットワークインターフェース)が自動でupし、DHCPでネットワーク設定を取得するようになっています。
もし、固定IPに設定したい場合など、ネットワーク設定を変更したい場合は、NetworkManagerのツール(nmtui, nmcli)を用いて設定するか、NetworkManagerの設定ファイル(connection-file )を編集することで行えます。本章ではユーザーフレンドリーなnmtuiを用いてネットワーク設定を行います。
手順4.1 nmtuiを使用しネットワーク設定を変更する nmtuiを起動する
Connection (Wired connection 1) を選択する
固定IP(IPアドレス: 192.0.2.100/32、デフォルトゲートウェイ: 192.0.2.1、DNSサーバー:192.0.2.2)に設定する場合の設定例を下記に示します。ネットワーク設定入力後、<OK> を選択し設定を保存してください。
ここでのポイントは以下の3つです。
IPv4 CONFIGURATION の Show を選択し入力項目を表示させる IPv4 CONFIGURATION の <Automatic> を <Manual> に変更する Addresses, Gateway, DNS servers をそれぞれ入力する
Connection選択画面に戻った後、<Quit> からnmtuiを終了させてください。
ネットワーク設定を反映させるために、動作中のConnectionを一度Deactivateします。
nmtui-connectを実行すると、Connectionの一覧が表示されます。Wired connection 1 上でEnterを押下しConnectionをDeactivateしてください。
ConnectionがDeactivateになると、Connection名の左の*(アスタリスク)が消えます。
再びWired connection 1 上でEnterを押下しConnectionをActivateしてください。これで先ほど設定したネットワーク設定が反映されました。
ConnectionがActivateになると、Connection名の左の*(アスタリスク)が表示されます。
サンプルアプリケーションで使用するデータの取得時刻には、クライアント側のシステムタイムを利用します。時刻が大幅にずれている場合には混乱を招く場合があるため、時刻を設定します。
ここでは、NTPクライアントを利用してシステムタイムをタイムサーバー[]と同期させます。ntpdateコマンドで時刻を設定し、dateコマンドで時刻が設定されたことを確認してください。
クライアントサイドサンプルアプリケーションを実行すると、デフォルトで設定されたURIに対してデータをアップロードし、サーバーからのPush通知に応じてコマンドを実行します。表4.1「POST時のQUERYパラメータ」で示したQUERYパラメータのうち、「latitude」、「longitude」については、東京周辺を指すようにランダムに生成されます。
クライアントサイドのサンプルアプリケーションと設定ファイルは、それぞれ http://armadillo-iot-sample.herokuapp.com/client/sample.rb と http://armadillo-iot-sample.herokuapp.com/client/config.json から取得します。
デフォルトでは、5秒間隔で10回データ送信を行います。--interval オプションを指定することで送信間隔を、--times オプションを指定することで送信回数を指定できます。(-1を指定すると、無制限にデータをアップロードし続けます。)
その他のオプションについては、helpを参照してください。
アップロードしたデータが反映されているか、Webブラウザで確認してみましょう。確認用URLは、クライアントサイドサンプルアプリケーション実行時のログに表示されています。
「top page」と表示されている行のURL (http://armadillo-iot-sample.herokuapp.com) にアクセスすると、地図アプリケーションが表示されます。Basic認証が掛かっていますので、ユーザー名「username」、パスワード「password」でログインしてください。
データが存在する場所には、ピンが立っています。ピンをクリックすると、UIDが表示されますので、自分のUIDと一致していたら「こちら」をクリックし、パーソナルページに移動してください。もし、自分のUIDを持つピンが見当たらなかったら、地図を広域表示にして探してください。詳細ページはクライアントサイドサンプルアプリケーションの実行ログの「personal page」と表示されている行のURLから直接アクセスすることもできます。
| ピンが見つからない |
---|
地図上のピンは、最新のデータがある位置を示しています。後から他の人がアップロードしたデータがたまたま同じ位置になってしまった場合、上書きされてしまいます。その場合は、再度クライアントサイドアプリケーションを実行して別の位置にピンを立てるか、パーソナルページに直接アクセスしてください。
|
パーソナルページには、現在の温度データを表示するメーター(左上)と、Armadillo-IoTへの操作指示を行うボタン(右上)、時系列を表示するグラフ領域(下)があります。
クライアントから温度データがアップロードされると、メーターの表示がリアルタイムに変化することを確認してください。また、グラフ領域上の日付ボックスでデータを表示したい日を選択すると、その日の温度変化が時系列グラフとして表示されます。
また、ボタンをクリックすると、クライアントにPush通知を行います。クライアントサイドサンプルアプリケーションのデフォルト設定では、シリアル通信ソフトウェアに"on"または"off"と表示するだけです。--command でPush通知を受けたときに実行するコマンドを指定できます。value変数に"on"または"off"が格納されてコマンドが実行されます。ボタンの状態に応じてLED[]を点灯/消灯する場合の実行例を下記に示します。
| |
|