Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... ·...

17
1 Universal Sensor Network 説明 for ClouT デモ 慶應義塾大学徳田研究室 米澤拓郎 [email protected] 1. はじめに 本稿では、慶應義塾大学で研究開発を進めている Universal Sensor Network(以下、仮想センサ システム)に関して説明を行っています。仮想センサシステムは、米国カーネギーメロン大学で 開発された Sensor Andrew システムをベースに構築が進められており、基本的には API Sensor Andrew に準拠しております。より詳細な情報は、 論文: “Sensor Andrew: Large-Scale Campus-Wide Sensing and Actuation” http://www.ices.cmu.edu/censcir/resources/SensorAndrew-Tech-Report.pdf また、Sensor-Over-XMPP http://xmpp.org/extensions/inbox/sensors.html を御覧ください。 仮想センサシステムは Sensor Andrew 同様、XMPP 技術に基づいて実装がなされております。 XMPP の基本的な内容は割愛させて頂きますが、仮想センサシステムは Publish-Subscribe デルにもとづいているため、特に、 XEP-0060: Publish-Subscribe プロトコル http://www.xmpp.org/extensions/xep-0060.html)についてご参照ください。 本稿では、具体的な開発を念頭に、1) 仕組みの簡単な説明、2)デモを通じた仮想センサシステ ムの挙動の理解、3) ライブラリ・サンプルプログラムの説明、という手順で説明をさせて頂き ます。不明な点は、いつでも米澤([email protected])までお問い合わせ頂ければと思い ます。また、本稿で説明している手法は、XMPP API を直接叩き仮想センサにアクセスして おります。実証のためにはもう少し仮想センサシステムに特化したラッパーAPI などを用意す ることも検討しています。 2. 仕組みの説明 図1は、仮想センサシステムの仕組み、Publish-Subscribe モデルをシンプルに図示したものと なります。 仮想センサノード設置者側: 仮想センサノードの設置者は、仮想センサノードを仮想センササーバ上に生成します (図 1 (1))。設置者は、生成した仮想センサノードに対し、センサデータを Publish することで、センサデータを配信することが可能です(図 1 (3))。

Transcript of Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... ·...

Page 1: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

1

Universal Sensor Network 説明 for ClouT デモ 慶應義塾大学徳田研究室 米澤拓郎

[email protected] 1. はじめに

本稿では、慶應義塾大学で研究開発を進めている Universal Sensor Network(以下、仮想センサ

システム)に関して説明を行っています。仮想センサシステムは、米国カーネギーメロン大学で

開発された Sensor Andrew システムをベースに構築が進められており、基本的には API は

Sensor Andrewに準拠しております。より詳細な情報は、

論文: “Sensor Andrew: Large-Scale Campus-Wide Sensing and Actuation”

http://www.ices.cmu.edu/censcir/resources/SensorAndrew-Tech-Report.pdf

また、Sensor-Over-XMPP

http://xmpp.org/extensions/inbox/sensors.html

を御覧ください。

仮想センサシステムは Sensor Andrew同様、XMPP技術に基づいて実装がなされております。

XMPP の基本的な内容は割愛させて頂きますが、仮想センサシステムは Publish-Subscribe モ

デ ル に も と づ い て い る た め 、 特 に 、 XEP-0060: Publish-Subscribe プ ロ ト コ ル

(http://www.xmpp.org/extensions/xep-0060.html)についてご参照ください。

本稿では、具体的な開発を念頭に、1) 仕組みの簡単な説明、2)デモを通じた仮想センサシステ

ムの挙動の理解、3) ライブラリ・サンプルプログラムの説明、という手順で説明をさせて頂き

ます。不明な点は、いつでも米澤([email protected])までお問い合わせ頂ければと思い

ます。また、本稿で説明している手法は、XMPPの APIを直接叩き仮想センサにアクセスして

おります。実証のためにはもう少し仮想センサシステムに特化したラッパーAPI などを用意す

ることも検討しています。

2. 仕組みの説明

図1は、仮想センサシステムの仕組み、Publish-Subscribeモデルをシンプルに図示したものと

なります。

