観測した情報に基づいて上位のノードへイベントを送信する第1センサノードおよび第2センサノードと、下位のノードへ予め設定したコマンドを含むスクリプトを送信し、前記第1および第2センサノードからのイベントを受信するクライアントノードと、前記第1および第2センサノードからクライアントノードへの通信を取り次ぐ中間ノードと、を備えたセンサネットワークシステムにおいて、前記クライアントノードは、予め複数のノードに対する処理が設定されたスクリプトを実行し、下位のノードに対するスクリプトを抽出して前記下位ノードへ前記抽出したスクリプトを配布する第1のスクリプトマネージャを有し、前記中間ノードは、前記第1のスクリプトマネージャが配布したスクリプトを実行し、当該中間ノードに対する制御を実行し、下位のノードに対するスクリプトを抽出して当該ノードへ前記抽出したスクリプトを配布する第2のスクリプトマネージャを有し、前記第1および第2センサノードは、各々前記第2のスクリプトマネージャが配布したスクリプトを実行することで観測した情報に基づくイベントを上位のノードに送信する第3のスクリプトマネージャを有し、前記第2のスクリプトマネージャから前記第1センサノードに配布された第1スクリプトと、前記第2センサノードに配布された第2スクリプトは、異なるスクリプトであることを特徴とするセンサネットワークシステム。前記スクリプトは、前記下位のノードに対するスクリプトを部分スクリプトとして入れ子構造で内包し、前記第1のスクリプトマネージャは、自ノードよりも下位のノードに対する部分スクリプトを抽出して前記下位のノードへ部分スクリプトを配布し、前記第2のスクリプトマネージャは、自ノードよりも下位のノードに対する部分スクリプトを抽出して前記下位のノードへ部分スクリプトを配布することを特徴とする請求項1に記載のセンサネットワークシステム。前記スクリプト及び部分スクリプトは、木構造のコマンドとして記述され、前記第1ないし第3のスクリプトマネージャは、木構造の根に当たる親コマンドを実行する以前に全ての子コマンドをその出現順に実行し、子コマンドの実行結果をデータに置き換えて親コマンドの引数とすることを特徴とする請求項2に記載のセンサネットワークシステム。前記コマンドは、当該コマンドの実行完了を待たずに直ちに未完了状態で終了する非同期コマンドを含み、前記第1ないし第3のスクリプトマネージャは、前記子コマンドとして非同期コマンドを実行する際には、前記子コマンドに実行を指令した後に、当該子コマンドの親コマンドを未完了状態で終了させて、前記子コマンドからの実行結果の返戻があるまで待機するアクションハンドラを有し、前記アクションハンドラは、子コマンドからの実行結果の返戻を契機に、前記未完了状態で終了した親コマンドの実行を再開することを特徴とする請求項3に記載のセンサネットワークシステム。第1のセンサノードと第2センサノードが観測した情報を中間ノードから上位のクライアントノードへイベントとして順次送信するセンサネットワークのデータ処理方法であって、前記クライアントノードまたは中間ノードの上位のノードが、予め複数のノードに対するコマンドが設定されたスクリプトから下位ノードに対するスクリプトを抽出して前記下位ノードへ前記抽出したスクリプトを配布する第1のステップと、前記スクリプトから自ノードに対する処理を各々実行する第2のステップと、前記下位ノードが前記配布されたスクリプトを受信し、当該ノードに対する処理を実行する第3のステップと、前記下位ノードが前記スクリプトから自ノードよりも下位のノードに対するスクリプトを抽出し、下位ノードに対するスクリプトが存在すれば前記下位ノードへ前記抽出したスクリプトを配布する第4のステップと、を含み、前記第4のステップは、前記自ノードよりも下位のノードとして前記第1のセンサノードと第2センサノードに前記スクリプトを配布し、前記第1および第2センサノードは、各々前記配信されたスクリプトを実行することで観測した情報に基づくイベントを上位のノードに送信するステップ含み、前記第2のスクリプトマネージャから前記第1センサノードに配布された第1スクリプトと、前記第2センサノードに配布された第2スクリプトは、異なるスクリプトであることを特徴とするセンサネットワークのデータ処理方法。前記スクリプトは、前記下位のノードに対するスクリプトを部分スクリプトとして入れ子構造で内包し、前記スクリプトを配布するステップは、自ノードよりも下位のノードに対する部分スクリプトを抽出して前記下位のノードへ部分スクリプトを配布することを特徴とする請求項5に記載のセンサネットワークのデータ処理方法。上記従来例のイベントハンドラは、センサノードやサーバなどの各ノード上に実装されたプログラムであり、イベントハンドラの動作フローは運用前に決定され、運用中は固定であった。イベントハンドラの動作フローを変更するためには、ノード上に実装されたプログラムを再登録する必要があった。ノード上のプログラムのサイズは巨大であり、無線通信で送信できない場合もあるため、動作フローを変更するためにはノードを回収して有線通信でプログラムを交換する必要がある場合もあった。ここで、センサネットワークを利用するユーザは、センサノードから収集した情報を様々な情報に加工して利用することができる。この場合、各ノードの動作フローを変更することで、ユーザの要求に応えることができる。しかしながら、各ノードの動作フローを変更するには、上記従来例のように多数のノードのプログラムを再登録する必要が生じてしまい、容易に動作フローを変更できない、という問題がある。ここで、動作フローの変更が必要となる要因として、次の要因が考えられる。第一の要因は、ユーザ目的の変化である。特定目的を想定した小規模センサネットワークではなく、複数の目的に利用可能な大規模センサネットワークの場合、一般にセンサネットワークの運用開始後に、複数のユーザ目的を実現するために複数の動作フローが決定される。また動作フローはユーザ目的の変化に合わせて動的に変化していく。上記従来例においては、センサネットワークの管理者が全てのユーザ目的の変化に対応して動作フローを変更していくことは困難であった。第二の要因は、状況の変化である。たとえば移動体を監視するセンサネットワークにおいて、移動体が存在しないことが分かっているセンサノードが観測を行うことは無駄である。また温度センサノードの観測に基づきエアコンディショナーを起動するセンサネットワークにおいて、火災発生時に該温度センサノードが観測を行うことは無駄である。上記従来例の固定されたイベントハンドラでは、このような状況の変化に応じて動作フローを変更するのは困難であった。そこで本発明は、上記問題点に鑑みてなされたもので、各ノードの動作フローをユーザの要求や状況に応じて動的に変更することを容易に行うことが可能なセンサネットワークを提供することを目的とする。本発明は、観測した情報に基づいて上位のノードへイベントを送信する第1センサノードおよび第2センサノードと、下位のノードへ予め設定したコマンドを含むスクリプトを送信し、前記第1および第2センサノードからのイベントを受信するクライアントノードと、前記第1および第2センサノードからクライアントノードへの通信を取り次ぐ中間ノードと、を備えたセンサネットワークシステムにおいて、前記クライアントノードは、予め複数のノードに対する処理が設定されたスクリプトを実行し、下位のノードに対するスクリプトを抽出して前記下位ノードへ前記抽出したスクリプトを配布する第1のスクリプトマネージャを有し、前記中間ノードは、前記第1のスクリプトマネージャが配布したスクリプトを実行し、当該中間ノードに対する制御を実行し、下位のノードに対するスクリプトを抽出して当該ノードへ前記抽出したスクリプトを配布する第2のスクリプトマネージャを有し、前記第1および第2センサノードは、各々前記第2のスクリプトマネージャが配布したスクリプトを実行することで観測した情報に基づくイベントを上位のノードに送信する第3のスクリプトマネージャを有し、前記第2のスクリプトマネージャから前記第1センサノードに配布された第1スクリプトと、前記第2センサノードに配布された第2スクリプトは、異なるスクリプトである。したがって、本発明は、各ノードで分散してイベントのハンドリングを行う動作フローを、ひとつのスクリプトで制御できる。これにより、複数存在し、一般化できず、動的に変化していくユーザ目的に対応して動的に変更できるため、単一のセンサネットワーク上に多様なユーザ目的を反映することができる。このため設置メンテナンス費用を複数のユーザで費用分担できるため、広域環境を観測する大規模センサネットワークインフラ基盤が実現できる。また本発明により、分散イベントハンドリングの動作フローを、動的に変化していく状況に対応して動的に変更できるため、あらかじめ固定したイベントハンドリングを行う場合に比べ、無駄な処理を行う必要がなくなり、その結果配送するイベント数を削減することができるため、サーバへの負荷集中を減少させることができる。また各ノードの処理を不要な時に停止することができるため、各ノードの消費電力を抑えることができる。以下、本発明の一実施形態を添付図面に基づいて説明する。図1は、本発明を適用するセンサネットワークの一例を示すブロック図である。センサネットワークは、環境に分散する多数のセンサノード201、206、207において環境情報を観測し、無線通信または有線通信で接続されたルータノード202を経由して観測情報を集約配送し、中央のサーバ203において観測情報を収集することにより、人間の意思決定を支援するシステムである。サーバ203に収集された観測情報は、ユーザの目的に応じて存在する複数のWebサービスWEBサーバ204に配送され、最終的にユーザ端末であるクライアント205に配送される。またセンサノード202と同様に環境に分散する多数のアクチュエータノード208が環境を制御する場合もある。なお、本発明では、センサネットワークを構成するセンサノード201、ルータノード202、サーバ203、WebService204、クライアント205、アクチュエータノード208を一般的にノードと呼ぶ。センサノード201、206、207は、温度センサや湿度センサなどのセンサや、個人を識別する識別子を有し、ルータノード202、209に接続される。ルータノード202には複数のセンサノード201、206が接続され、これらセンサノードからの観測情報を収集する。ルータノード202は、配下のセンサノード201、206から収集した観測情報をサーバ203に送る。また、ルータノード209には、センサノード207とアクチュエータノード208が接続され、センサノード207から収集した観測情報をサーバ203に送り、サーバ203からの指令に基づいてアクチュエータノード208を制御する。アクチュエータノード208はクライアント205のユーザなどが設定した条件に基づいて動作するもので、例えば、エアコンディショナなどで構成されている。サーバ203は、ルータノード202、209から送られた観測情報を収集し、複数のWEBサービス204を介してクライアント205に観測情報や観測情報に基づく通知を送信する。センサネットワークの主要なアプリケーションでは、環境が変化したタイミングを知ることが重要となる。そのためセンサネットワークの処理体系は、センサノード201が主体となって、環境観測情報をサーバ203やWEBサービス204、クライアント205へ配送し、それぞれがあらかじめ設定されたルールで処理を行うという方式を取る。一般に、センサノード201が発信し、それぞれのシステムに配送される情報はイベントと呼ばれ、またイベントを処理する機構はイベントハンドラと呼ばれる。イベントハンドラでの処理は、イベントEventを受け取り、条件判定Conditionを行い、それに対応したアクションActionを行う、という三段階から構成される。これは一般にECAEventConditionActionモデルと呼ばれる。なお一般にアクションとは、イベントと対比される概念であり、ノードへ与えられる処理要求のことである。アクションの種類としては、新たなイベントを発行する、アクチュエータノード208の制御を行うなどがある。また、本実施形態では、センサノード201側を下位のノードとし、クライアント205を上位側のノードとする。例えば、センサノード201は所属する上位のノードであるルータノードに観測情報に基づくイベントまたは結果を通知し、ルータノードは所属する上位のノードであるサーバ203にイベントを通知し、サーバ203はwebサービスを介して上位のノードであるクライアント205にイベントを通知する。また、下位のセンサノード201と上位のクライアント205の間に存在するルータノード202、サーバサーバノード203、webサービスwebサーバノード204は、中間ノードとしてセンサノード201とクライアント205との通信を中継し、またクライアント205からのスクリプトを実行する。<センサネットワークのノードとスクリプトの構成>図2は、センサネットワークにおいて分散イベントハンドリングを実施する機能要素のブロック図である。ここで、分散イベントハンドリングとは、センサネットワーク上のノード間のイベントの通知を、各ノードが分散して実行することである。つまり、イベントの発生を通知するノードが、直接、次の階層のノードにイベントを通知するものである。図2において、センサノード201、ルータノード202、サーバ203、クライアント205のうち、イベントハンドリングを行いたいノードに、それぞれイベントハンドラのかわりに本発明のスクリプト実行エンジンであるスクリプトマネージャ404、409、414、419を設置し、分散イベントハンドリングを行う。なお、図2では、イベントハンドリングを行わないWEBサービス204は省略した。また、図1に示したセンサノード206、207やアクチュエータノード208、ルータノード209、他のクライアント205も同様に構成される。センサネットワークに分散イベントハンドリングの動作フローを設置したいユーザ420は、クライアント205で動作フロー全体を定義するスクリプト418を記述し、スクリプトマネージャ419に実行を依頼する。スクリプト418は内部に再帰的に各ノードにおけるイベントハンドリングを行う部分スクリプト413、408、403を含む。クライアント205のスクリプトマネージャ419は、スクリプト実行の過程で他のノードサーバ203412のスクリプトマネージャ414に部分スクリプト413を送信し、スクリプトの実行を依頼するアクション415を実行する。これを再帰的に繰り返す事により、全てのノード201、202、203、205にスクリプト403、408、413、418を配布することができる。つまり、スクリプト418には、センサネットワークの階層に応じた順位で多のノードのスクリプトが入れ子状に配置される。クライアント205で実行されるスクリプト418は、サーバ203で実行するためのスクリプト413が内包される。このスクリプト413には、ルータノード202で実行するためのスクリプト408が内包され、さらにスクリプト408には、センサノード201で実行するためのスクリプト403が内包される。クライアント205のスクリプトマネージャ419がスクリプト418を実行すると、上記のようにスクリプト413を抽出してサーバ203に送信する。サーバ203では、スクリプトマネージャ414が受信したスクリプト413を実行すると、内包されたスクリプト408を抽出してルータノード202に送信する。ルータノード202では、サーバ203から受信したスクリプト408をスクリプトマネージャ409が実行すると、内包されていたスクリプト403を抽出してセンサノード201に送信する。センサノード201では、スクリプトマネージャ404がスクリプト403を実行する。このように、クライアント205で定義された入れ子状のスクリプトは、各ノードで順次抽出されてから送信され、各ノードのスクリプトマネージャで実行することができ、一つのスクリプトを定義すれば、複数のノードを制御すうことができる。ここでは、ひとつのセンサノード201とひとつのルータノード202に対して部分スクリプト408、403を配布し実行させる例を示したが、一つのスクリプトの中に、複数のセンサノード201に対するスクリプトや複数のルータノード202に対するスクリプトを内包することで、一つのスクリプトにより多数のノードを制御することが可能となるのである。センサノード201の観測イベント402は、センサノード201のスクリプトマネージャ404によりスクリプト403のルールに従い判定され、スクリプト403のコマンド実行完了イベント405としてルータノード202に配送される。以降順番にコマンド実行完了イベント411、416としてルータノード202からサーバ203へ、サーバ203からクライアント205へと上位のノードに送信される。<スクリプトの構成>図3は、上記図2のノード間で行われる処理の説明図である。図3においては、通信元ノード101のスクリプト102と、通信先ノード107のスクリプト117の関係について示したもので、スクリプト102は、例えば、図2のクライアント205のスクリプト418であり、スクリプト117は、例えばサーバ203のスクリプト413である。本発明のスクリプト実行エンジンであるスクリプトマネージャは、lisp等の関数型言語と同様な表記法である、コマンドの木構造で表記されたスクリプト102を受け付け、該スクリプトをインタプリタ方式で実行する。基本的なコマンド実行順序ルールは、関数型言語と同様、通信元ノード101の親コマンド103の実行前に全ての子コマンド104、105をその出現順に実行し、コマンド返戻データを親コマンド103の引数とするという処理体系を持つ。さらに本発明による新たなコマンド実行順序ルールとして、非同期コマンドを導入する。非同期コマンド実行時は非同期コマンド処理主体に、コマンド実行要求112として、1実行中のスクリプトを一意に識別するアクションID109と、2スクリプト内で該非同期コマンドを一意に識別するコマンドIDと、3該非同期コマンドを根とする部分スクリプト106を部分スクリプト111として通信先ノード107に送信し、通信先ノード107で部分スクリプト111の実行を依頼し、スクリプト102を通信元ノード101で保存してスクリプトを一時停止する機能と、コマンド実行完了イベント116として返戻データ115と共に該アクションID113と該コマンドID114を通信元ノード101で受信し、該コマンドID115で識別されるコマンド位置から該実行順序ルールに基づき処理を再開する機能を用いることにより、非同期な処理を可能とする。特定イベントを待ち受けるイベントハンドラを、該非同期コマンドから呼び出される非同期コマンドの処理主体として実装し、非同期コマンド実行時に各ノード上に存在するPub/SubモデルPublishSubscribeモデルの実装であるイベントパブリッシャにイベント配送予約を行い、イベントが配送された時点で非同期コマンドの返戻とすることにより、スクリプトによるイベントハンドラが実現できる。また、通信先ノード107への通信機能を、該非同期コマンドから呼び出される非同期コマンドの処理主体として実装し、通信先ノード107への通信内容として、該非同期コマンド処理主体への送信内容であるアクションID109、コマンドID110、111に加え、通信元ノードID108を加えて実装することにより、通信元ノード101が通信先ノード107へスクリプト実行依頼を行う機能が実現できる。通信先ノードへ通信する部分スクリプト106として、上述したスクリプトによるイベントハンドラを送信することにより、単一のスクリプトから複数のノードへイベントハンドラを配布することができる。ユーザの入力したスクリプトにより複数のノードへイベントハンドラを配布登録することができる事から、ユーザ目的の変化に応じてセンサネットワークの動作フローを動的に変更することができる。また各ノードのスクリプトマネージャがスクリプトに従ってイベントハンドラを配布することができる事から、たとえばあるイベントの条件判定の結果、新たなイベントハンドラを配布登録するように、状況に応じてセンサネットワークの動作フローを動的に変更することができる。なお、各ノード間で通信するノードID108は、センサネットワーク全体を管理するサーバ203がセンサネットワーク上で一意の識別子として決定し、管理するものである。また、アクションID109、113は、後述するスクリプトマネージャのアクションハンドラリスト902によりアクションハンドラリスト内で一意である識別子として付与される。また、コマンドID110、114は、スクリプトの処理を依頼されたタイミングでスクリプトマネージャのアクションハンドラ1005により付与される。<センサネットワークの構成要素の詳細>次に、図2に示したセンサネットワークの各構成要素の詳細について、図4~図7に基づいて以下に説明する。<センサノードの詳細>図4は、センサノード201の機器構成を示すブロック図である。なお、図示はしないが、図1に示したセンサノード206、207も同様に構成される。センサノード201は、環境を観測してイベントを発行するノードであり、メモリ502、CPU503、データの長期記録を行うフラッシュメモリ504、環境の観測を行うセンサデバイス505、通信を行う通信デバイス506、通信コネクタ507から構成される。センサノード201の起動時に、フラッシュメモリ504に記録されているプログラム404、509~513をメモリ502上に読み込み、CPU503で実行することにより処理を行う。メモリ502上に読み込まれるプログラムは、本発明のスクリプト実行エンジンであるスクリプトマネージャ404、スクリプトを構成するコマンドの処理主体の集合であるコマンドライブラリ509、センサデバイス505を利用して観測を行うセンサドライバ510、センサドライバ510とスクリプトマネージャ404を接続するセンサアダプタ511、通信デバイス506やネットワークコネクタ507を利用して通信を行う通信ドライバ512、通信ドライバ512とスクリプトマネージャ404を接続する通信アダプタ513、ユーザ目的に応じて適切に設置されるアプリケーション514から構成される。通信デバイス506およびネットワークコネクタ507は、特定の識別子を持つ他のノードと双方向通信が行えるものであればよく、例えば有線の通信規格Ethernet登録商標、無線の通信規格BlueTooth、IEEE802154、ZigBeeなどを実装するものが挙げられる。センサデバイス505は、例えば温度センサ、湿度センサ、照度センサ、ボルトの緩みを検知するひずみセンサ、椅子への着座や扉の開閉を検知する圧力センサ、人の存在を検知する赤外線センサ、脈拍を検知する赤外線センサなどが挙げられる。また、図36に示す名札ノードもセンサノード201の一種であり、ユーザのボタン入力3603、3604、3605を検知するスイッチがセンサデバイス505となる。また、図7に示すクライアント205もセンサノード201の一種である。キーボード808やマウス809がセンサデバイス505となり、ユーザが現在操作を行っているかどうかで在席確認を行う、現在操作しているアプリケーション名を検知することでどの仕事をしているなどの情報を観測することができる。図1に示したアクチュエータノード208の機器構成図は、図5に示すセンサノード201の機器構成図から、センサアダプタ511、センサドライバ510、センサデバイス505をそれぞれアクチュエータアダプタ、アクチュエータドライバ、アクチュエータデバイスに置き換える以外は同様なので割愛する。アクチュエータデバイスの例としては、エアコンディショナー、アラーム、スピーカ、減光機能つきライトなどが挙げられる。センサノードとアクチュエータノードを組み合わせたノードとして、自律移動型ロボットが挙げられる。たとえば観測対象に向かって移動するロボット、観測情報により移動する掃除機ロボットなどが挙げられる。本発明を利用することにより、サーバ203からのスクリプトにより、その挙動を自由に変更することができる。また自律移動によりルータノードとの接続が一時的に中断した場合でも、センサデバイス505からの入力を元にスクリプトマネージャ404で動作の判断を行い、アクチュエータデバイスを利用して移動を行うことができる。<ルータノードの詳細>図5は、ルータノード202の機器構成を示すブロック図である。なお、図1に示したルータノード209も同様に構成される。ルータノード202は、通信を中継するノードであり、メモリ602、CPU603、データの長期記録を行うフラッシュメモリ604、通信を行う通信デバイス606、通信コネクタ607から構成される。ルータノード601起動時に、フラッシュメモリ604に記録されているプログラム409、608~610をメモリ602上に読み込み、CPU603で実行することにより処理を行う。メモリ上に読み込まれるプログラムは本発明のスクリプト実行エンジンであるスクリプトマネージャ409、スクリプトを構成するコマンドの処理主体の集合であるコマンドライブラリ608、通信デバイス605を利用して通信を行う通信ドライバ609、通信ドライバ609とスクリプトマネージャ409を接続する通信アダプタ610、ユーザ目的に応じて適切に設置されるアプリケーション611から構成される。無線通信と有線通信を接続するゲートウェイノードもルータノードの一種である。この場合、ネットワークアダプタ610、ネットワークドライバ609、ネットワークデバイス605、ネットワークコネクタ606は有線用、無線用の2組を持つ構成となる。また、無線通信を行うルータノード202は、新たなノードと接続した、接続しているノードが離脱したというイベントを検知するセンサノード201と捉えることもできる。例えば図36に示す名札ノード3601のように、人間が携帯するセンサノードは、常に固定されたルータノードと接続されている保障はない。この性質を利用して、名札ノードと接続したルータノードは、名札ノードを携帯している人物が到来した、名札ノードの離脱を確認したルータノードは、名札ノードを携帯している人物が去ったというイベントを観測することができる。<サーバノードの詳細>図6は、サーバ203の機器構成を示すブロック図である。図6において、サーバ203は、観測情報の収集蓄積配信を行うノードであり、メモリ702、CPU703、データの長期記録を行うハードディスク704、通信を行う通信デバイス705、通信コネクタ706から構成される。サーバ203の起動時に、ハードディスク704に記録されているプログラム414、708~712をメモリ702上に読み込み、CPU703で実行することにより処理を行う。なお、ハードディスク704に代わって、SANやNASのストレージ装置を用いるようにしても良い。メモリ702上に読み込まれるプログラムは本発明のスクリプト実行エンジンであるスクリプトマネージャ414、スクリプトを構成するコマンドの処理主体の集合であるコマンドライブラリ708、通信デバイス705を利用して通信を行う通信ドライバ709、通信ドライバ709とスクリプトマネージャ414を接続する通信アダプタ710、ユーザ目的に応じて適切に設置されるアプリケーション711、データベース712から構成される。ネットワークアダプタ710において、クライアント205に様々な手段でイベントを転送するため、様々なプロトコルを実装することが考えられる。例えば、SIPSessionInitiationProtocolでポップアップ通知やデータ転送を行う、SMTPSimpleMailTransferProtocolでメールの送信を行う、HTMLHyperTextMarkupLanguageやXML等で記述されたイベントをHTTPHyperTextTransferProtocolで送信する、などが考えられる。また上記プロトコルを、逆にクライアントからサーバへスクリプトの転送実行依頼を行う経路として使用することもできる。WEBサービスWEbサーバ204の機器構成図は図6に示すサーバ203の機器構成図と同様なので割愛する。<クライアントノードの詳細>図7は、クライアント205の機器構成を示すブロック図である。クライアント205は、ユーザとのインタフェースとしてユーザからの要求入力および結果やイベントの提示を行うノードであり、メモリ802、CPU803、データの長期記録を行うハードディスク804、通信を行う通信デバイス805、通信コネクタ806、ユーザに結果やイベントの提示を行うディスプレイ807、ユーザからの要求入力を受け付けるキーボード808やマウス809から構成される。クライアント205起動時に、ハードディスク804に記録されるプログラム419、811~814をメモリ802上に読み込み、CPU803で実行することにより処理を行う。メモリ802上に読み込まれるプログラムは本発明のスクリプト実行エンジンであるスクリプトマネージャ419、スクリプトを構成するコマンドの処理主体の集合であるコマンドライブラリ811、通信デバイス805を利用して通信を行う通信ドライバ812、通信ドライバ812とスクリプトマネージャ419を接続する通信アダプタ813、ユーザ目的に応じて適切に設置されるアプリケーション814から構成される。<スクリプトマネージャの概要>図8を用いて、本発明のスクリプトマネージャ901と上位アプリケーション905との接続インタフェースについて説明する。図8のスクリプトマネージャ901は、図2のスクリプトマネージャ404、409、414、419に相当するものである。なおここで上位アプリケーションとは、本発明のスクリプトマネージャ901を使用する全てのプログラムのことを指す。上位アプリケーションの例は、図2におけるスクリプトマネージャ404と接続するコマンドライブラリ509、センサアダプタ511、通信アダプタ513、図6におけるアプリケーション711、データベース712、である。上位アプリケーション905の中心となるプログラムブロックを便宜上、中核ロジックApplicationCoreLogic906と呼ぶことにする。図7のクライアント205などでは、ユーザとのやりとりを行うユーザインタフェース907を持つ中核ロジック906も存在する。スクリプトマネージャ901は、実行中のスクリプトを複数管理するアクションハンドラリスト902、上記Pub/Subモデルの実装であるイベントパブリッシャ903、スクリプトで実行可能なコマンドを管理するコマンドハンドラリスト904から構成される。スクリプトマネージャ901と上位アプリケーションの関係は、1上位アプリケーションがスクリプトマネージャ901に処理を依頼する、2スクリプトマネージャ901が上位アプリケーションに処理を依頼する、の二種類に大別される。上位アプリケーションがスクリプトマネージャ901に処理を依頼する場合、postActionインタフェース910と、onEventインタフェース912を使用する。上位アプリケーションは、スクリプトを引数にしてpostActionインタフェース910を呼び出すことにより、スクリプトが実行される。同期アクションの実行結果はこの返戻として、また非同期アクションの実行結果はあらかじめ登録しておいたイベントハンドラ908にonEventインタフェース912で返戻される。スクリプトマネージャ901が上位アプリケーションに処理を依頼する場合、addCommandインタフェース913とpostCommandインタフェース914を使用する。addCommandインタフェース913はスクリプトマネージャ901に新たなコマンドと、処理主体であるコマンドハンドラ909を登録する。スクリプトの文脈で登録されたコマンドが出現した場合、スクリプトマネージャ901はコマンドハンドラ909のpostCommandインタフェース914を経由して上位アプリケーションに処理を依頼する。スクリプトマネージャ901内にはPub/Subモデルの実装であるイベントパブリッシャ903を含み、onEventインタフェース911でスクリプトマネージャ901にイベントを送信する機能と、subscribeインタフェース915でスクリプトにイベント配送予約を行うことによりonEventインタフェース912でイベントを配送する機能を有する。<スクリプトマネージャの詳細>図9を用いて、図8のスクリプトマネージャ901の内部構造を説明する。スクリプトマネージャ901は内部にアクションハンドラリスト902、コマンドハンドラリスト904、イベントパブリッシャ903を持つ。アクションハンドラリスト902は実行中のスクリプトを複数管理するブロックである。アクションハンドラリスト902は、0個以上のアクションハンドラ1005を格納する。アクションハンドラ1005は、上位アプリケーションから処理を依頼されたスクリプトをコマンド単位の木構造に展開したタグツリー1008として管理する。またアクションハンドラ1005は、アクションハンドラリスト902内でアクションハンドラを一意に識別するための識別子であるアクションID1007を持つ。アクションID1007はスクリプトの処理を依頼されたタイミングでアクションハンドラリスト902により付与される。コマンドハンドラリスト904は、スクリプトマネージャ901に登録されている実行可能なコマンド群を管理するブロックである。コマンドハンドラリスト904は、0個以上のコマンドハンドラ1009を格納する。コマンドハンドラ1009はスクリプトを構成するコマンドに対する処理主体である。コマンドハンドラ1009はコマンド名を一意に表す識別子をコマンドネーム1011に持つ。イベントパブリッシャ903は、0個以上のイベントハンドラ1012を格納する。イベントハンドラ1012は、イベントパブリッシャ903に予約されたイベントに対する応答の処理主体である。なお、本発明における後述する図12で説明される非同期コマンドのコマンド実行完了イベントを受け取る特別なイベントハンドラとして、アクションハンドラ1005を格納する場合もある。図10を用いて、上記図9アクションハンドラ1005のタグツリー1008の構造について説明する。タグツリー1008は、W3CWorldWideWebConsortiumの提唱するXMLeXtendedMarkupLanguageの標準モデルの一つであるDOMDocumentObjectModelと類似した構造を持つ。タグツリー1008は、タグ1101を根とし、0個以上の子を再帰的に持つ構造を取る。例えば、根タグ1101の子はタグ1102および1103であり、タグ1103の子はタグ1104および1105である。各タグは属性として、図9のアクションハンドラ1005内でタグの位置を一意に識別するための識別子であるコマンドID1106と、コマンドやデータの名前を表すタグネーム1107を持つ。コマンドID1106は、スクリプトの処理を依頼されたタイミングでアクションハンドラ1005により付与される。図9のスクリプトマネージャ901のpostActionインタフェース910を呼び出し、スクリプトの実行を依頼することにより、アクションハンドラリスト902内で新たにアクションハンドラ1005が作成され、スクリプトはタグツリー1008に展開される。アクションハンドラ1005は図10に示すタグツリー1008の根タグ1101図10参照から後述する実行順序でタグを解析し、タグネーム1107とコマンドハンドラリスト904内の、コマンドネーム1011と一致するコマンドハンドラ904のpostCommandインタフェース914を呼び出すことによりコマンドの処理を依頼する。<スクリプトの体系>次に、本発明のスクリプトマネージャ901が受け入れるスクリプトの言語体系を説明する。本発明のスクリプトの表記法は、再帰的な階層構造である。以降の説明では、スクリプトをXMLで表現するが、再帰的な階層構造を持つものであれば、lispやschemeなどのS式表現、ConciseXMLなどのXMLの亜流表現など、他の構造でもよい。初めに、本スクリプトの書式をEBNFExtendedBackusNaurFormISOIEC14977記法で定義する。[式1]<Script>::=<CommandLine>[式2]<CommandLine>::=<Command><Param>[式3]<Param>::=<CommandLine>|<Data>[式4]<Command>::=<SyncCommand>|<AsyncCommand>[式5]<Command>::=<SequentialCommand>|<ParallelCommand>これらから分かるとおり、スクリプト<Script>は単一のコマンド<Command>を根とし、その引数<Param>として0個以上のコマンド<Command>やデータ<Data>を持ち、これが再帰的に繰り返される、という構造で表現される。またコマンドは、同期コマンド<SyncCommand>と非同期コマンド<AsyncCommand>のいずれか、逐次コマンド<SequentialCommand>と並列コマンド<ParallelCommand>のいずれかに分類される。同期コマンドと非同期コマンドは、コマンド自身の処理が同期処理か非同期処理かによる分類である。同期コマンドは、同期処理を行うコマンドである。すなわち、コマンドの処理が終了するまで制御を返さない。同期コマンドの例は、加算コマンド、乗算コマンドなどの四則演算コマンドである。非同期コマンドは、非同期処理を行うコマンドである。すなわち、コマンドの処理が終了する前に制御が返される。非同期コマンドは、コマンド処理時間が無視できないほど長い、あるいは不定である、あるいはコマンド処理結果が返戻されない可能性がある場合に用いられる。非同期コマンドの例は、統計処理などの長時間の計算を行うコマンド、ユーザに問合せを行い、返答の入力を待つコマンド、スクリプトによるイベントハンドラの実装であるイベント待機コマンド、通信コマンドなどである。非同期コマンド処理主体からの非同期処理の返戻は、コマンド実行完了イベントとして到来し、図9のアクションハンドラ1005のonEventインタフェース1006を介してアクションハンドラ1005に返される。逐次コマンドと並列コマンドは、該コマンドの子に位置するコマンド群を並列実行するか否かによる分類である。逐次コマンドは、並列実行を行わない。すなわち、該コマンドのある子コマンドにおいて、該子コマンド自身あるいはその子孫コマンドが非同期コマンドである場合、該非同期コマンドのコマンド実行完了イベントが到来するまで処理を停止する。並列コマンドは、並列実行を行う。すなわち、該コマンドのある子コマンドにおいて、該子コマンド自身あるいはその子孫コマンドが非同期コマンドである場合、該非同期コマンドのコマンド実行完了イベントの到来を待たずに該子コマンドの弟コマンドの実行を行う。図8のaddCommandインタフェース913を利用することにより、スクリプトマネージャ901の作成者、センサネットワークの管理者、ユーザのいずれかあるいは全てにより、コマンドを自由に拡張することができる。<スクリプトの実行順序><1.基本的な実行順序>次に、図11~図14を用いて、スクリプトの実行順序について説明する。初めに、図11の例を用いて、同期コマンド、逐次コマンドのみで構成されたスクリプトの実行順序について説明する。同期コマンド、逐次コマンドのみで構成されたスクリプトの実行順序は、関数型言語と同様に、以下のルールに従う。[rule1]スクリプトは根親のコマンドから実行を開始する。[rule2]コマンドは、子コマンドを全て実行した後、実行結果を引数として自分自身を実行する。[rule3]コマンドは、コマンド実行後、自分自身を実行結果であるデータと置換する。[rule4]根コマンドが終了した場合、スクリプトは終了する。このルールに従うことにより、図11のスクリプトは以下のステップで実行される。[step1]初めに根コマンド1201の実行を試みる。コマンド1201は子1202および1203を持つので、コマンド1202の実行を試みる。コマンド1202は子1204および1205を持つので、コマンド1204の実行を試みる。[step2]コマンド1204は子を持たないのでそのまま実行され、実行結果であるデータ1206に置換される。次にコマンド1204の弟であるコマンド1205の実行を試みる。なお、弟コマンドは、同一階層のコマンドにおいて実行順序の相対的に低いものを指す。すなわち、図11においては、コマンド1202、1204が兄コマンドで、コマンド1203、1205が弟コマンドとなる。[step3]コマンド1205は子を持たないのでそのまま実行され、実行結果であるデータ1207に置換される。[step4]コマンド1202の全ての子が実行されたので、コマンド1202自身が実行され、実行結果であるデータ1208に置換される。これを再帰的に繰り返すことにより、木構造で記載された全てのコマンドを実行することができる。根のコマンドがデータに置換された時点でスクリプトは終了し、結果であるデータをユーザに返戻する。以上の処理により木構造のコマンドを有するスクリプトは、木構造の先端となる子コマンドから根親コマンドへ向けて順次実行され、各子コマンドの実行結果はデータに置き換えられ、最後に実行された根コマンドの実行結果がユーザに送られる。<2.非同期コマンドを含む場合の実行順序>次に非同期コマンドを含むスクリプトの実行順序について説明する。非同期コマンドを含むスクリプトの実行順序は、上述した[rule1]、[rule2]、[rule3]、[rule4]に加えて以下のルールに従う。[rule5]非同期コマンドは、実行完了を待たず、直ちに未完了状態で終了する。[rule6]逐次コマンドは、子コマンドが未完了状態で終了した場合、自分自身を未完了状態で終了する。[rule7]根コマンドが未完了状態で終了した場合、スクリプトは未完了状態で終了する。[rule8]コマンド実行完了イベントを受け取った場合、該非同期コマンドから処理を再開する。[rule9]コマンド実行完了イベントにより再開されたスクリプトが終了した場合、スクリプト実行完了イベントをユーザに送る。上記のルールに従うことにより、図12のスクリプトは以下のステップで実行される。なお本例では、逐次コマンドSequencial1301、逐次コマンド1302の子として非同期コマンド1304があるとする。まず、step11では、初めに根コマンド1301の実行を試みる。根コマンド1301は子1302および1303を持つので、子コマンド1302の実行を試みる。コマンド1302は子コマンド1304および1305を持つので、コマンド1304の実行を試みる。コマンド1304は子を持たないのでそのまま実行される。コマンド1304は非同期コマンドであるので、実行を非同期コマンド処理主体に依頼し、未完了状態で終了する。逐次コマンド1302は、子1304が未完了状態で終了したため、自分自身も未完了状態で終了する。根である逐次コマンド1301は、子1302が未完了状態で終了したため、自分自身も未完了状態で終了する。根コマンド1301が未完了状態で終了したため、スクリプトは未完了状態で終了し、制御がユーザに返される。次に、step12で、非同期コマンド1304の処理主体の処理が完了した時点で、コマンド実行完了イベントが発行され、これにより非同期コマンド1304をコマンド実行結果であるデータ1306に置換する。逐次コマンド1302は、非同期コマンド1304の弟に当たるコマンド1305の実行を試みる。逐次コマンド1302の全ての子が完了した後、コマンド1302の実行を行う。逐次コマンド1301は、子1302の実行完了を受け、子1302の弟コマンド1303の実行を試みる。根コマンド1301の全ての子が完了した後、スクリプト実行完了イベントをユーザに送る。以上の処理により木構造のスクリプトに非同期コマンドが含まれる場合、非同期コマンドは実行を非同期コマンド処理主体に依頼して未完了状態で終了する。そして、非同期コマンドの処理主体の処理が完了した時点でコマンド実行完了イベントが発行されると、未完了状態で終了した他の子コマンドを順次実行するのである。<3.並列コマンドを含む場合の実行順序>次に並列コマンドを含むスクリプトの実行順序について説明する。並列コマンドを含むスクリプトの実行順序は、上述した[rule1]から[rule9]に加えて以下のルールに従う。[rule10]並列コマンドは、特定の子コマンドの終了状態が完了状態、未完了状態のいずれであっても、全ての子コマンドの実行を試みる。[rule11]並列コマンドは、全ての子コマンドを実行した段階で、未完了状態の子コマンドが存在すれば、自分自身を未完了状態で終了する。このルールに従うことにより、図13のスクリプトは以下のステップで実行される。なお本例では、逐次コマンド1401の子に並列コマンド1402が、並列コマンド1402の子として非同期コマンド1404、1406、同期コマンド1405があるとする。初めにstep21では、根コマンド1401の実行を試みる。根コマンド1401は子1402および1403を持つので、コマンド1402の実行を試みる。コマンド1402は子1404、1405、1406を持つので、コマンド1404の実行を試みる。コマンド1404は子を持たないのでそのまま実行される。コマンド1404は非同期コマンドであるので、実行を非同期コマンド処理主体に依頼し、未完了状態で終了する。並列コマンド1402は、非同期コマンド1404の弟コマンド1405の実行を試みる。コマンド1405は同期コマンドであるので直ちに実行を完了し、データ1408に置換される。並列コマンド1402は、同期コマンド1405の弟コマンド1406の実行を試みる。コマンド1406は非同期コマンドであるので、実行を非同期コマンド処理主体に依頼し、未完了状態で終了する。全ての子を実行した並列コマンド1402は、子1404および1406が未完了であるため、自分自身も未完了状態で終了する。逐次コマンド1401は、子1402が未完了状態で終了したため、自分自身も未完了状態で終了する。根コマンド1401が未完了状態で終了したため、スクリプトは未完了状態で終了し、制御がユーザに返される。Step22では、非同期コマンド1404の処理主体の処理が完了した時点で、コマンド実行完了イベントが発行され、これにより非同期コマンド1404をコマンド実行結果であるデータ1407に置換する。並列コマンド1402は、全ての子の処理が完了したかを確認し、子1409が未完了であるため、自分自身も未完了状態で終了する。逐次コマンド1401は、子1402が未完了状態で終了したため、自分自身も未完了状態で終了する。根コマンド1401が未完了状態で終了したため、スクリプトは未完了状態で終了する。次に、step23では、非同期コマンド1406の処理主体の処理が完了した時点で、コマンド実行完了イベントが発行され、これにより非コマンド1406をコマンド実行結果であるデータ1410に置換する。並列コマンド1402は、全ての子の処理が完了したかを確認し、全ての子の実行が完了したため、自分自身を実行する。逐次コマンド1401は、子1402の実行完了を受け、子1402の弟コマンド1403の実行を試みる。根コマンド1401の全ての子が完了した後、スクリプト実行完了イベントをユーザに送る。以上の処理により並列コマンドがある場合では、並列コマンドが子コマンドを並列的に実行する。そして、子コマンドあるいはその子孫コマンドが非同期コマンドである場合には、非同期コマンドのコマンド実行完了イベントの到来を待たずに子コマンドの弟コマンドの実行を行う。<スクリプトの実行アルゴリズム>次に、図14、図15、図16、図17を用いて、スクリプト実行のアルゴリズムについて説明する。<基本処理>図14を用いて、図8、図9のpostActionインタフェース910を実行した時、すなわち上位アプリケーションがスクリプトマネージャ901にアクションを示すスクリプトを入力し、該アクションの実行を要求した時の基本処理フローについて説明する。[step31]上位アプリケーションが入力したスクリプトに対するアクションハンドラ1005を新規に作成し、アクションハンドラリスト902に追加する。[step32]アクションハンドラリスト902は、アクションハンドラリスト内で一意である識別子を新規作成し、アクションの属性であるアクションID1007に格納する。[step33]アクションハンドラ1005は、自分自身をイベントハンドラとしてイベントパブリッシャ903に登録する。[step34]アクションハンドラ1005は、スクリプトをタグツリー1008に展開し、図10に示す各ノードの属性タグネーム1107に、スクリプト中に記載されたタグ名を格納する。[step35]アクションハンドラ1005は、タグツリー1008の全ノードを再帰的にたどることにより、アクションハンドラ1005内で一意である識別子をコマンドID1106に格納する。[step36]アクションハンドラ1005は、タグツリー1008の根1101で指定されたコマンドを実行する。すなわち、図10に示した根コマンド1101の属性タグネーム1107で指定された名称のコマンドをコマンドハンドラリスト904から探索し、タグネーム1107と同じコマンドネーム1011を持つコマンドハンドラ1009を発見すると、該コマンドハンドラ1009のpostCommandインタフェース1010を呼び出す。<postCommandインタフェース>図15を用いて、図14のstep36で呼び出した、図9のコマンドハンドラ1009のpostCommandインタフェース914のアルゴリズムについて説明する。[step41]現在処理しているコマンド自分自身が逐次コマンドか並列コマンドかを判定する。[step42]逐次コマンドの場合、全ての子コマンドに対し、後述の図16で説明するparseCommandインタフェースを呼び出す。返戻が未完了の場合、即座に処理を打ち切り、未完了状態で終了する。[step43]並列コマンドの場合、全ての子に対し、parseCommandインタフェースを呼び出す。[step44]全ての子に対し実行終了後、返戻が未完了の子コマンドが一つでもある場合、未完了状態で終了する。[step45]自分自身のコマンド別処理を行う。[step46]完了状態で終了する。<parseCommandインタフェース>図16を用いて、図15のstep42およびstep43で呼び出した、アクションハンドラ1005のparseCommandインタフェース1018のアルゴリズムについて説明する。[step51]現在処理しているコマンドが非同期コマンドで、かつコマンド実行完了イベントがまだ到来していない場合、未完了状態で終了する。[step52]対応するコマンドのコマンドハンドラ1009をコマンドハンドラリスト904から探索する。結果該当なしの場合、該タグはコマンドではなくデータなので、そのまま完了状態で終了する。[step53]該当するコマンドハンドラ1009のpostCommandインタフェース914を呼び出す。返戻が未完了の場合、即座に処理を打ち切り、未完了状態で終了する。[step54]コマンドとその返戻結果であるデータを置換する。[step55]完了状態で終了する。<onEventインタフェース>次に、図17を用いて、非同期コマンドの処理主体が非同期処理を終了した時のコマンド実行完了イベントに応答する、イベントパブリッシャ903のonEventインタフェース911について説明する。[step61]図3におけるコマンド実行完了イベント116のアクションID113と、イベントパブリッシャ903に図14のstep33で登録したアクションハンドラ1005のアクションID1007とを比較して目的のスクリプトを管理するアクションハンドラ1005を検索し、該アクションハンドラ1005のonEventインタフェース1006を呼び出す。onEventインタフェース1006では、コマンドID114図3参照と図10のコマンドID1106とを比較して、完了した非同期コマンドの位置を探索する。[step62]探索したコマンドとその返戻結果であるデータを置換する。[step63]現在参照しているコマンド自分を探索したコマンドの親コマンドに位置を移す。[step64]現在参照しているコマンド自分が根になるまで、step65~step68を繰り返す。[step65]親コマンドが逐次コマンドか並列コマンドかを判定する。[step66]逐次コマンドの場合、自分自身に対し、図16で説明したparseCommandインタフェースを呼び出す。返戻が未完了の場合、スクリプト未完了フラグを真にする。[step67]並列コマンドの場合、全ての兄弟コマンドに対し、図16で説明したparseCommandインタフェースを呼び出す。返戻が未完了の場合、スクリプト未完了フラグを真にする。[step68]現在参照しているコマンド自分を親コマンドに移す。[step69]スクリプト未完了フラグを確認し、未完了でなければstep70~step71を実行する。[step70]ユーザにスクリプト完了イベントを発行する。[step71]スクリプトを破棄する。[step72]終了する。<コマンドの体系>スクリプトで用いられる一般的なコマンドは、上記図4~図7に示した各ノードのコマンドライブラリ509、608、708、811に格納する。コマンドは、例えば以下のものが考えられる。<prognコマンドとparallelコマンド><progn>::=<progn><CommandLine></progn><parallel>::=<parallel><CommandLine></parallel>prognコマンドとparallelコマンドはいずれも、子コマンド群を順番に実行する。なお、prognコマンドは逐次コマンド、parallelコマンドは並列コマンドである。<ifコマンド><if>::=<if><condition-Param><then-CommandLine>[<else-CommandLine>]</if><condition-Param>::=<Param><then-CommandLine>::=<CommandLine><else-CommandLine>::=<CommandLine>ifコマンドは、条件判定を行う。上記の例では、第一子の条件が真であれば、第二子が実行され、それ以外であれば第三子が実行される。第三子が存在しない場合何も実行しない。ifコマンドは第一子の結果を返戻する。<asyncroコマンド><asyncro>::=<asyncrodelay=’NUMBER’><CommandLine></asyncro>asyncroコマンドは、属性delayで指定した秒数待機した後、子を実行する非同期コマンドである。<Whenコマンド><when>::=<whenevent=’TEXT’>[<condition-Param>[<then-CommandLine>]]</when>whenコマンドは、イベントを待機する非同期コマンドである。属性eventで指定した名称のイベントが到来した時、第一子の条件評価を行い、結果が真であれば、イベントを返戻して終了する。第二子が存在する場合、終了前に第二子を実行する。第一子、第二子が存在しなければ、無条件でイベントを返戻して終了する。図18のシーケンス図を用いて、whenコマンドの動作について説明する。なお、コマンドハンドラWhen1902は、図9のコマンドハンドラ1009の1つ、Whenプロセス1903は、イベントハンドラ実装であり、イベントパブリッシャ903内のイベントハンドラ1012の一つであり、イベントソース1905は任意のイベント発生源である。whenコマンドの説明を行うためのサンプルスクリプトを1906に示す。これはobservedという種類のイベントが到来した時、イベントのパラメータNameがTemperatureである場合、TemperatureObservedというメッセージを標準出力に出力するというスクリプトである。スクリプト1906はタグツリー1008として、ifコマンド1907の下にwhenコマンド1908、messageBoxコマンド1910、whenコマンド1908の下にequalToコマンド1909がある、という構造に展開されている。本スクリプトは以下のステップで実行される。[step81]アクションハンドラ1005からコマンドハンドラWhen1902のpostCommandインタフェースを呼び出す。これは図16のstep53に相当する。[step82]コマンドハンドラWhen1902は、イベントハンドラの実装であるWhenプロセス1903を生成する。これは図15のstep45に相当する。[step83]Whenプロセス1903は、whenコマンド1908の属性に記載される種類のイベントが到来した時、自分自身を呼び出すよう、イベントパブリッシャ903に予約する。[step84]イベントソース1905はイベントパブリッシャ903にイベントを発行する。[step85]イベントパブリッシャ903は、step83で登録されたWhenプロセス1903にイベントを配送する。[step86]Whenプロセス1903はwhenコマンド1908の子要素に記載されている規則に従い、条件判定を行う。[step87]条件が真の時、Whenプロセス1903はイベントパブリッシャ903に、step83で予約したイベント配送予約を取り消す。なお、step87を省略することにより、継続して発生するイベントに対し、継続してイベントを待機するコマンドwheneverを実装することもできる。[step88]Whenプロセス1903はイベントパブリッシャ903にコマンド実行完了イベントを発行する。[step89]イベントパブリッシャ903は、コマンド実行完了イベントのアクションID113から、図14のstep33であらかじめ登録しておいた目的のアクションハンドラ1005に対し、コマンド実行完了イベントを配送する。これにより図17のonEventインタフェースが呼び出され、処理が継続される。<wheneverコマンド><whenever>::=<wheneverevent=’TEXT’>[<condition-Param>[<then-CommandLine>]]</whenever>wheneverコマンドは、イベントを継続して待機する非同期コマンドである。whenコマンドとの違いは、whenコマンドは例えば山田氏が来たら報告せよなどの1回限りのイベントの待機を行うのに対し、wheneverコマンドは例えば温度が1°C単位で上昇下降したら報告せよなどの複数回到来するイベントの待機を目的とする。wheneverの動作はwhenと同様であるが、wheneverを含むスクリプトは終了しない。killActionコマンド<killAction>::=<killActionid=’NUMBER’/>killActionコマンドは、属性idで指定される実行中のスクリプトを強制終了するコマンドである。whenコマンドなどの非同期コマンドの返戻待ち状態のスクリプトを強制終了する。wheneverコマンドは本コマンドでのみ強制終了できる。スクリプトを識別するidは、図9のアクションID1007であり、上記図14のpostActionインタフェースの最終的な返戻としてユーザや上位システム上位のノードに提示することができる。<setコマンド><set>::=<set><XPath><XPath></XPath><CommandLine></set>|<setXPath=’<XPath>’><CommandLine></set>setコマンドは、スクリプト内をスコープとする変数を設定するコマンドである。<XPath>は、W3Cで標準化を行っている、XML文書の位置を表す言語であるXPathで指定された、変数の位置を示す指標であり、例えば1番目の建物の2番目の部屋の温度は、Building[1]/Room[2]/Temperatureとして表現できる。XPathでは、Temperatureのように単独の変数としても利用でき、またRoom[2]のように1次元配列としても利用できる。複数のスクリプト間をスコープとするグローバルなsetコマンドを定義してもよい。またデータベースに値を代入するsetコマンドを定義してもよい。この他、上記<XPath>で指定された、上述のsetコマンドで設定した変数を取得するgetコマンド、加減乗除を行うplusコマンド、minusコマンド、multiplyコマンド、divideコマンドや、1個以上の子を取り、合計を出すsumコマンド、1個以上の子を取り、平均値を出すaverageコマンド等のコマンドで構成される。<通信コマンド>図3のコマンド実行要求112で示したノード間通信機能は、本発明の非同期コマンドの一つである通信コマンドaskで実現できる。図19のシーケンス図を用いて、askコマンドの動作について説明する。なお、コマンドハンドラAsk2002は、図9のコマンドハンドラ1009の1つであり、Askクライアント2003は通信クライアントであり、通信先システム通信先ノード上のAskサーバ2004と相互通信を行う。アクションハンドラ2005は通信先システム上のアクションハンドラ1005である。Askクライアント2003およびAskサーバ2004の説明を行うためのサンプルスクリプトを2006に示す。これは、四則演算123を実行するスクリプトであり、四則演算12の部分を通信先システムで行っている。スクリプト2006はタグツリー1008として、plusコマンド2007の下にaskコマンド2008、Valueデータ2012、askコマンド2008の下にplusコマンド2009、plusコマンド2009の下にValueデータ2010および2011がある、という構造に展開されている。本スクリプトは以下のステップで実行される。[step91]アクションハンドラ1005からコマンドハンドラAsk2002のpostCommandインタフェースを呼び出す。これは図16のstep53に相当する。[step92]コマンドハンドラAsk1902は、通信クライアントであるAskクライアント2003を生成する。これは図15のstep45に相当する。[step93]Askクライアント2003は、askコマンドの属性に記載される宛先の通信先システムに子である部分スクリプト2009、2010、2011を送信する。[step94]通信先システムのAskサーバ2004は、通信先システムのアクションハンドラ2005にスクリプト実行を依頼する。これは図14で説明したpostActionインタフェースを呼び出すことに相当する。スクリプト2009は同期コマンドのみから構成されるため即座に結果が返戻され、結果はAskクライアント2003に返戻される。[step95]Askクライアント2003は、図では省略されているイベントパブリッシャ903にコマンド実行完了イベントを発行し、イベントパブリッシャ903は、コマンド実行完了イベントのアクションID113からアクションハンドラ1005に対し、コマンド実行完了イベントを配送する。これによりonEventインタフェースが呼び出され、処理が継続される。図2のアクション406、410、415で示したイベントハンドラの配送登録は、本発明のaskコマンドでwhenコマンドを配送する事により実現できる。つまり、通信コマンドは、通信先ノードに子コマンドとしての通信コマンドとコマンド識別子及び通信元ノードの識別子を送信した後に、通信コマンドの親コマンドを未完了状態で終了させておく。そして、通信先ノードからの実行結果の返戻があるまで待機し、通信先ノードからの実行結果とコマンド識別子の返戻を契機に、未完了状態で終了したコマンド識別子に対応する親コマンドの実行を再開することで、送受信を実現する。<非同期イベント待機コマンド>図20を用いて、図19の非同期通信コマンドaskの子コマンドに図18の非同期イベント待機コマンドwhenを設置した例について説明する。なお、コマンドハンドラAsk2102は、図9のコマンドハンドラ1009の1つであり、Askクライアント2103は通信クライアントであり、通信先システム通信先ノード上のAskサーバ2104と相互通信を行う。アクションハンドラ2105は通信先システム上のアクションハンドラ1005であり、イベントソース2105は通信先システム上の任意のイベント発生源である。本例を説明するためのサンプルスクリプトを2107に示す。これは、通信先システムでイベントobservedを待機し、返戻があったら通信元システムでメッセージを表示するという動作を行う。スクリプト2107はタグツリー1008として、ifコマンド2108の下にaskコマンド2109、messageBoxコマンド2111、askコマンド2109の下にwhenコマンド2110がある、という構造に展開されている。本スクリプトは以下のステップで実行される。[step101]アクションハンドラ1005からコマンドハンドラAsk2102のpostCommandインタフェースを呼び出す。これは図16のstep53に相当する。[step102]コマンドハンドラAsk2102は、Askクライアント2103を生成する。これは図15のstep45に相当する。[step103]Askクライアント2103は、通信先システムに子である部分スクリプト2110を送信する。[step104]通信先システムのAskサーバ2104は、通信先システムのアクションハンドラ2105にスクリプト実行を依頼する。これは図14で説明したpostActionインタフェースを呼び出すことに相当する。[step105]通信先のイベントソース2104は、図20では省略してある通信先のイベントパブリッシャ903にイベントを配送し、イベントパブリッシャ903は、最終的にアクションハンドラ2105に対し、コマンド実行完了イベントを配送する。[step106]アクションハンドラ2105はアクション実行元のAskサーバ2104にスクリプト実行完了イベントを配送する。[step107]通信先システムのAskサーバ2104は通信元システムのAskクライアント2103にコマンド実行完了イベントを配送する。[step108]通信元システムのAskクライアント2103は図20では省略してある通信元のイベントパブリッシャにコマンド実行完了イベントを発行し、イベントパブリッシャ903は、最終的にアクションハンドラ2101に対し、コマンド実行完了イベントを配送する。これによりonEventインタフェースが呼び出され、処理が継続される。<並列コマンド>次に、図21を用いて、本発明の並列コマンドの好ましい拡張である論理和コマンドor、締め切りコマンドanyについて説明する。図21の2201に並列論理和コマンドorの動作を説明するサンプルスクリプトを示す。これは、idがa、bで識別されるクライアント205に対し、非同期コマンドである質問回答要求コマンドquestionBoxを配送実行依頼し、いずれかの回答が真であればメッセージを出力するというスクリプトである。なお、questionBoxコマンドは、クライアントを操作するユーザがYESボタンあるいはNOボタンを押下する事により真偽を返すコマンドである。orコマンドは並列コマンドであるため、複数のクライアントに対し、一斉に質問文を発行することができる。また論理和の性質として、いずれかの子が真であれば成立するため、その実装として、いずれかの子のコマンド完了イベントが到来し、その値が真であれば、残りの子のコマンド完了イベントが到来する前に完了状態で終了することができる。これにより全ての回答を待たずに処理を継続できるため、効率的な処理を行うことができる。これは、図15に示したpostCommandインタフェースのorコマンドの特別な実装として、step44において上述した判定を行うことで実現できる。同様に論理積andコマンドも実装できる。図21の2202に並列締め切りコマンドanyの動作を説明するサンプルスクリプトを示す。これは、ノードのidがa、b、cで識別されるクライアント205に対し、アンケートとして一斉に非同期コマンドである質問回答要求コマンドquestionBoxを配送実行依頼し、anyコマンドにより回答締め切り数nを2個、また回答締切時間limitを10分、として設定し、その結果をaverageコマンドで平均化し、setコマンドで変数xに代入し、messageBoxコマンドで標準出力に出力するスクリプトである。anyコマンドは並列コマンドであるため、複数のクライアントノードに対し、一斉に質問文を発行することができる。またアンケート機能として、締め切り数、締切時間を設定することができる。anyコマンドもorコマンドと同様、図15に示したpostCommandインタフェースのstep44で、未完了の子コマンドがいる場合に未完了状態で終了するのではなく、完了コマンドが指定された個数に達した時点、あるいは締切時刻を超過した時点でstep45に移行するようにすればよい。並列締め切りコマンドanyの別の特徴として、センサネットワークの課題であったノードの低信頼性問題を解決することができる。センサネットワークは基本的に低価格のセンサノードを大量に敷設することにより、各センサノードの信頼性のなさを数でカバーする、というコンセプトを持つシステムであり、故障等の原因でセンサノードの返戻が必ず帰ってくる保証はない、という事実を織り込まなければならない。しかし一般にイベントハンドラはイベントが発生しないと何も動作を行わない。そのため、イベントが返戻されない場合の何らかの対処が必要である。観測したい事象を、誤検出や故障を見越して重複したセンサノードに一斉に観測させ、並列締め切りコマンドanyの回答締め切り数を用いる事により、統計的に有意なイベントを抽出することができる。また、一般にDMSDeadManSwitchと呼ばれる、定期連絡がない時にノード故障と判定するロジックは、並列締め切りコマンドanyの回答締切時間を用いる事により実装することができる。<圧縮スクリプト>次に、図22を用いて、本発明の好ましい拡張である圧縮スクリプトについて説明する。一般に、図2におけるセンサノード201やルータノード202は、価格や電力の点からサーバ203と比較してメモリサイズ、CPU処理速度、通信速度の点で非力なハードウェアで実現する場合が多い。その場合、本発明のスクリプトをXMLで記載すると、通信コストやCPU処理コスト、メモリ消費量の点で問題が発生する可能性がある。そのため、スクリプトを圧縮構造で送信することが望ましい。図22のスクリプト2302はセンサノード201におけるイベントハンドラの記述例であり、温度が26°C以上であればイベントを発行するというスクリプトである。なお、図中greaterThanコマンドは大小比較コマンド、getTempコマンドは温度観測値取得コマンド、throwコマンドはイベント発行コマンドである。本スクリプトをC言語で記載すると、図22の2301のようになる。本例を圧縮スクリプトで記載した例を、図22の2303に示す。本圧縮スクリプトの圧縮方法は、以下のルールに従う。[rule21]コマンド名は、対応するコマンド識別子にマッピングする。[rule22]コマンドの子の数が固定個数の場合、圧縮者展開者間の双方で既知であるとして省略する。[rule23]コマンドの子の数が可変である場合、全ての子の先頭に子の数を記載する。なお、コマンド識別子の名前空間のサイズは、非特許文献WAPBinaryXMLContentFormatW3CNOTE24June1999で開示されるMultibyteIntegersを使用する事により、自由に拡張できる。またコマンド識別子の名前空間の衝突問題は、ノード起動時に該ノードが適用するコマンド名とコマンド識別子のマッピングテーブルをサーバに送信することによって解決することができる。図23、図24を用いて、非力なハードウェア上での圧縮スクリプト実行のアルゴリズムについて説明する。下記アルゴリズムを使用することで、圧縮スクリプトを木構造に展開する必要がなく、また子コマンドの数だけのサイズを持つ配列resultを使用するだけでスクリプトを処理することができる。図23は、非力なハードウェア上での圧縮スクリプトにおける図9のコマンドハンドラ1009のpostCommandインタフェース914の実装であり、図15に相当する。[step111]圧縮スクリプトのポインタptrを、コマンド識別子の分をインクリメントする。[step112]予め規定された子の数だけ、図24のparseCommandを呼び出す。[step113]自分自身のコマンド別処理を行う。なお、最後からn個目の子の値は、配列resultの格納数resultNum-n1に格納されている。[step114]配列resultの格納数を子の数分だけ減じ、自分自身の返戻値を格納し、格納数を1インクリメントする。図24は、非力なハードウェア上での圧縮スクリプトにおける図9のアクションハンドラ1005のparseCommandインタフェース1018であり、図16に相当する。[step121]圧縮スクリプトのポインタptrの値に対応するコマンドのコマンドハンドラ1009を探索する。結果該当なしの場合、step122~step124に進む。[step122]圧縮スクリプトのポインタptrの値がデータ<Value>の場合、次の値はデータであるため、データを配列resultに追加し、ptrをコマンド識別子とデータサイズ分進める。[step123]圧縮スクリプトのポインタptrの値が真偽値<true/>の場合、真値を配列resultに追加し、ptrをコマンド識別子分進める。[step124]圧縮スクリプトのポインタptrの値が真偽値<false/>の場合、偽値を配列resultに追加し、ptrをコマンド識別子分進める。[step125]対応するコマンドハンドラ1009の図23に示したpostCommandインタフェースを呼び出す。以上のように、本発明によれば、センサネットワークのノード上の分散イベントハンドリングの動作フローを、複数存在し、一般化できず、動的に変化していくユーザ目的に対応して動的に変更できるため、単一のセンサネットワーク上に多様なユーザ目的を反映することができる。このためセンサネットワークの設置メンテナンス費用を複数のユーザで費用分担できるため、広域環境を観測する大規模センサネットワークインフラ基盤が実現できる。また本発明により、分散イベントハンドリングの動作フローを、動的に変化していく状況に対応して動的に変更できるため、あらかじめ固定したイベントハンドリングを行う場合に比べ、無駄な処理を行う必要がなくなり、その結果配送するイベント数を削減することができるため、サーバへの負荷集中を減少させることができる。そして、木構造のコマンドを有するスクリプトを、クライアント205からセンサネットワークへ指示することで、複数のノードを容易に制御することが可能となり、ユーザは一つのスクリプトを定義するだけでよいので、膨大な数のセンサノード201を備えたセンサネットワークから所望の情報を極めて容易に利用することが可能となる。さらに、スクリプトを適宜変更することで、ユーザの要求の変化に応じて利用するセンサネットワークの情報を容易に変更することが可能となる。<第2実施形態>図25は、第2の実施形態を示し、別個の目的を持つ複数のクライアントを有するセンサネットワークを示す。図25において、センサノード2601、サーバ2607、別個の目的を持つクライアント2614および2615から構成されるセンサネットワークを想定する。クライアント2614および2615の要求によりセンサノード2601上のイベントハンドラ2602でそれぞれ異なるイベント加工を行い、二種類の二次イベント2605を発行する。その他の構成は、前記第1実施形態と同様であり、センサノード2601、2607は、前記第1実施形態の図4と同様であり、サーバ2607はサーバ203と同様に構成される。ここで、従来のセンサネットワークの課題であった二次イベント識別子問題とその解決策について説明する。一般に、イベント2605は、イベントの種類を識別する識別子とイベントのパラメータから構成される。ここで、イベントの種類を識別する識別子を誰が決定するかという問題が発生する。識別子をクライアント2615で決定することはできない。なぜならば異なるクライアント2614および2615との間で識別子の衝突が発生する可能性があるからである。しかし識別子をサーバ2607で一元管理し、動的に割り当てることもできない。なぜならば異なる領域をカバーするサーバ2607およびサーバ2609との間で識別子の衝突が発生する可能性があるからである。また、二次イベントの識別子を標準化することもできない。二次イベントの識別子を標準化するということは、イベントハンドラのルールを標準化組織で固定するということであり、ユーザによるイベントハンドラ作成の自由度を削減することになるからである。イベント要求元のクライアントを一意に識別する識別子と、クライアントで自由に決定した識別子を組み合わせたものを二次イベントの識別子として利用することにより上述した問題は解決する。しかし二次イベントの識別子のサイズが大きくなり、多量のイベントを扱うことを前提としたセンサネットワーク分野への適用は現実的ではない。本発明では、前記第1実施形態の図3に示したとおり、二次イベントを非同期アクションの返戻であるアクション完了イベント116で代用し、アクションID113およびコマンドID114でイベント返戻先を決定しているため、上述した二次イベント識別子問題は発生しない。図25を用い、従来のセンサネットワークの課題であったイベント漏洩問題とその解決策について説明する。センサノード2601のイベントハンドラ2602における情報加工の結果出力される二次イベント2605は、ユーザ要求に対応して作成される価値のある情報であり、相反する利益を持つ他のユーザに知られてはならない。イベント2605を通信路上で盗聴された場合、イベントの種類やイベント返戻先が漏洩する可能性がある。本発明では、図3に示すとおり、アクション完了イベント116にはイベントの種類を示す情報、イベントの要求元のクライアントを一意に識別する識別子が含まれていないため、上述した問題は発生しない。<第3実施形態>図26、図27は、第3の実施形態を示し、一つのクライアントが、複数のセンサノードを複数のルールで取り扱う例を示す。図26において、センサネットワークは、人検知イベントを発行する人検知センサノード2701、温度観測イベントを発行する温度センサノード2702、これらのイベントを受け付けるイベントハンドラ2704を実装したサーバ2703から構成された例を示し、その他の構成は前記第1実施形態と同様である。なお、センサノード2701、2702は前記第1実施形態のセンサノード201と同様に構成され、サーバ2703は前記第1実施形態のサーバ203と同様に構成される。サーバ2703のイベントハンドラ2704において、以下のルールを実装することを考える。[Rule31]人が存在する部屋が30°C以上であれば、空調を起動する。[Rule32]部屋温度が40°C以上の場合、火災であると判断し、もし人がいれば避難勧告を発行する。ここで、従来のセンサネットワークの課題であったルール数爆発問題とその解決策について説明する。一般に、イベントハンドラがN個の状態変数を管理し、M種類のイベントを受け取り、状態遷移を行うとすると、記述すべき状態遷移のルール数はN×M個以上となる。そのためイベントハンドラ作成者のルール記載もれにより、意図せぬアクションを誘発する可能性がある。これはルール数爆発問題と言われる。従来例では、イベントハンドラは図27のリスト2801のように記述される。リスト2801は到来イベントを中心とした記述であるため、上述したルールが容易に表現されず、可読性が低い。また、複数の状態変数、条件判定をする必要がある。状態変数やイベント数が増大すると、リスト2801の複雑度は爆発的に増大し、イベントハンドラ作成者のルール記載もれの発生する確率が増大することが容易に類推できる。本発明のスクリプトとして、前記第1実施形態で示した並列コマンド、非同期待機コマンドを利用する事により、上記ルールをリスト2802のように記述することができる。リスト2802は上記ルールを容易に表現することができ、また状態変数を排することができるため、イベントハンドラ作成者のルール記載漏れを抑制することができる。<第4実施形態>図28、図29は第4の実施形態を示し、ノード間の構成が動的に変化する場合を示す。図28において、センサノード2901および2902が、ルータノード2903、2904、2905、2906によりサーバ2907と接続しているとする。ここで、ユーザの指定した観測対象領域2908の平均温度が指定値を逸脱するとセンサノード2901、2902はメッセージを出力する、という機能を付与されている。また、ルータノード2904、2905は並列的に配置されている。なお、センサノード2901、2902は前記第1実施形態のセンサノード201と同様に構成され、ルータノード2903~2906は前記第1実施形態のルータノード202と同様に構成され、また、サーバ2703は前記第1実施形態のサーバ203と同様に構成される。ここで、従来のセンサネットワークには、Ad-Hoc問題という問題があり、その解決策について説明する。センサネットワークは基本的にAd-Hoc性を持つネットワークシステムである。すなわち、利用できるセンサノードの位置や個数、能力は、センサノードの故障、センサノードの追加移動撤去などの原因で、ユーザの制御できないタイミングで変化する可能性がある。そのため動作フローをあらかじめユーザが作成するのではなく、運用時に状況に応じて動的に作成する必要がある。図28において、サーバ2907に負荷集中を起こさず、また通信量を最小にする最も好適な方式は、センサノード2901および2902の観測値をルータノード2903に集積し、ルータノード2903のイベントハンドラで平均化処理と指定値逸脱判定を行う方式となる。しかし観測対象領域2908はユーザ目的や状況に応じて変化し、対応するセンサノード2901、2902やルータノード2903~2906の構成も変化するため、センサネットワークの変化を自動的に発見し、それによって最適な動作フローを各ノードに設定することが必要となる。本発明では、分散するノード間の動作フローを単一のスクリプトとして記載することができるため、スクリプトの変更を行うことだけで動作フローを変更することができる。図29を用いて、スクリプトの変更方式について説明する。リスト3001は、ユーザがサーバ2907に実行を依頼したスクリプトの例である。getTempFromRegionコマンドは、子で指定された矩形領域観測対象領域2908の平均温度を取得する。これによりリスト3001は、矩形で表された観測対象領域2908の平均温度が30°Cを超えていれば、温度が30°C以上というメッセージを表示する。サーバ2907に実装されたgetTempFromRegionコマンドの処理主体は、観測対象領域2908に含まれるセンサノード2901、2902を探索するノード探索部、また該センサノード群にそれぞれ通信を到達させるための最適な経路ルータノード2906-2904-2903-2901および経路2906-2904-2903-2902を探索する経路探索部を持つ。上記ノード探索手段および経路探索手段については、たとえばAdHocの無線通信規格ZigBeeで採用されているAODVAdhocOndemandDistanceVectorなどの手段を利用することができる。図29のリスト3001に該ノード探索部および経路探索部を用いてスクリプトを変形することにより、リスト3002を得ることができる。リスト3001の3行目から6行目のgetTempFromRegionコマンドが、リスト3002の3行目から10行目に置換されている。ここで、リスト3002の4行目から6行目は、経路2906-2904-2903-2901を経由してセンサノード2901に温度観測イベントgetTempを実行依頼している。リスト3002の7行目から9行目は、経路2906-2904-2903-2902を経由してセンサノード2902に温度観測コマンドgetTempを実行依頼している。リスト3002の3行目は、平均計算コマンドaverageにより、子の返戻の平均を計算している。リスト3002に以下に示すルールを適用してスクリプトを変形することにより、リスト3003を得ることができる。スクリプトを変形するための基本ルールは、数学分野で知られる交換則と分配則である。[rule31]分配則:ABAC=ABC[rule32]交換則:AB=BA交換則と分配側の適用条件として、以下のルールを用いる。[rule33]通信コマンドと該通信コマンドの親コマンドは、通信コマンドが兄弟コマンドを持たず、かつ該親コマンドが通信元ノードと通信先ノードで等しい動作をすることが保証されている場合、[rule31]の交換則を適用できる。[rule34]通信コマンドが兄弟コマンドを持ち、全ての兄弟コマンドが通信元ノードと通信先ノードで等しい動作をすることが保障されている場合、[rule31]の交換則を適用できる。[rule35]通信コマンドが、等しい通信先に対する通真コマンドを兄弟コマンドとして持つ場合、[rule32]の分配則が適用できる。これらのルールを適用することにより、リスト3002の4行目および7行目がまとめられ、リスト3002の1行目と2行目の間に移動している。これによりリスト3003は、経路2906-2904-2903を経由してルータノード2903において、平均化処理と指定値範囲判定を行うことになり、上述したように運用状況に応じた最も好適な動作フローを得ることができる。なお、ノード探索部は、スクリプトで指定した空間領域内に存在する複数のセンサノードから該要求精度に必要十分なセンサノード群を選択することで、空間領域内のセンサノードの観測結果を集積して該空間領域の特徴量を取得することも可能である。<第5実施形態>図30は第5の実施形態を示し、前記第1実施形態のセンサノード201の挙動を変更可能なスクリプトの一例を示す。なお、センサネットワークの構成は、前記第1実施形態と同様である。図30のリスト3101は、観測値が閾値を超えていればイベントを送信する、というルールを記述したスクリプトである。まず、loopコマンドで子を繰り返す。次に、sleepコマンドで属性delayで指定した時間休止し、その後getTempコマンドで観測した温度が30°Cを超えていれば、unusualイベントを発行する。リスト3102は、観測値が変化したら送信する、というルールを記述したスクリプトである。getTempコマンドで取得した温度が、oldというキーの温度履歴から変化したら、Changeイベントを発行する。リスト3103は、時間平均値を送信する、というルールを記述したスクリプトである。3回観測を行った後、その平均値を持つAVEイベントを発行する。リスト3104は、温度、湿度という複数の観測値の条件判定の例である。温度が25°Cを超過し、かつ湿度が60を超過した時に、Disconfortイベントを発行する。リスト3105は、最大値最小値平均値を送信する、というルールを記述したスクリプトである。リスト3101から3105までのスクリプトをセンサノード201に送信し、実行依頼することにより、センサネットワーク運用中に動的にセンサノードの挙動を変化させることができる。これにより、センサネットワークの柔軟な運用が可能となる。<第6実施形態>図31は、第6の実施形態を示し、前記第1実施形態のセンサノード201を省エネルギ型とした場合のセンサデバイスとマイコンの要部を示したものであり、その他の構成は前記第1実施形態の図4と同様である。センサノード201を構成するマイコン3220は、一般に、電力消費の少ない休止モードと電力消費の多い活性モードの切り替えが可能である。休止モードの時のマイコン3220は割り込みポートからの割り込みにより活性モードに移行する。タイマと接続する割り込みポート3218を設け、タイマ割り込みによりマイコンを活性モードに移行させスクリプトの処理を続行することにより、時間イベントで駆動するスクリプトパーサが実現できる。例えば、上記図30のリスト3101の二行目に記載した非同期休止コマンドであるsleepコマンドの実装として、タイマ3219に休止時間を設定し、図3のコマンドIDを記憶し、マイコンを休止状態に移行させ、マイコンが起動したら、記憶したコマンドIDからの処理を再開させることにより、観測時間のみ活性モードに移行するエネルギー効率のよいセンサノードが実現できる。また同様に、観測値と固定値との簡単な比較論理判定の演算回路をハードウェアで実装することにより、観測値イベントで駆動するスクリプトパーサが実現できる。図31において、センサノード201aは、温度センサ3201と湿度センサ3202を有し、各センサの出力はコンパレータ3207~3210で上限値と下限値が比較される。そして、コンパレータ3207~3210の出力をORゲート及びANDゲートで判定してマイコン3220へ入力する。マイコン3220には、割り込みポート3216、割り込みポート3217のいずれかあるいは両方を設ける。割り込みポート3216は温度観測値が指定範囲を超えた場合または湿度観測値が指定範囲を超えた場合に割り込みが発生する。割り込みポート3217は温度観測値が指定範囲を超えた場合かつ湿度観測値が指定範囲を超えた場合に割り込みが発生する。なお、温度センサ3201および湿度センサ3202は観測値を表す電圧を常時出力する。下限温度3203、上限温度3204、下限湿度3205、上限湿度3206は参照電圧生成回路であり、マイコンの出力ポート3215からの選択信号により、あらかじめ定義された参照電圧を出力する。コンパレータ3207、3208、3209、3210は入力される電圧を比較し、-入力電圧より入力電圧が高い場合、真値を表す電圧を出力する。この参照電圧生成回路3203~3206は、例えば、バンドギャップリファレンス回路などで構成することができる。バンドギャップリファレンス回路としては、例えば、<httpwwwsonycojpsemiconjapaneseimgsonyj01e6801283pdf>に記載の10ビット80MSPS1chD/Aコンバータの第4頁に記載されるものが適用できる。バンドギャップリファレンスを用いた独立定電圧源出力端子をVREFに接続することにより、電源電圧の変動に依存しない安定した電圧が得られる。コンパレータ3207は、観測温度が下限温度を下回った時に真を返す。コンパレータ3208は、観測温度が上限温度を上回った時に真を返す。コンパレータ3209は、観測湿度が下限湿度を下回った時に真を返す。コンパレータ3210は、観測湿度が上限湿度を上回った時に真を返す。OR回路3211、3212、3213はそれぞれ、入力の論理和が真の場合真を出力し、AND回路3214は入力の論理積が真の場合真を出力する。以上より、観測値と固定値との簡単な比較論理判定の演算回路をハードウェアで実装することが可能となる。またセンサノード201aを処理が不要な時に停止することができるため、センサノード201aの消費電力を抑えることができ、特に移動可能な無線式のセンサノード201aに適用した場合には、電池の充電周期や寿命を延長することができる。<第7実施形態>図32は、第7の実施形態を示し、平時緊急時の両方で利用可能なセンサネットワークを示す。なお、センサノードとサーバ等は前記第1実施形態と同様に構成される。また、図示はしないが、センサノード3301とサーバ3302の間に複数のルータノードを設けても良い。本発明により、状況に応じてイベントハンドラの動作フローを変更できるセンサネットワークを提供できる。センサネットワークの意義として、広域環境の観測情報が常時入手できるということの他に、緊急時に必要な環境情報が入手できるというポテンシャルを持つという点がある。例えば地震火災水害等の災害発生時において、電力網が遮断された時に自立電源を持つノードによる無線ネットワークが存在することの意義は大きい。しかし緊急時のためだけにセンサネットワークを敷設するのは費用対効果が悪く、平常時でも利用する両立形態を取ることが望ましい。また緊急時に必要とする粒度空間間隔および時間間隔の情報は一般に平常時には不要であり、不要な情報を常時取得していては電力を浪費することになる。図32を用いて、平時緊急時の両方で利用可能なセンサネットワークの機能を説明する。平常時は、観測対象領域3301の全てのセンサノードを稼動させるのではなく、たとえば環境モニタリングに必要十分な空間間隔のセンサノード図中3305で示す黒いノードのみを稼動する。電力消費の平均化を図るため、定期的に稼動するセンサノード群3301を稼動していないノードと交換してもよい。緊急時には、全てのセンサノードを起動して詳細に環境情報を収集してもよいし、例えば火災発生地点周辺などのクリティカルな地点3305の周辺のセンサノード3304のみを稼動してもよい。このような例としては、ビルに敷設された人検知センサノードが、平常時には混雑状況監視に、火災発生時には要避難者発見用に使用されるセンサネットワーク、山岳森林内に敷設された音響センサノードが、平常時には動物の生息状況モニタリングに、遭難者発生時には遭難者探索に使用されるセンサネットワーク、沿岸のブイ上に敷設された海水温度センサノードが、平常時には学術的利用、異常温度発生時にはホタテの壊死を防ぐために養殖籠を下降させるセンサネットワークが実現可能である。<第8実施形態>図33、図34は第8の実施形態を示し、前記第1実施形態に示したルータノードでスクリプトを実行することにより、センサノードの探索と観測要求、結果の収集を行う例を示す。なお、その他の構成は、前記第1実施形態と同様である。図33を、Ad-Hocにセンサノード3401~4、3408、3412およびルータノード3405~7、3409~11、3413、3414が接続されているセンサネットワークとする。Ad-Hocなセンサネットワークとは、サーバ3415、センサノードおよびルータノードは無線で接続され、通信範囲内の隣接ノードの存在は検知できるが、センサノード、ルータノードの構成が動的に変更されるため、サーバ3415は全体の構成を把握できないセンサネットワークのことである。各センサノードは温度センサを有し、ユーザが領域の温度の最大値を知りたいという要求を行ったとする。そのためには、領域に存在するセンサノードを探索し、該センサノードで観測を行い、その結果の最大値を計算する必要がある。上述した要求を実現するスクリプトは、図34で実現できる。2行目のdefunコマンドで、ユーザ定義関数funcを定義している。関数funcは7行目で自分自身を再帰的に呼び出している。13行目のsetコマンドで変数maxTempに、func関数の実行結果である最大温度を格納し、14行目でクライアント3416に最大温度を送信している。3行目のmaxコマンドは、1個以上の子から最大値を取る子を選択する。4行目のbroadcastコマンドは、通信範囲内の全ての隣接ノードに子である部分スクリプトを送信する。ループを防止するため、同じアクションIDを持つスクリプトの二重受信は拒否される。6行目のisRouterNodeコマンドは、ルータノードであれば真を返す。サーバ3415で図34のスクリプトを実行することにより、broadcastコマンドの子である5から9行目がルータノード3411、3414に転送される。ルータノード3411はisRouterNodeコマンドに真を返し、7行目が実行され、再帰的に2行目以降が実行され、broadcastコマンドの子である5から9行目がルータノード3407、ルータノード3410、サーバ3415に転送される。ループ防止のため、サーバ3415の通信は無視される。これを再帰的に繰り返すことにより、部分スクリプトがセンサノード3401、3402、3403、3404、3408、3412に到達する。センサノードはisRouterNodeコマンドに偽を返し、8行目の温度観測コマンドであるgetTempコマンドが実行される。その結果はbroadcastコマンドの返戻となり、探索経路上のルータノードでmaxコマンドにより最大値が選択され、最終的にサーバ3415に全てのセンサノードの観測した温度の最大値が返される。このように、本発明のスクリプトパーサで再起構造を用いることにより、センサノードの探索を行うルータノードの挙動、温度を観測するというセンサノードの挙動、その返戻を集約するというルータノードの挙動をコンパクトに記載することができる。そして、6行目のisRouterNodeの部分を様々に変更することにより、例えば電池残量の少ないルータノードの使用を避けるなど、様々なルート探索アルゴリズムが実装できる。また8行目のgetTempコマンドを非同期イベント待機コマンドwheneverに変更することにより、継続した観測が実施できる。またこの動作はスクリプトで記載されているため、ユーザの要求に応じて多彩な動作を実現できる。<第9実施形態>図35は、第9の実施形態を示し、前記第1実施形態のセンサノード201におけるユーザインターフェースの一例を示す。図35は、人間に対する簡易コミュニケーションツールとしてセンサノード201を名札ノードとした場合、センサノード201におけるユーザインターフェースの一例を示す。名札ノード3601は図2のセンサノード201の一種であり、人間の名札を兼任したセンサノードである。名札ノード3601は人間に携帯され、ボタン押下により人間の意志表示を検知するという機能を持つ。名札ノード3601は質問文を表示する液晶画面等の表示装置3602と、回答のためのボタン戻るボタン3603、選択ボタン3604、決定ボタン3605を持ち、無線を用いたルータノード202やサーバ203への通信機能を持つ。さらに他のノードから質問文が到着したことをユーザに喚起するためのブザー機能、バイブレーション機能、LEDなどのランプ機能を付与してもよい。さらに人間が携帯するセンサノードという特質を生かし、環境の計測を行う温度センサ、湿度センサ、人間の行動の計測を行う加速度センサなどを付与してもよい。他の人間あるいはノードより質問が発行された場合、画面3602のように質問文とその回答一覧が表示される。人間は選択ボタン3604を複数回押下する事により回答一覧から回答を選択し、決定ボタン3605を押下する事により回答を決定する。複数の質問が発行された場合、戻るボタン3603を押下する事により状態遷移3607により、画面3606に未回答の質問文一覧を表示する。質問文一覧が表示されている状態で選択ボタン3604を複数押下し、決定ボタン3605を押下する事により回答したい質問文を決定し、状態遷移3608により画面3602に戻ることができる。名札ノードは、画面3606に示すように、複数の質問文を保持する機能を必要とする。また名札ノードを含むセンサネットワークは、質問文に対する回答を、質問を行った者に対して適切に配送する機能を必要とする。本発明を適用することにより名札ノードを含むセンサネットワークを実現できる。前記第1実施形態のスクリプトマネージャ901を名札ノードに実装し、該スクリプトマネージャ901に、質問文を画面に表示し、人間による回答ボタン押下イベントを待機するという機能を持つ非同期コマンドである質問回答要求コマンドを、図19で説明した非同期通信コマンドaskの子として発行すればよい。動作シーケンスは図20と同等となる。本発明では、図3の返戻116のアクションID113により、質問を行ったサーバ側のスクリプトを識別できるため、質問の回答を質問者に適切に配信できる。さらに名札ノードに対する通信コマンドaskの子として、図18の条件判定コマンドif1907と組み合わせて質問回答要求コマンドを再帰的に木状に作成する事により、質問回答に応じた再質問などの複雑な処理が容易に実装できる。<第10実施形態>図36は、第10の実施形態を示し、建物の各部屋にルータノードとしてのゲートウェイノードを設け、各ゲートウェイノードの配下にセンサノードを設け、各ゲートウェイノードを管理するサーバと、アクチュエータノードとして家電製品例えば、エアコンディショナを設けたものである。図36において、ゲートウェイノード3707、サーバ3710、エアコンディショナーノード3708から構成されるセンサネットワークシステムが配置される。ゲートウェイノード3707は無線通信により人間が携帯するセンサノード及びクライアントの機能を併せ持つノードとしてのモバイルノード3704と無線通信を行う。アクチュエータノードとしてのエアコンディショナーノード3708はエアコンディショナーと接続され、適切なコマンドにより室内を指定された温度湿度に保つ機能を持つ。該建物内にモバイルノード3704を携帯したユーザ3703が到来した時、該センサネットワークシステムは、ユーザ3703の嗜好にあわせた温度でエアコンディショナーノード3708を制御する。本実施形態においては、サーバ3710が前記第1実施形態のサーバ203に相当し、ゲートウェイノード3707、3708がルータノード202に相当し、モバイルノード3704、3705がセンサノード201及びクライアント205に相当し、エアコンディショナーノード3708がアクチュエータノード208に相当するもので、その他の構成は前記第1実施形態と同様である。本機能の実現は以下の方法で行う。モバイルノード3704にユーザ3703の嗜好例えば18°Cに合わせた温度湿度でエアコンディショナーを制御せよというスクリプトを登録しておき、ゲートウェイノード3707からモバイルノード3704への接続イベントに応じて、モバイルノード3704が該スクリプトをゲートウェイノード3707を経由してサーバ3710に発行する。サーバ3710は該スクリプトを実行する事により、エアコンディショナーノード3708を指定された温度湿度で稼動させる。従来のセンサネットワークで本機能を実現しようとすると、センサネットワーク管理者側がサーバ3710のイベントハンドラとして本機能をあらかじめ登録しておく必要があった。そのためユーザ個別の嗜好ではなく平均的な嗜好での温度制御を行うか、もしくは予めユーザの嗜好をサーバ3710に登録しておく必要があった。本発明を用いれば、サーバ3710やエアコンディショナーノード3708に本発明のスクリプトマネージャのみを登録しておけばよい。本適用はユーザ3703がたとえば喘息や風邪の場合、あるいは未熟児等、センサネットワーク管理者の予測できない特殊事情を抱える場合に有効である。<第11実施形態>図36は、第11の実施形態を示し、建物の各部屋にルータノードとしてのゲートウェイノードを設け、各ゲートウェイノードを管理するサーバを設けたものである。ゲートウェイノード3707は無線通信により人間が携帯するセンサノード及びクライアントの機能を併せ持つノードとしてのモバイルノード3704と無線通信を行う。互いに打合せを行う必要のある社員3703および3706がいると考える。両社員3703は出張が多く、多忙であり、打合せの日程調整を行えないとする。両社員3703および3706が偶然同じ出張先に存在しているということが分かればそこで打合せを行うことができ、これにより業務効率が改善される。従来はこのような偶然は有効活用されていなかった。本機能の実現は以下の方法で行う。モバイルノード3704にユーザ3706のモバイルノード3705がセンサネットワークに接続されたら、モバイルノード3704に通知せよというスクリプトを登録しておき、ゲートウェイノード3707からモバイルノード3704への接続イベントに応じて、モバイルノード3704が該スクリプトをゲートウェイノード3707を経由してサーバ3710に発行する。サーバ3710は該スクリプトを実行する事により、モバイルノード3705の接続を待機する。ユーザ3706が到来し、モバイルノード3705からの接続イベントを該スクリプトのイベント待機コマンドが受け、モバイルノード3704に対し、アクション実行完了イベントを発行する。モバイルノード3704で該イベントを受け、ユーザ3703に提示する事により、ユーザ3703はユーザ3706の到来を知ることができる。本機能を従来のセンサネットワークで本機能を実現しようとすると、社員が出張する可能性のある全ての出張先のサーバ3710のイベントハンドラに上記機能をあらかじめ登録しておく必要があった。しかし従来のセンサネットワークにこのような個別要求を登録する機能はなく、また全ての出張先にあらかじめ登録するのはサーバ3710の処理負荷の点で現実的ではなかった。本機能はスクリプトの修正により、さらに、ユーザ3706の到来を確認したら、ユーザ3706に打合せの都合を聞いて、了解であればユーザ3704に通知せよというルールに拡張することも容易にできる。モバイルノード3705に上記図35で説明した名札ノードのインタフェースと質問回答要求コマンドを登録しておき、モバイルノード3705からの接続イベントの応答処理として該質問回答要求コマンドをモバイルノード3705に発行し、結果が応諾である場合にのみモバイルノード3704に対し、アクション実行完了イベントを発行するとすればよい。<第12実施形態>図37は、図2に示すクライアント205におけるユーザインターフェースの実装例として、スクリプトを生成するためのユーザインタフェースについて説明する。図2に示すクライアント205のスクリプト生成画面では、属性条件式設定画面3810、関係条件式設定画面3811、論理式設定画面3812、全体式設定画面3813が表形式に表示される。属性条件式設定画面3810はプルダウンメニュー3814および3815を持ち、指定したオブジェクトまたはその属性3814が指定した状態3815になった時に成立する条件式を表す。関係条件式設定画面3811はプルダウンメニュー3816、3817および3818を持ち、指定したオブジェクトまたはその属性3816と、指定したオブジェクトまたはその属性3817が、指定した関係3818を持った時に成立する条件式を表す。論理式設定画面3812はプルダウンメニュー3819、3820および3821を持ち、指定した条件3819と指定した条件3821が論理和あるいは論理積3820で成立する時成立する条件式を表す。ここで指定した条件は、属性条件式3810、関係条件式3811、論理式3812のいずれかが選択される。全体式設定画面3813はプルダウンメニュー3822および3823を持ち、指定した条件3822が成立した時、指定したアクション3823を実行することを設定する画面である。なお、各プルダウンメニューに表示されるデータは、サーバ3710の図示しないデータベースから取得したものである。スクリプト生成画面では、初期状態では全体式設定画面3813のみが記述され、ユーザの条件追加操作により属性条件式3810、関係上見識3811、論理式3812を任意に追加できる。ユーザの簡便な設定を実現するため、ユーザがプルダウンメニューを選択した時に、ユーザの選択操作に従って階層的に画面を表示していく方法が考えられる。プルダウンメニュー3814、3816、3817ではいずれもオブジェクトまたはその属性を指定する。初めにオブジェクトのスキーマ表示画面3805を表示し、オブジェクトの種類を選択させる。オブジェクトの種類は例えば場所施設名、領域、人物が考えられる。ユーザが場所を選択すると、場所選択画面3803を表示し、場所の選択をさせる。ユーザがさらに場所の属性を設定したい場合、属性選択画面3801を表示し、その場所に従った属性を選択させる。画面3805でユーザが領域を選択すると、領域選択画面3804として地図を表示し、マウスによる矩形ないしポリゴン入力により、領域を選択させる。ユーザがさらに領域の属性を設定したい場合、属性選択画面3802を表示する。画面3805でユーザが人物を選択すると、人物選択画面3806を表示し、人物の選択をさせる。ユーザがさらに人物の属性を設定したい場合、属性選択画面3807を表示し、その人物の属性を選択させる。プルダウンメニュー3815ではオブジェクトまたは属性の状態を指定する。初めに関係選択画面3824を表示してユーザに関係を選択させ、その後定数値入力画面3808を表示して値の入力をさせる。同様にプルダウンメニュー3815では二つのオブジェクトまたは属性間の関係を指定する。初めに関係選択画面3809を表示してユーザに関係を選択させ、その後定数値入力画面3808を表示して値の入力をさせる。このようなグラフィカルユーザインタフェースを用いることにより、スクリプトを生成するための情報を収集することができる。図38を用いて、図36に示したサーバ3710または図2に示すサーバ203の実装例として、図37のユーザインタフェースで入力されたユーザ要求をスクリプトに変換する方法について説明する。図38において、スクリプト3901を図37のユーザインタフェースで入力されたユーザ要求とする。これは例えば、図37の関係条件式設定画面3811を用いて、プルダウンメニュー3816に対し画面3806で山田氏を選択し、プルダウンメニュー3817に対し画面3803で第一会議室を選択し、プルダウンメニュー3818において包含関係を選択し、全体式設定画面3813を用いて、プルダウンメニュー3822に対し、上述した関係条件式3811を選択し、プルダウンメニュー3823に山田氏が来ましたというメッセージを表示することを設定することにより得られる。スクリプト3901は宣言型言語であり、ユーザの要求を述べているのみであり、どのように実行するかについては説明されていない。これを初期式とし、変換する事により、終了式3906に変換する。終了式3906は、データベースから、XPathで指定された条件に従い、第一会議室という名称の会議室に存在する人検知センサノードのノードIDを取得し、該ノードIDに対し、部分スクリプトの実行を要求する、部分スクリプトは、ノード検知イベントを検知したら、その検知したノードのノードIDが、データベースから取得した、山田という名前の人物の持つ名札ノードのノードIDと等しいかを判定するという内容を持つ。またその結果が返戻されたら、山田氏が来ましたというメッセージを表示するということを述べている。これは初期式3901に定理3902、3903を当てはめる事により実現できる。定理3902、3903は、図5に示すサーバの、データベース712に格納される。定理3902は、人物が部屋内にいる≡人物の名札ノードが部屋内にいるという論理を示し、定理3903は、名札ノードが部屋内にいる≡名札ノードが部屋内の人検知センサに検知されるという論理を示す。これにより初期式3901のisInside以下のコマンドは、中間式3904に展開される。中間式3904で使用されるコマンドisInside2は、テンプレート3905として定義されている。その結果、初期式3901は終了式3906に展開することができる。このように、サーバ203の管理者があらかじめ定理3902、3903、テンプレート3905を用意しておく事により、ユーザの要求である宣言型言語の初期式3901を、手続き型言語である終了式3906に変化させることができる。この終了式3906を実行する事により、目的の結果が得られる。<第13実施形態>図39は、第13の実施形態を示し、前記第1実施形態のセンサネットワークを進捗管理を行うプロジェクト管理システムに適用した例を示す。一般に、プロジェクト管理の分野では、TOCTheoryOfConstraints:制約理論などの理論体系の整備が進み、様々なプロジェクト管理システムが提供されてきている。しかし従来のプロジェクト管理システムは、あくまでプロジェクト管理者の支援を行うことを目的とした、静的で受動的なシステムであった。本発明を適用することにより、動的で能動的なプロジェクト管理システムを構築することができる。図39を用いて、本発明によるプロジェクト管理システムの機能を説明する。プロジェクト管理を行うサーバ4001は進捗管理グラフ4005を用い、プロジェクトを構成する各業務の進捗を管理する。進捗管理グラフ4005では、あらかじめプロジェクト管理者4004が予測した業務の必要日数から算出した予定曲線4006と、プロジェクトの実際の進捗を示す進捗曲線4007を管理する。業務を担当する作業者4002は、定期的にアクション4010により、進捗曲線4007を更新していく。本発明を適用することにより、様々なイベントハンドリングが可能となる。例えば業務の進捗が一定の割合4008を越えた時点をイベントとして検知し、該業務の後に続く業務の作業者4003にイベントを発行し、後に続く業務の開始日を通達することができる。また、プロジェクトの進捗が予定より一定日数遅れた時点をイベントとして検知し、作業者4002にイベント4011を発行したり、プロジェクト管理者4004にイベント4013を発行したりすることにより、業務遅延の対策を要求することができる。同様に業務終了予定日の一定日前4009をイベントとして検知し、プロジェクトの進捗が予定より遅れている場合に作業者4002にイベント4011を発行したり、プロジェクト管理者4004にイベント4013を発行したりすることにより、業務遅延の対策を要求することができる。作業者4002が進捗登録アクション4010を行わない場合にも、タイマイベントにより登録アクション4010がないことを判定し、作業者4002にイベント4011を発行して入力を要求したり、プロジェクト管理者4004にイベント4013を発行して、対策を要求することができる。<補足>前記第1実施形態に示したスクリプト実行エンジンであるスクリプトマネージャは、図2のセンサネットワークを構成するセンサノード201、ルータノード202、サーバ203、WEBサービス204、クライアント205の全てあるいはいずれかのノードにおける、イベントハンドリングを行いたいノードに設置する。図1では省略したが、ルータノード202は直列に複数個存在してもよい。また、前記第1実施形態において、イベントハンドリングが不要なノードからスクリプトマネージャを削除してもよい。センサノード201からスクリプトマネージャ404を削除した場合、センサノード201は固定的なイベントを発行する。ルータノード202からスクリプトマネージャ409を削除した場合、通信経路途中でのイベント集約処理を行わない。サーバ203、WEBサービス204、クライアント205からスクリプトマネージャを削除した場合、それぞれの機器ではイベントハンドリングを行わない。したがって、イベントハンドリングが必要なノードにスクリプトマネージャを実装すればよいのである。