Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
Xively

概要

IoT(Internet of Things: モノのインターネット)のためのクラウドサービス(PaaS(Platform as a Service))であるXivelyにデータを送信してみます。Xivelyが提供しているArduinoライブラリのサンプルコードをそのまま動かしているだけです。非常に簡単にデータをアップロードすることができます。Ethernetシールドを利用します。

これにより、インターネットに接続されている環境であればArduinoで測定したデータを外部に記録し続けることができます。屋外などではWifi環境や移動するのであれば3G環境などが必要かもしれませんが。

Xivelyで扱うデータの構造などについて整理しました。あくまで私の理解です。このため、間違いが含まれている可能性もあるので注意してください。間違いを見つけた方はぜひお知らせください。

Xively

簡単にXivelyの説明をした後、Xivelyで取り扱うオブジェクトと開発サイクル、アカウントの作成方法を説明します。

Xivelyとは

Xivelyとは、IoTのためのクラウドサービス(PaaS)です。種々のデバイスからデータデータを送信してストレージに記録することができます。REST APIを提供しており、REST APIをラップするための各種デバイス向けのAPIも提供しています。Arduino向けのAPI(ライブラリ)も提供しています。

一つ以上のデバイスからXivelyに対してデータを送信します。送信したデータを活用することができます。データの量にもよりますが、簡単なグラフ化からHadoopなどを用いた解析まで様々なことができるのではないかと思います。

Xivelyは商用サービスですが、開発者向けの無料サービスも提供しています。開発者向けのアカウントでできるのは以下の通りです。

  • 5個のデバイスの利用
  • APIに対するフルアクセス
  • 1分あたり25回のAPI呼出(3分の移動平均)
  • 30日間のデータ保管
  • Webツールへのアクセス

Xivelyで取り扱うオブジェクト

XivelyではREST APIを利用してオブジェクト(データ)の操作を行います。Xivelyにデータを送信する際に必要となるオブジェクトの構造がどのような構成となっているのかを簡単にまとめます。

Xivelyで取り扱う主要なオブジェクトは、プロダクト・デバイス・フィード・データストリーム・データポイントの5つです。

プロダクト
Xivelyでの最上位の概念。個々の製品ではなく概念としての製品。例えば、製品の総称としてのArduinoなど。
デバイス
プロダクトを実体化したもの。個々の製品。例えばパーツ店などで販売しているArduinoボードなど。
フィード
個々のデバイスに割り与えられるデータ転送用のチャネル(データストリーム)の集合。一つのフィードで複数のデータを取得することができます。
データストリーム
フィードに割り与えられるデータ転送用チャネル。一つのフィードに複数のデータストリームを持つことができます。これにより、一つのフィードに、例えば、気温と湿度の気圧の3種類のデータを結びつけることができます。
データポイント
データストリームに送信された個々のデータ。例えば、ある時刻の気温データなど。

インスタンスの関係を図に示すと以下の通りです。

上記以外に、オブジェクトを操作するためにはAPIキーが必要です。APIキーは、権限(書き込み許可など)を表すオブジェクトです。

また、データがある条件を満たしたときに設定したURLを呼び出す「Trigger」というオブジェクトや、デバイスの位置を表す「Location」というオブジェクトも存在します。が、まだ実験できていません。

Xivelyの開発サイクル

Xivelyのチュートリアルページによると、Xivelyでの開発サイクルは以下の通りです。

  1. Develop(開発)
  2. Deploy(配備)
  3. Manage(管理)

現状、このページでは、上記のうちのDevelopに焦点を当てています。

Develop

製品のプロトタイプを作成する段階(状態)です。一つのデバイスを取り扱います。プロトタイプを作成した後、Xivelyにデバイスを接続してテストします。このページではこの部分の説明がメインです。

Develop段階では、一つのデバイスを用いてプログラムの開発などを行います。この際自動的にProduct IDやDevice ID(シリアルナンバー)Feed IDが割り与えられます。具体的にどのようなデータストリームを取り扱うかなどを決めた後、実際にそのデータを送信してみて問題がないかを確認します。

Deploy

プロトタイプをプロダクトにします。デプロイするときは、物理プロダクトに対応する仮想プロダクトをXively上に作成します。Devlop状態のプロトタイプをデプロイすることでManage状態になります。

開発したプロトタイプをデプロイすることで、新たなProduct IDが割り与えられプロダクトになります。この際、データストリームの設定はは自動的に引き継がれます。

Manage