仮想センサノード設置者側:

仮想センサノードの設置者は、仮想センサノードを仮想センササーバ上に生成します

(図 1の(1))。設置者は、生成した仮想センサノードに対し、センサデータを Publish

することで、センサデータを配信することが可能です(図 1の(3))。

Page 2: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

2

仮想センサノード利用者側:

仮想センサノード利用者は、仮想センササーバ上に存在する仮想センサノードのうち、

Subscribe したいノードを選択し、Subscribe します(図 1 の(2))。一度そのノード

を Subscribeすれば、そのノードに Publishされたデータは、利用者側に Push配信

されます(図 1の(4))。

図 1: 仮想センサシステム(Publish-Subscribe モデル)概要

上記は、一般的な Publish-Subscribe のモデルとなります。実際は、仮想センサシステムでは、

配信されるセンサデータのフォーマット情報を知れるように、data ノード(ノード名_data と

いうノード名)と meta ノード(ノード名_meta というノード名)を一対の組として管理しま

す。metaノードはセンサノードのメタ情報(搭載されたセンサの種類、センサデータのフォー

マット等の情報)を配信するために利用され、data ノードは実際のセンサデータを配信するた

めに利用されます。

例えば、ここに温度センサと湿度センサが搭載されたMySensorNodeという実センサノード

が存在すると想定してください。仮想センサノード設置者はMySensorNodeを仮想センサノー

ドとして利用可能とするために、MyVirtualSensorNode という名前の仮想センサノードを仮想

セ ン サ サ ー バ に 設 置 し ま す 。 こ の 時 、 実 際 に は MyVirtualSensorNode_meta と

MyVirtualSensorNode_data という2つの組の PubSub ノードが設置されることになります。

設置時に、設置者は、MyVirtualSensorNode_metaに、「MyVirtualSensorNodeには温度セン

サと湿度センサが搭載され、それぞれセルシウスと%が単位として使われる」といったメタ情

報を一度だけ配信します。利用者は、MyVirtualSensorNode_metaの情報を読むことで、その

センサノードにはどういうセンサが搭載されているか、知ることができます。実際のセンサデ

Page 3: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

3

ータは、MyVirtualSensorNode_data を通じて配信されます。

図 2は、より実際の仮想センサシステムに近い図となります。XMPPサーバは ClouTプロジェ

クトではクラウド上へ置かれ、その XMPPサーバ上に metaノードと dataノードの組となる仮

想センサノードが設置されます。アプリケーションは、meta ノードと data ノードの両方を

subscribeし、必要なメタデータとセンサデータを受信・利用することとなります。

図 2: 仮想センサシステム(少し詳細)

3. 仮想センサシステムデモ

http://sox.ht.sfc.keio.ac.jp/~htroot/sox/tools/manager.html

にアクセスしてください(図 3)。5つのリンクで、上からデータの取得、センサデータの配信、

メタデータの配信、仮想センサの生成、仮想センサの削除、のひと通りの挙動が確認できます。