管理コンソールを利用して、デプロイしたプロダクトを管理します。複数のデバイスを取り扱うことができます。

プロダクトのデプロイ後は、デバイスに付与されるDevice ID(シリアルナンバー)は、自分で割り当てる(登録する)必要があります。デバイスにシリアルナンバーを付与すると自動的にFeed IDが付与されます。個々のデバイスにはこのFeed IDを割り当てる必要があります。実際にデバイスを利用するにはデバイスをアクティベートする必要があります。そのためのWebインターフェイスやREST APIが用意されています。

ArduinoからXivelyにデータを送信する

Develop段階で、ArduinoからXivelyにデータを送信するために必要な操作説明です。Arduino用のライブラリが用意されています。このライブラリを利用することで、REST APIを意識することなく、ArduinoからXivelyにデータを送信あるいはXivelyからデータを受信することができるようになっています。

ここでは、Xivelyのライブラリに付属しているサンプルプログラムを動かすために必要となる、Xivelyのアカウント作成、ライブラリのインストール、Xivelyの操作、サンプルプログラムの修正について説明を行います。

アカウントの作成

Xivelyを利用するためには、アカウントを作成する必要があります。

Xivelyにアカウントを作成するには、https://xively.com/signup にアクセスして、必要事項を記入します。その後、Sign Upボタンを押すと、登録したメールアドレス宛にメールが届きます。そのメールにはアカウントをアクティベートするためのURLが記載されているので、そのURLにアクセスしてアカウントをアクティベートすると作業は完了です。

ライブラリのインストール

Xivelyのライブラリを利用するためには、HttpClientとXivelyの2つのライブラリをインストールする必要があります。ライブラリのインストール方法はこちらを参照してください。なお、Arduinoライブラリのディレクトリ名には「-(ハイフン)」は利用できません。GitHubからダウンロードしたmasterファイルは「-master」という文字列で終わるようなので修正が必要です。注意してください。

HttpClient

https://github.com/amcewen/HttpClientからHttpClientライブラリをダウンロードして、ライブラリをインストールします。

Xively

https://github.com/xively/xively_arduinoからXivelyライブラリをダウンロードして、ライブラリをインストールします。

Xivelyの操作

Xivelyのサイトでログインすると、管理画面が現れます。

「Add Device」をクリックすると、次の画面に遷移します。

デバイス名(必須)とデバイスの説明(オプション)を記入、Privacyを選択し、「Add Device」をクリックします。デバイスが追加され、各種情報が表示されます。

プログラムを作成するには、上記のFeed IDと API Keyの値が必要です。

サンプルプログラムの修正

Xivelyライブラリについてくる、MultipleDatastreamsUpload.inoを例に、サンプルプログラムの修正点を示します。

以下を修正して、コンパイルしArduinoにプログラムを書き込むと、さっそくデータがXivelyにアップロードされ始めます。

MACアドレス

7行目付近のMACアドレスを自分のEthernetシールドのMACアドレスに変更します。

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

APIキー

10行目付近にあるxivelyKeyに、先ほど取得したAPI Keyを書き込みます。

char xivelyKey[] = "YOUR_API_KEY";

Feed ID

27行目付近にある XivelyFeed 型の変数 feed のコンストラクタの第一引数を、自分のデバイスのFeed IDに置き換えます。

XivelyFeed feed(15552, datastreams, 3 /* number of datastreams */);

アップロードされている様子

APIの使い方

以下にXivelyライブラリが提供しているクラスを簡単に紹介します。XivelyDatastream、XivelyFeed、XivelyClientの3つのクラスを利用します。

XivelyDatastreamクラス

データストリームを定義するクラスです。取り扱うデータは、String型(DATASTREAM_STRING)、バッファ型(DATASTREAM_BUFFER)、整数型(DATASTREAM_INT)、浮動小数点型(DATASTREAM_FLOAT)の4種類です。

文字列型はString型の値を取り扱います。バッファ型はchar *型の値を取り扱います。バッファ型を利用するためには、オブジェクトを作成する際に、文字列を格納する領域を自分で用意しておく必要があります。

このクラスが保持するデータは、データストリームに対するIDと値から構成されます。同一のIDに対してデータを送信することで、そのIDに対応するデータが蓄積されていきます。例えば、temperatureというIDをつけたデータストリームに、温度データを送信するといった使い方をします。

サンプルプログラムで示されているように、必要なデータストリームの数だけオブジェクトを作成し、それらのオブジェクトを一つの配列に格納します。