全てのプログラムは Strophe.js(http://strophe.im/strophejs/)を拡張し、記述されています。

図 3:仮想センサシステムデモ

実証ではセンサデータの取得が主になると思いますので、一番上のリンク、Monitoring Page

が参考となると思います。リンクへ飛ぶと、現在登録されている仮想センサノード一覧が表示

されるので(図 4)、例えば「江ノ島ヨットハーバー」というセンサノードにチェックをいれ、

下部の「モニタリング」をクリックしてください。

Page 4: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

4

図 4: センサノード一覧

Monitoringをクリックすると、まず江ノ島ヨットハーバー_metaからセンサノードのメタデー

タが取得・表示され、その後少し待つと江ノ島ヨットハーバー_dataから実際のセンサデータが

取得・表示されます。

図 5: 取得したメタデータ・センサデータの表示

Page 5: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

5

<データ取得までの流れ>

・XMPPサーバ接続から、センサノード一覧取得まで

以下は、Monitoring ページに遷移してから、センサノード一覧が取得されるまでの、ブラ

ウザと XMPP サーバとの通信内容となります。SENT:ではじまるログはブラウザから

XMPPサーバへのメッセージ、RECV:ではじまるログは XMPPサーバからブラウザへのメ

ッセージとなります。重要な部分のみ、説明を付与しておきます。もちろん、この辺りの

メッセージングはライブラリにより隠蔽されるので、読み飛ばしても構いません。

[Log] SENT: <body rid='2630494518' xmlns='http://jabber.org/protocol/httpbind'

sid='8b7c3a098fecd4d7787cd4fa5fb822e735599ea5'/> (soxClient2.js, line 11, x2)

[Log] Connecting... (soxClient2.js, line 11)

[Log] SENT: <body rid='2281766281' xmlns='http://jabber.org/protocol/httpbind'

to='sox.ht.sfc.keio.ac.jp' xml:lang='en' wait='60' hold='1' content='text/xml; charset=utf-8'

ver='1.6' xmpp:version='1.0' xmlns:xmpp='urn:xmpp:xbosh'/> (soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind' xmlns:xmpp='urn:xmpp:xbosh'

xmlns:stream='http://etherx.jabber.org/streams'

sid='31670ad3b370116aaa491f355a710edda43d5da0' wait='60' requests='2' inactivity='30'

maxpause='120' polling='2' ver='1.8' from='sox.ht.sfc.keio.ac.jp' secure='true'

authid='2507633871' xmpp:version='1.0'><stream:features

xmlns:stream='http://etherx.jabber.org/streams'><mechanisms

xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>SCRAM-SHA-1</mechanism><me

chanism>ANONYMOUS</mechanism><mechanism>DIGEST-MD5</mechanism><mechani

sm>PLAIN</mechanism></mechanisms><c xmlns='http://jabber.org/protocol/caps'

hash='sha-1' node='http://www.process-one.net/en/ejabberd/'

ver='TQ2JFyRoSa70h2G1bpgjzuXb2sU='/><register

xmlns='http://jabber.org/features/iq-register'/></stream:features></body> (soxClient2.js, line

11)

[Log] SENT: <body rid='2281766282' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'><auth

xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='ANONYMOUS'/></body>

匿名ユーザで認証

Page 6: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

6

(soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind'><success

xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/></body> (soxClient2.js, line 11)

[Log] SENT: <body rid='2281766283' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0' to='sox.ht.sfc.keio.ac.jp'

xml:lang='en' xmpp:restart='true' xmlns:xmpp='urn:xmpp:xbosh'/> (soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind' xmlns:xmpp='urn:xmpp:xbosh'

xmlns:stream='http://etherx.jabber.org/streams'

sid='31670ad3b370116aaa491f355a710edda43d5da0' wait='60' requests='2' inactivity='30'

maxpause='120' polling='2' ver='1.8' from='sox.ht.sfc.keio.ac.jp' secure='true'

authid='961477476' xmpp:version='1.0'><stream:features

xmlns:stream='http://etherx.jabber.org/streams'><bind

xmlns='urn:ietf:params:xml:ns:xmpp-bind'/><session

xmlns='urn:ietf:params:xml:ns:xmpp-session'/><c xmlns='http://jabber.org/protocol/caps'

hash='sha-1' node='http://www.process-one.net/en/ejabberd/'

ver='TQ2JFyRoSa70h2G1bpgjzuXb2sU='/><register

xmlns='http://jabber.org/features/iq-register'/></stream:features></body> (soxClient2.js, line

11)

[Log] SENT: <body rid='2281766284' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'><iq type='set' id='_bind_auth_2'

xmlns='jabber:client'><bind

xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>pubsub</resource></bind></iq></bod

y> (soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind'><iq xmlns='jabber:client'

id='_bind_auth_2' type='result'><bind

xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>[email protected]

.keio.ac.jp/pubsub</jid></bind></iq></body> (soxClient2.js, line 11)

PubSubリソースへのアクセス

Page 7: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

7

[Log] SENT: <body rid='2281766285' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'><iq type='set' id='_session_auth_2'

xmlns='jabber:client'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq></body>

(soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind'><iq xmlns='jabber:client'

type='result' id='_session_auth_2'><session

xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq></body> (soxClient2.js, line 11)

[Log] Almost done... (soxClient2.js, line 11)

[Log] SENT: <body rid='2281766286' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'><presence

xmlns='jabber:client'><priority>-1</priority></presence><iq to='pubsub.sox.ht.sfc.keio.ac.jp'

type='get' id='1:pubsub' xmlns='jabber:client'><query

xmlns='http://jabber.org/protocol/disco#items'/></iq></body> (soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind'><presence

xmlns='jabber:client' from='[email protected]/pubsub'

to='[email protected]/pubsub'><priority>-1</priority></

presence><iq xmlns='jabber:client' from='pubsub.sox.ht.sfc.keio.ac.jp'

to='[email protected]/pubsub' id='1:pubsub'

type='result'><query xmlns='http://jabber.org/protocol/disco#items'><item

jid='pubsub.sox.ht.sfc.keio.ac.jp' node='藤沢橋_meta'/><item

jid='pubsub.sox.ht.sfc.keio.ac.jp' node='genova5_data'/>...(長いので省略)...<item

jid='pubsub.sox.ht.sfc.keio.ac.jp' node='Paris_Air_Pollution_meta'/><item

jid='pubsub.sox.ht.sfc.keio.ac.jp' node='利尻放射線量モニタリングデータ

_meta'/></query></iq></body> (soxClient2.js, line 11)

[Log] SENT: <body rid='2281766287' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'/> (soxClient2.js, line 11)

センサノード一覧取得要求

取得したセンサノード一覧

Page 8: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

8

・ 「江ノ島ヨットハーバー」ノードからデータを受信するまで

[Log] SENT: <body rid='2281766323' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'><iq to='pubsub.sox.ht.sfc.keio.ac.jp'

type='set' id='2:pubsub' xmlns='jabber:client'><pubsub

xmlns='http://jabber.org/protocol/pubsub'><subscribe node='江ノ島ヨットハーバー_data'

jid='[email protected]/pubsub'/></pubsub></iq><iq

from='[email protected]/pubsub'

to='pubsub.sox.ht.sfc.keio.ac.jp' type='set' id='5:pubsub' xmlns='jabber:client'><pubsub

xmlns='http://jabber.org/protocol/pubsub'><subscribe node='江ノ島ヨットハーバー_meta'

jid='[email protected]/pubsub'/></pubsub></iq></body>

(soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind'><message

xmlns='jabber:client' from='pubsub.sox.ht.sfc.keio.ac.jp'

to='[email protected]/pubsub'><event

xmlns='http://jabber.org/protocol/pubsub#event'><items node='江ノ島ヨットハーバー

_data'><item id='current'><data><transducerValue id='平均風速' rawvalue='3.8 '

typedvalue='3.8' name='平均風速'

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='平均風向'

rawvalue='北 ' typedvalue='北' name='平均風向'

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='最大風速'

rawvalue='7.6 ' typedvalue='7.6' name='最大風速'

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='気温'

rawvalue='27.3 ' typedvalue='27.3' name='気温'

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='湿度'

rawvalue='48.7 ' typedvalue='48.7' name='湿度'

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='雨量(過去1時間)'

rawvalue='0 ' typedvalue='0' name='雨量(過去1時間)'

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='潮位' rawvalue='124

' typedvalue='124' name='潮位'

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='latitude'

rawvalue='35.30169784953255 ' typedvalue='35.30169784953255' name='latitude'

_data と _metaノードを subscribe

Page 9: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

9

timestamp='2014-09-29T11:04:13.337413+0900'/><transducerValue id='longitude'

rawvalue='139.48351085186005 ' typedvalue='139.48351085186005' name='longitude'

timestamp='2014-09-29T11:04:13.337413+0900'/></data></item></items></event><delay

xmlns='urn:xmpp:delay' from='[email protected]/11184251971411956253335265'

stamp='2014-09-29T02:04:13Z'/></message><iq xmlns='jabber:client'

from='pubsub.sox.ht.sfc.keio.ac.jp'

to='[email protected]/pubsub' id='4:pubsub'

type='result'><pubsub xmlns='http://jabber.org/protocol/pubsub'><subscription

jid='[email protected]/pubsub'

subscription='subscribed' subid='583E977F157E8' node='江ノ島ヨットハーバー

_data'/></pubsub></iq><message xmlns='jabber:client' from='pubsub.sox.ht.sfc.keio.ac.jp'

to='[email protected]/pubsub'><event

xmlns='http://jabber.org/protocol/pubsub#event'><items node='江ノ島ヨットハーバー

_meta'><item id='metaInfo'><device name='江ノ島ヨットハーバー' type='outdoor

weather'>&lt;transducer name=&apos;平均風速&apos; id=&apos;平均風速&apos;

units=&apos;m/s&apos; /&gt; &lt;transducer name=&apos;平均風向&apos; id=&apos;平均風

向&apos; /&gt;&lt;transducer name=&apos;最大風速&apos; id=&apos;最大風速&apos;

units=&apos;m/s&apos; /&gt;&lt;transducer name=&apos;気温&apos; id=&apos;気温&apos;

units=&apos;℃&apos; /&gt;&lt;transducer name=&apos;湿度&apos; id=&apos;湿度&apos;

units=&apos;%&apos; /&gt;&lt;transducer name=&apos;雨量(過去1時間)&apos; id=&apos;

雨量(過去1時間)&apos; units=&apos;mm&apos; /&gt;&lt;transducer name=&apos;潮位

&apos; id=&apos;潮位&apos; units=&apos;cm&apos; /&gt;&lt;transducer

name=&apos;latitude&apos; id=&apos;latitude&apos; /&gt; &lt;transducer

name=&apos;longitude&apos; id=&apos;longitude&apos; /&gt;

</device></item></items></event><delay xmlns='urn:xmpp:delay'

from='[email protected]/726384701411520086551074'

stamp='2014-09-24T00:57:46Z'/></message><iq xmlns='jabber:client'

from='pubsub.sox.ht.sfc.keio.ac.jp'

to='[email protected]/pubsub' id='5:pubsub'

type='result'><pubsub xmlns='http://jabber.org/protocol/pubsub'><subscription

jid='[email protected]/pubsub'

subscription='subscribed' subid='583E977F19921' node='江ノ島ヨットハーバー

_meta'/></pubsub></iq></body>

Subscribe成功。直近に配信されたデータが配信される。 メタデータとしては、この配信データを利用。

Page 10: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

10

[Log] SENT: <body rid='2281766324' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'/> (soxClient2.js, line 11)

[Log] RECV: <body xmlns='http://jabber.org/protocol/httpbind'><message

xmlns='jabber:client' from='pubsub.sox.ht.sfc.keio.ac.jp'

to='[email protected]/pubsub' type='headline'><event

xmlns='http://jabber.org/protocol/pubsub#event'><items node='江ノ島ヨットハーバー

_data'><item id='current'><data><transducerValue id='平均風速' rawvalue='3.8 '

typedvalue='3.8' name='平均風速'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='平均風向'

rawvalue='北 ' typedvalue='北' name='平均風向'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='最大風速'

rawvalue='7.6 ' typedvalue='7.6' name='最大風速'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='気温'

rawvalue='27.3 ' typedvalue='27.3' name='気温'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='湿度'

rawvalue='48.7 ' typedvalue='48.7' name='湿度'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='雨量(過去1時間)'

rawvalue='0 ' typedvalue='0' name='雨量(過去1時間)'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='潮位' rawvalue='124

' typedvalue='124' name='潮位'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='latitude'

rawvalue='35.30169784953255 ' typedvalue='35.30169784953255' name='latitude'

timestamp='2014-09-29T11:05:12.430718+0900'/><transducerValue id='longitude'

rawvalue='139.48351085186005 ' typedvalue='139.48351085186005' name='longitude'

timestamp='2014-09-29T11:05:12.430718+0900'/></data></item></items></event><headers

xmlns='http://jabber.org/protocol/shim'><header name='Collection'>江ノ島ヨットハーバー

_data</header></headers></message></body> (soxClient2.js, line 11)

[Log] SENT: <body rid='2281766325' xmlns='http://jabber.org/protocol/httpbind'

sid='31670ad3b370116aaa491f355a710edda43d5da0'/> (soxClient2.js, line 11)

センサデータが配信される

Page 11: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

11

通常、XMPP サーバとのやりとりは専用ポートに対するソケット通信ですが、ブラウザで

実行可能とするように、Boshを用いて XMPP over HTTP通信を行っています。なので、

メッセージは<body>で開始されています。通常の通信では、下記のようにもう少しシンプ

ルなメッセージングとなります(上から赤文字 ->Sent、青文字 ->Receved、緑文字

->Interpretedメッセージ)。

図 6:XMPP メッセージング

Page 12: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

12

4. サンプルプログラム等

・基本情報

XMPP サーバ : sox.ht.sfc.keio.ac.jp (133.27.170.67)

Bosh (XMPPoverHTTP 用) : http://sox.ht.sfc.keio.ac.jp:5280/http-bind/

Anonymous ユーザで PubSub 機能利用可能(Subscribe/Publish のみ。ノード生

成は不可能)

実証実験用 JID: [email protected]

パスワード : pAnAke!o

※ 実証時には NTT東日本のクラウドに XMPPサーバを設置するため、ホスト名・IPが

変更となる予定です

基本的な APIは XMPPプロトコル、および PubSubプロトコルに従ったものとなります

ので、そちらをご確認ください。XMPP関係の仕様は http://xmpp.org/xmpp-protocols/

にリンクがございます。

PubSub に 関 し て は 、 http://www.xmpp.org/extensions/xep-0060.html を 、

Sensor-Over-XMPPに関しては、http://xmpp.org/extensions/inbox/sensors.html を、ご

確認ください。

ここでは、慶應大学で開発した仮想センサ用ライブラリ(JavaScript版)の利用に関して、

説明致します。他言語版のライブラリは、XMPPのライブラリを用いて開発することとな

ります。慶應では、Java、Objective-Cで動作実績があります。

(1) ライブラリダウンロード

ライブラリおよびサンプルコード一式を、

http://www.ht.sfc.keio.ac.jp/~takuro/tmp/ClouTUSN20140929.zip

からダウンロードして下さい。解凍すると、ディレクトリの中にはライブラリおよびサン

プルコードが含まれています。./js/Device.js, TransducerValue.js, Transducer.js が、仮想

センサノード/データ用のライブラリとなり、./js/lib 以下が、オープンソースの使用ライブ

ラリ(一部改変)となります。また、soxDeviceClient.html は、テスト用のコードとなり

ます。ファイル一覧は、図 7に示されたものとなります。

Page 13: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

13

図 7:ライブラリおよびサンプルコード一式

まずは、soxDeviceClient.html をブラウザで開いてください。少し待っていると、江ノ島

ヨットハーバーに関するセンサ情報一式が配信されてきます(図 8)。

図 8:サンプルプログラム動作図

Page 14: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

14

本プログラムでは、下記のように、仮想センサノード(Device)に搭載された各センサ

(Transducer)ごとに、センサデータ(TransducerValue)が表示されています。

TransducerValue[rawValue=7.0 , typedValue=7.0, timestamp=Mon Sep 29 2014 16:05:12 GMT+0900

(JST), id=平均風速] ←センサデータ

[Transducer name=平均風速, id=平均風速, units=m/s, unitScaler=NaN, canActuate=false,

hasOwnNode=false, typeName=undefined, manufacturer=undefined, partNumber=undefined,

serialNumber=undefined, minValue=NaN, maxValue=NaN, resolution=NaN, precision=NaN,

precision=NaN, accuracy=NaN] ←センサのメタデータ

[Device xmppServer=sox.ht.sfc.keio.ac.jp, nodeName=江ノ島ヨットハーバー, type=outdoor weather,

name=江ノ島ヨットハーバー] ←センサノード名

以下、soxDeviceClient.htmlのソースコードをご確認ください。

・ 仮想センサデバイスの取得・サブスクライブ

var device = new Device("Boshサービス", "XMPPホスト", "仮想センサ名", " JID", "password"); device.subscribe();

で、device変数に、仮想センサノードを代入します。サンプルプログラムでは、

var device = new Device("http://sox.ht.sfc.keio.ac.jp:5280/http-bind/",

"sox.ht.sfc.keio.ac.jp", "江ノ島ヨットハーバー",

"[email protected]", "pAnAke!o");

となっていると思います。

・イベントハンドラの登録

device.setTransducerValueListener(イベントハンドラ関数);

で、イベントハンドラ関数を登録できます。Subscribeしたノードからセンサデータが配信

された場合、イベントハンドラ関数が呼び出されます。サンプルプログラムでは、

Page 15: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

15

function eventListener(device, transducer, data) {

$("#message").append("<div style ='color: #ff9c00'>" +

data.toString() + "</div>");

$("#message").append("<div style ='color: #9c9900'>" +

transducer.toString() + "</div>");

$("#message").append("<div style ='color: #9c00ff'>" +

device.toString() + "</div>");

$("#message").append("<p>");

}

の関数として処理がなされています。

Device.js, Transducer.js, TransducerValue.js では、それぞれデバイスに関する情

報、センサに関する情報、センサデータに関する情報が管理されています。イベントハンドラ

の中で、data.rawValue とすると、配信されたセンサデータの rawValueを直接取得可能で

す。Device.js, Transducer.js, TransducerValue.jsそれぞれが保有するデータ等に

関しては、それぞれのソースプログラムをご確認ください。基本的に、Sensor-over-XMPP

(http://xmpp.org/extensions/inbox/sensors.html)の定義に準拠しています(Table1,2,3

を参照)。

Table 1: Device Attributes

Attribute Description/Purpose

name A human friendly name for the device

id A unique identifier for the logical device. This SHOULD be the UUID that corresponds to

the logical device.

type The type of the transducer platform (see below)

timestamp Format as defined in XEP-0082: XMPP Date and Time Profiles.

description A human friendly description of the device

serialNumber A serial number or other unique identifier for the physical device

Page 16: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

16

Table 2: Transducer Attributes

Attribute Description/Purpose

name A human friendly identifier to distinguish between various possible transducers

within a device

id

A unique identifier for the transducer used within the XML packet to enumerate

different transducers within a single packet The tuple (UUID X, transducer id Y)

MUST be unique such that a publish operation to a data value node X_data with

the transducer id Y unambiguously refers to one and only one transducer.

units Unit of measure (see below)

unitScaler The scale of the unit as a power of 10 (i.e. n for 10 ** n)

canActuate Indicates whether the transducer can be actuated

hasOwnNode Indicates whether the transducer data has its own node or whether it is part of the

generic data value node (see below)

transducerTypeName A human readable indication of the type of transducer

manufacturer Manufacturer of the transducer

partNumber Manufacturer's part number of the transducer

serialNumber Manufacturer's serial number of the transducer

minValue The expected minimum value for this transducer

maxValue The expected maximum value for this transducer

resolution The resolution of the values reported by this transducer

precision The precision of the values reported by this transducer

accuracy The accuracy of the values reported by this transducer

Page 17: Universal Sensor Network 説明 for ClouTデモ › ~takuro › code › SoxLibJS › USN... · 2015-02-15 · 1 Universal Sensor Network説明 for ClouTデモ 慶應義塾大学徳田研究室

17

Table 3: Transducer Value(センサデータ) Attributes

Attribute Description/Purpose

id

The transducer id. This MUST correspond to a transducer Id as defined in the transducer

packet. The tuple (UUID X, transducer id Y) MUST be unique such that a publish operation

to a data value node X_data with the transducer id Y unambiguously refers to one and only

one transducer.

typedValue The value representing the transducer data which is in the units as defined in the transducer

units attribute

timestamp Format as defined in XEP-0082: XMPP Date and Time Profiles.

rawValue The raw value as seen by the transducer. The rawValue can be used to record a non-unit

converted value for record keeping (e.g. a raw ADC value before calibration).