コンストラクタ

コンストラクタでは、データストリームのIDとデータの型を指定します。IDの指定方法とデータ型の組み合わせにより、以下の3種類のコンストラクタを使い分けます。

書式

XivelyDatastream(String& aId, int aType);
XivelyDatastream(char* aIdBuffer, int aIdBufferLength, int aType);
XivelyDatastream(char* aIdBuffer, int aIdBufferLength, int aType, char* aValueBuffer, int aValueBufferLength);

取り扱うデータ型とコンストラクタの組み合わせは以下の通りです。

データ型 利用可能なコンストラクタ
DATASTREAM_STRING XivelyDatastream(String& aId, int aType)
XivelyDatastream(char* aIdBuffer, int aIdBufferLength, int aType)
DATASTREAM_INT
DATASTREAM_FLOAT
DATASTREAM_BUFFER XivelyDatastream(char* aIdBuffer, int aIdBufferLength, int aType, char* aValueBuffer, int aValueBufferLength)

引数

aID ストリームID(String&型)
aIdBuffer ストリームID(char *型)
aIdBufferLength ストリームID長
aType データ型。DATASTREAM_STRING/DATASTREAM_INT/DATASTREAM_FLOAT/DATASTREAM_BUFFER
aValueBuffer DATASTREAM_BUFFERを利用する場合のバッファ領域。
aValueBufferLength DATASTREAM_BUFFERを利用する場合のバッファ長。

戻り値

なし

値の設定

データ型毎に値を設定するメソッドが用意されています。

書式

void XivelyDatastream::setString(String& aValue);
void XivelyDatastream::setInt(int aValue);
void XivelyDatastream::setFloat(float aValue);
void XivelyDatastream::setBuffer(const char* aBuffer);

コンストラクタで指定したデータ型毎に異なるメソッドを利用します。異なるデータ型用のメソッドを利用すると何も設定されません。

引数

aValue 設定したい値。
aBuffer 設定したいバッファ。

戻り値

なし

値の取得

データ型毎に値を取得するメソッドが用意されています。

書式

String& XivelyDatastream::getString();
int XivelyDatastream::getInt();
float XivelyDatastream::getFloat();
char* XivelyDatastream::getBuffer();

引数

なし。

戻り値

取得した値。

XivelyFeedクラス

フィードを定義するクラスです。Feed IDとデータストリームとを結びつけます。明示的に利用するのはコンストラクタだけです。

コンストラクタ

Feed IDとデータストリームとを結びつけます。

書式

  XivelyFeed(unsigned long aID, XivelyDatastream* aDatastreams, int aDatastreamsCount);

引数

aID デバイスごとに割り当てられたフィードID。
aDatastreams データストリームの配列。フィードに割り当てるデータストリームを必要数指定する。
aDatastreamsCount データストリームの数。

戻り値

なし。

XivelyClientクラス

Feedに対してデータの送受信を行います。

コンストラクタ

ClientとXivelyクライアントとを結びつけます。

書式

XivelyClient::XivelyClient(Client& aClient);

引数

aClient Xivelyとネットワーク接続するためのクライアント。

EthernetシールドやWiFiシールドのクライアントを指定します。

戻り値

なし。

フィードへのデータ送信

Feedに対してデータを送信します。

書式

int XivelyClient::put(XivelyFeed& aFeed, const char* aApiKey);

引数

aFeed データストリームと結びつけたフィード。
aApiKey Xivelyから取得したAPIキー。

戻り値

HTTPのステータスコード。

ステータスコードが200番台の場合は、そのままの数値。200番台のステータスコード以外の場合は、-1を掛けた数値。HttpClientライブラリがエラーで負数を返した場合(HTTP_ERROR_CONNECTION_FAILEDなど)は、そのままの数値。

フィードからのデータ受信

Feedからデータを受信します。

書式

int XivelyClient::get(XivelyFeed& aFeed, const char* aApiKey);

引数

aFeed データストリームと結びつけたフィード。
aApiKey Xivelyから取得したAPIキー。

戻り値

HTTPのステータスコード。

ステータスコードが200番台の場合は、そのままの数値。200番台のステータスコード以外の場合は、-1を掛けた数値。HttpClientライブラリがエラーで負数を返した場合(HTTP_ERROR_CONNECTION_FAILEDなど)は、そのままの数値。

バージョン

Arduino 1.5.5/Arduino Uno



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2014 garretlab all rights reserved.
inserted by FC2 system