-------------------------------------------------------------------------------     ホームコンピューティングのためのサービス統合メタミドルウェア ------------------------------------------------------------------------------- 1. %title%とは -------------------------------------------------------------------------------  これは、中間プロトコルを利用することで異種のミドルウェア間での相互通信を図り、サービス統合を実現するための枠組みです。今回、中間プロトコルにはSOAPを利用しています。また、サービスを提供するミドルウェアとしてはJINI、X10(電灯線ネットワーク)に対応しています。  当システムを使用することによって、今後避けられない問題であるミドルウェアの多様化に対処することができます。また、当フレームワークに新しいミドルウェアを追加することも容易です。 2. 動作環境 -------------------------------------------------------------------------------  J2SDKが動作する環境。 3. 提供ファイル ------------------------------------------------------------------------------- ・hmm.tar.gz ……プログラム本体。 ・readme.txt ……このファイル。 ・huroku.pdf ……各モジュールの仕様書およびマニュアル(PDF形式) 3. インストール方法 -------------------------------------------------------------------------------  hmm.tar.gzを解凍します。必要に応じて、解凍して出てくるhmm.jarにクラスパスを通して下さい。  SOAPを使用するためには、Apache SOAPをインストールする必要があります。  JINIを対応させる場合は、Javassistが必要です。 4. 使用方法 -------------------------------------------------------------------------------  まずApache SOAPを使用可能な状態にします。  本システム使用のための基本的な手順としては、  (1) (JINI、X10等の)サービスを登録する  (2) (JINI、X10等の)クライアントがサービスを呼び出す  となります。  例えばJINIサービスを本システムに登録する場合は、SOAPサービスとしてApache SOAPにdeployするための、JINI代理クライアントを生成し、これをdeployします。また、本システムに登録されたサービスをJINIクライアントから呼び出す場合は、SOAPクライアントとして動作するJINI代理サービスを利用可能にする必要があります。  詳しくは、付録の「開発ソフトウェア仕様書及びマニュアル」とjavadocを参照して下さい。これは、元のマニュアルのテキストを起こしたものです。図などは省略されています。 5. アンインストール方法 -------------------------------------------------------------------------------  インストールしたファイルを削除します。 6. 開発環境 ------------------------------------------------------------------------------- ・Linux ・Sun JDK ------------------------------------------------------------------------------- 奥付  開発リーダー   徳永英治 [付録] 開発ソフトウェア仕様書及びマニュアル  これは、「開発ソフトウェア仕様書及びマニュアル(PDF形式)」のテキスト部分を抜粋したものです。図などは省略されています。 ------------------------------------------------------------------------------- SOAPクライアントモジュールに関するドキュメント 1 必要システム l Apache SOAP 2 概要  Proxy Serverクラスが、SOAPエンベロープを送信するために使用する。 3 内容 l net.eitoku.hmm.soap.client.Catapult 4 使用方法 Catapultクラスは、インスタンス化するときにコンストラクタの引数にjava.net.URLオブジェクトとurnを表す文字列を渡す。これによって生成されたCatapultオブジェクトは、指定されたURLの指定された名前のサービスにのみアクセスする。 サービスのメソッドを起動するときは、Catapultのfireメソッドを呼ぶ。これの引数は、呼び出すメソッドの名前を表す文字列と、それに渡す引数を表すorg.apache.soap.rpc.ParameterオブジェクトのVectorとなる。 (以上) ------------------------------------------------------------------------------- SOAPサービス登録に関するドキュメント 1 必要システム l Apache SOAP 2 概要  あらかじめ用意されたJavaのクラスをApache SOAPに登録して、SOAPサービスとして使用できるようにする。 3 内容 l net.eitoku.hmm.soap.server.Deployer 4 使用方法  Deployerクラスをインスタンス化するときに、引数に登録先の URLを渡す。その後、このインスタンスのdeployメソッドを呼び出す。このメソッドには、引数にそのサービスを提供するクラスと、登録するメソッドが記述されたインタフェースを渡す。なお、サービスを提供するクラスはこのインタフェースを実装している必要がある。提供するメソッドを表すインタフェースを実装していないクラスをSOAPサービスとして登録する場合は、手動で行う。 ※ なお、JiniProxyClientをSOAPに登録する場合には、net.eitoku.hmm.proxy.client.JiniProxyClientDeployerを使用することができる。(「JINI対応に関するドキュメント)参照) (以上) ------------------------------------------------------------------------------- JINI代理クライアント使用マニュアルおよび仕様書 1 必要システム l Java実行環境(Java2互換)。 l Jini Technology Core Platform(JCP) ・JINIサービスを動作させる環境。 l Apache SOAP 2 概要  JINI代理クライアントとは、JINIクライアントとして動作するSOAPサービスである。これを通じて、SOAPクライアントからJINIサービスを利用することが可能である。  net.eitoku.hmm.proxy.client.JiniProxyClientクラスは、invokeメソッドでJINIサービスを取得して呼び出し、結果を戻り値として返す。  このクラスは、invokeメソッドの引数で呼び出しの内容を指定するもので、本クラスを使用するSOAPクライアントは、目的のJINIサービスのインタフェース名、メソッド名などを知っていなくてはならない。 3 内容 l net.eitoku.hmm.proxy.client.JiniProxyClient ・JINI代理クライアント本体。 4 使用方法  JiniProxyClientクラスは、手動でApache SOAPに登録する。 JiniProxyClientクラスの、JINIサービスを取得して呼び出すメソッドの名前はinvokeである。invokeメソッドの引数には、インタフェース名、メソッド名、呼び出すメソッドの引数となる値を収納したVectorを渡す。呼び出しの度にこれらを指定する必要がある。 5 備考  通常は、各JINIサービスに対応したJINI代理クライアントを生成する方法を採る(JINI Proxy 生成に関するドキュメントを参照)。 (以上) ------------------------------------------------------------------------------- JINI代理サーバ使用マニュアルおよび仕様書 1 必要システム l Java実行環境(Java2互換)。 l Jini Technology Core Platform(JCP) ・JINIサービスを動作させる環境。 l Apache SOAP 2 概要  JINI代理サーバとは、SOAPエンベロープを送信するJINIサービスである。これを通じて、JINIクライアントからSOAPサービスを利用することが可能である。  net.eitoku.hmm.proxy.server.JiniProxyServerImplクラスは、exportメソッドでSOAPエンベロープを送信し、結果をnet.eitoku.hmm.proxy.server.ParameterElementオブジェクトで返す。  このクラスは、exportメソッドの引数でSOAPエンベロープの中身を決定するもので、本サーバを利用するJINIクライアントは、目的のSOAPサービスのURL、サービス名などを知っていなくてはならない。 3 内容 l net.eitoku.hmm.proxy.server.JiniProxyServer ・ JiniProxyServerImplが実装するインタフェース。Exportメソッドを定義している。 l net.eitoku.hmm.proxy.server.JiniProxyServerProxy ・ JiniProxyServerImplが実装するインタフェース。JiniProxyServerインタフェースとjava.rmi.Remoteインタフェースを継承している。 l net.eitoku.hmm.proxy.server.JiniProxyServerImpl ・ JINI代理サーバ本体。 l net.eitoku.hmm.proxy.server.SOAPCall ・ JiniProxyServerのexportメソッドに引数で渡す。SOAP呼び出しの内容を指定する。 l net.eitoku.hmm.proxy.server.ParameterElement ・ SOAPCallオブジェクト内でSOAP呼び出しの引数として、あるいはJiniProxyServerのexportメソッドの戻り値として使われる。 4 使用方法 JiniProxyServerImplクラスは、例えば次のようにJINI Lookupに登録する。 java -Djava.rmi.server.codebase=http://hoge:8086/ -Djava.security.policy=/usr/local/jini1_1/policy/policy.all net.eitoku.hmm.proxy.server.JiniProxyServerImpl  これを登録した後は、JiniProxyServerインタフェースを使ってJINIクライアントからアクセスすることができる。 JiniProxyClientクラスのSOAPエンベロープを送信するメソッドの名前はexportである。この引数に、JiniProxyServerが送信するエンベロープの中身を設定するために、SOAPCallオブジェクトを渡す。Exportメソッドの戻り値の型は同パッケージのParameterElementである。例えば、次のように使用する。 public class JiniProxyServerUser { public static void main(String[] args) throws Exception { System.setSecurityManager(new RMISecurityManager()); ServiceFinder sf= new ServiceFinder(net.eitoku.hmm.proxy.server.JiniProxyServer.class); net.eitoku.hmm.proxy.server.JiniProxyServer p= (net.eitoku.hmm.proxy.server.JiniProxyServer)sf.getObject(); SOAPCall sc= new SOAPCall(); sc.setTargetObjectURI("urn:SOAPServer"); sc.setMethodName("hello"); Vector param= new Vector(); param.addElement(new ParameterElement ("hoge",java.lang.String.class, new String("Nakajima"))); sc.setParameter(param); sc.setURL(new URL("http://hoge:6060/soap/servlet/rpcrouter")); ParameterElement pal= p.export(sc); System.out.println((String)pal.getObject()); } } 5 備考  この方法は、JINIクライアントからSOAPをほとんどそのまま呼んでいる。通常は、各SOAPサービスに対応したJINI代理サーバを生成する方法を採る(JINI Proxy生成に関するドキュメントを参照)。 (以上) ------------------------------------------------------------------------------- SOAP over SMTP 1 使用方法 2つのメールアカウントを作成する。 例. 受信側:soap@dcl.info.waseda.ac.jp 送信側:paos@dcl.info.waseda.ac.jp まず、受信側のプログラムについて説明する。受信側のプログラム(pop.sh)は、一定のインターバルでPOP3サーバにアクセスしメッセージを受信しようとする。メッセージがあればそれをダウンロードする。メッセージがなければその旨を表示する。メッセージを受け取ったときには、org.apache.soap.SMTP2HTTPBridgeがメール本体をSOAPメッセージに変換し、SOAPゲートウェイに送信する。 つぎに送信側のプログラムについて説明する。送信側のプログラム(SMTPSender)はorg.apache.soap.transport.smtp.SOAPSMTPConnectionを使ってHTTPではなくSMTPのSOAPコネクションを構築する。送り先のURLはmailto:で指定する。たとえば URL url = new URL(mailto:soap@dcl.info.waseda.ac.jp); とする。送信側のプログラムはSOAPメッセージを送信した後POP3サーバにアクセスし、メソッドの戻り値を待つ。 コマンドはMUAを用いても送信することができる。その場合にはメール本体にSOAPエンベロープを記述する。あて先はSOAPゲートウェイである。 例. ------------------------------------------------------------------------------- SOAP over HTTP with Servlet 1 モジュール構成 ・ NewService.html ・ net.eitoku.hmm.soap.client.SOAPClientForServlet ・ SOAPClientManager ・ DisplayService ・ ConfirmService 2 NewService.html 新しいSOAPサービスを登録するためのフォーム。ターゲットとなるSOAPサービスのURL、URN、メソッド名、引数のタイプ、引数を指定する。(引数のタイプは現在、String、Integerのみ) 図 1 NewClient.html 3 SOAPClientForServlet SOAPサービスにアクセスするクラス、URL、URN、と実行するメソッド群のハッシュテーブルをインスタンスに持つ。 4 SOAPClientManager NewService.html、DisplayService、ConfirmServiceからアクセスを受け、内部に持っているSOAPクライアント管理テーブルを使用して、処理を行う。 5 DisplayService 登録されているSOAPクライアントを一覧表示する。実行したいサービスがあるSOAPクライアントを選択し、「参照」ボタンをクリックすると詳細表示画面に移る。 図 2 DisplayService 6 ConfirmService DisplayServiceで選択されたSOAPクライアントの詳細情報を表示する。 実行したいサービスを選択し、「実行」ボタンをクリックすると、実行結果がページ下部に表示される。 図 3 ConfirmService ------------------------------------------------------------------------------- SOAPtoX10 代理クライアント仕様書 1 必要システム X10API Tomcat ApacheSOAP Javassist 2 概要 SOAPからX10を使用するための代理クライアントを自動生成する。ユーザは,パラメータを入力するだけでサービスの実体であるクラスファイルを自動生成できる。 3 内容 net.eitoku.hmm.proxy.client.X10ServiceGenerator net.eitoku.hmm.proxy.client.X10ServiceOrganizer net.eitoku.hmm.proxy.client.X10ServiceTemplate scripts/deploy_x10 4 サービスの登録 X10ServiceGeneratorとdeply_x10がサービス登録のためのアプリケーションである。通常はdeploy_x10をつかってサービスの登録を行う。deploy_x10は内部でX10ServiceOrganizerを起動している。deploy_x10はユーザのホームディレクトリにサービスを生成し、サービスを登録する。そのためtomcatのクラスパスにあらかじめホームディレクトリを登録しておく必要がある。ユーザはサービスの名前を自由につけることができる。 サービスはJavassistを利用して、あらかじめ用意されているテンプレートX10ServiceTemplateから自動生成される。 5 サービスの利用 各サービスは、allUnitsOff,allLightsOn,on,off,dim,bright,allLightOff,presetDim1,presetDim2,statusOn,statusOff,statusRequestのメソッドを持つ。このうち、dim,bright,presetDim1,presetDim2は明るさ調節のためのint型の引数を持つ。 モジュールに機能がない場合は実行されない。たとえば、onとoffの機能しか持たないモジュールに対してdimを送信しても何も変化しない。 ------------------------------------------------------------------------------- SOAPtoX10 X10代理クライアントのマニュアル 1 プログラム名 deploy_x10 2 使い方 deply_x10 rpcrouter service x10server x10server_port house device rpctouer SOAPゲートウェイのURL x10server X10サーバのFQDNもしくは,IPアドレス x10server_port X10サーバのTCPポート house このX10サービスのハウスコード device このX10サービスのデバイスコード deploy_x10は、このプログラムを走らせたユーザのホームディレクトリにnet/eitoku/hmm/proxy/client/servicesというディレクトリを作り、そこに新しいサービスを格納する。 このプログラムは,サービスの生成とデプロイを行う。 例. ハウスコードB、デバイスコード7のランプモジュールをデプロイする場合。 deploy_x10 http://yunoka.dcl.info.waseda.ac.jp:6060/soap/servlet/rpctouer Lamp fio.dcl.info.waseda.ac.jp 9000 b 7 (実際には一行) ------------------------------------------------------------------------------- X10toSOAP 代理サーバ仕様書 1 必要システム X10API ApacheSOAP xerce 2 概要 X10ネットワークからSOAPサービスを利用するための仮想X10デバイスを生成する。ユーザはパラメータをセットすることで、仮想X10デバイスを生成することができる 3 内容 net.eitoku.hmm.proxy.server.X10VirtualDevice net.eitoku.hmm.proxy.server.X10VirtualDeviceGenerator net.eitoku.hmm.soap.client.Catapult 4 仮想X10デバイスの生成 X10VirtualDeviceが仮想X10デバイス本体であるが、このクラスを実体化するためには、ファンクションコードにマッピングするメソッドを持つクラスを実体化してコンストラクタにセットする必要がある。そこで、仮想デバイスの作成を支援するクラスである、X10VirtualDeviceGeneratorを利用する。 X10VirtualDeviceGeneratorは、仮想デバイス化したいクラスのクラスパスをStringで渡すことにより、クラスの実体化を行い、仮想X10デバイスを生成する。この仮想デバイスに対して、setFunction()メソッドを実行することで、各ファンクションコードに対して、自身の特定のメソッドが実行されるように設定される。 本システムはX10の各ファンクションコードにCatapultのfireメソッドと各々の引数をマッピングさせることにより、X10ネットワークからSOAPサービスを呼び出すことを可能にしている。したがって、CatapultをX10VirtualDeviceGeneratorにより、仮想デバイス化し、setFunction()メソッドでfireメソッドと各ファンクションコードのマッピングを行う。 5 仮想X10デバイスの起動 X10VirtualDeviceのbegin()メソッドを実行することにより、このX10仮想デバイスは実行状態になり、X10ネットワークからのメッセージを受け付けるようになる。 停止はstop()メソッドで行う。 ------------------------------------------------------------------------------- X10toSOAP 代理サーバマニュアル 1 使用クラス net.eitoku.hmm.proxy.server.X10VirtualDevice net.eitoku.hmm.proxy.server.X10VirtualDeviceGenerator net.eitoku.hmm.soap.client.Catapult 2 使い方 String x10SrvURL x10サーバのURL int port x10サーバのポート番号 String SOAPURL soapサービスのURL String SOAPURN soapサービスのURN String methodName soapサービスで実行するメソッド名 //Generatorを生成 X10VirtualDeviceGenerator gen= new X10VirtualDeviceGenerator(x10SrvURL, port); //Catapultを仮想デバイス化する(ロケーションはA1) Vector conArgs =new Vector(); conArgs.add(SOAPURL); conArgs.add(SOAPURN); X10VirtualDevice dev= gen.getX10VirtualDevice("A", "1", "net.eitoku.hmm.soap.client.Catapult", conArgs); //fireメソッドをファンクションコード「On」にマッピングする Vector SOAPArgs = new Vector(); //この例では実行するSOAPサービスの引数は //なしと仮定するため、空のVectorを生成する。 Vector fireArgs = new Vector(); fireArgs.add(methodName); fireArgs.add(SOAPArgs); dev.setFunction("On", "fire", fireArgs); //仮想デバイスをアクティブにする dev.begin(); 以上の操作で、X10ネットワーク上のA1のデバイスに対してOnを送信すると、 URL= SOAPURL, URN= SOAPURN, メソッド名= methodName, 引数なしのSOAPサービスが実行される。 ------------------------------------------------------------------------------- X10ToSOAPサンプルアプリケーション解説 1 プログラム名 X10ToSOAPSampleGUI X10からSOAPサービスを利用できるようにするためのGUIプログラム 2 使い方 java net.eitoku.hmm.proxy.server X10ToSOAPSampleGUI GUIが立ち上がる。まず、X10サーバのロケーションをセッティングする必要がある。 図 4 X10サーバのロケーションセッティング X10サーバのURLとポート番号を入力し、「set」を押す。 次に、SOAPサービスを起動する仮想X10デバイスを生成する。 自身のハウスコード、デバイスコードを選び、SOAPサービスのURL,URNを入力し、SOAPサービスのメソッド名、引数とマッピングしたいファンクションコードを選んで、「deploy」を押す。 図 5 仮想デバイスの生成 生成した仮想デバイスはアクティブ状態にする必要がある。 deviceタブをクリックすると登録されているデバイス一覧が表示されるので、対象とするデバイスを選択する。すると、デバイスの詳細が表示されるので、了解したら、「active」ボタンを押すことで、この仮想デバイスはアクティブになる。 図 6 仮想デバイスの起動 ------------------------------------------------------------------------------- JINI Proxy生成に関する仕様書およびドキュメント 1 必要システム l Java実行環境(Java2互換)。 l Jini Technology Core Platform(JCP) ・JINIサービスを動作させる環境。 l Apache SOAP l javassist2.0 2 概要  あるSOAPサービスに対応したJINI代理サーバおよび、あるJINIサービスに対応したJINI代理クライアントを生成する。  前者は、特定のSOAPサービスに対応したインタフェースを持つJINIサービスで、これを生成すると、JINIクライアントから、JINIサービスとしてSOAPサービスの機能を利用できる。後者は、特定のJINIサービスに対応したインタフェースを持つJINIクライアントで、これを生成すると、SOAPクライアントから、SOAPサービスとしてJINIサービスの機能を利用できる。  なお、これら二つをあわせてJINI Proxyと呼ぶ。 3 内容 l net.eitoku.hmm.proxy.JiniProxyGenerator ・ JINI Proxyを生成するジェネレータ本体。 l net.eitoku.hmm.proxy.ServiceDefinition ・ 生成するJINI Proxyを定義するクラス。ジェネレータの生成時に引数として渡される。 l net.eitoku.hmm.proxy.MethodDefinition ・ ServiceDefinition内で、各メソッドの定義を表すクラス。 l net.eitoku.hmm.proxy.JiniProxyGeneratorGUI ・ JiniProxyGeneratorをGUI環境で動作させるクラス。 l net.eitoku.hmm.proxy.server.JiniProxyServerMetehodTemplate ・ JiniProxyGeneratorがJINI代理サーバを生成するときに、JINI代理サーバが持つメソッドの雛形となるメソッドを提供するクラス。 l net.eitoku.hmm.proxy.server.UnicastRemoteObjectAdaptor ・ JiniProxyGeneratorが生成するJINI代理サーバが継承するクラス。 l net.eitoku.hmm.proxy.server.ServiceInitializer ・ 生成したJINI代理サーバが、SOAP Catapultを初期化するために使用する。 l net.eitoku.hmm.proxy.server.JiniProxyServerRegister ・ 生成したJINI代理サーバをJINI Lookupに登録するmain関数を提供するクラス。 l net.eitoku.hmm.proxy.client.JiniProxyClientMethodTemplate ・ JiniProxyGeneratorがJINI代理クライアントを生成するときに、JINI代理クライアントが持つメソッドの雛形となるメソッドを提供するクラス。 l net.eitoku.hmm.proxy.client.ClientInitializer ・ 生成したJINI代理クライアントが、アクセスするJINIサービスを取得するために使用する。 l net.eitoku.hmm.proxy.client.JiniProxyClientDeployer ・ 生成したJINI代理クライアントをApache SOAPに登録するmain関数を提供する。 4 使用方法(JINI代理クライアント生成)  あるJINIサービスを本システムで利用するためには、通常、JiniProxyGeneratorクラスを使用して、そのJINIサービスに対応したJINI代理クライアントを生成する。生成したJINI代理クライアントは、Apache SOAPにSOAPサービスとして登録する。以下に、使用手順を示す。 代理クライアント生成に必要なもの 目的のJINIサービスが実装しているインタフェース、あるいはそれと同等の情報。 インタフェースを利用する場合 イ、 Classクラスのオブジェクトとしてそのインタフェースを取得する。 ロ、 JiniProxyGeneratorクラスのインスタンスを生成する。構築子には、第一引数にイのClassオブジェクトを、第二引数にこのJINI代理クライアントがJINIサーバと通信する際のSecurity Policyファイル名をStringで、それぞれ渡す。 ハ、 生成したJiniProxyGeneratorオブジェクトのgenerateメソッドを実行する(引数は、なし)。 ここまでの手順で、JINI代理クライアントは生成されている。以降、下の「ニ」に続く。 インタフェースを使用しない場合 イ、 目的のサーバのインタフェース情報を表現する、ServiceDefinitionオブジェクトを用意する。 (a) このサーバの名前を表すStringを引数に、ServiceDefinitionオブジェクトを 生成する。 (b) このサーバが持つメソッド群を表すMethodDefinitionオブジェクトの配列を 用意し、ServiceDefinitionにセットする。この時、メソッド毎に以下のもの が必要である。 ・各メソッドの戻り値を表すClassオブジェクト ・各メソッドの引数を表すClassの配列 ・各メソッドが投げるかもしれない例外を表すClassの配列 ・各メソッドの名前 ロ、 JiniProxyGeneratorクラスのインスタンスを生成する。構築子には第一引数に先のServiceDefinitionオブジェクト、第二引数にこのJINI代理クライアントがJINIサーバと通信する際のSecurity Policyファイル名をStringで、それぞれ渡す。 ハ、 生成したJiniProxyGeneratorオブジェクトのgenerateメソッドを実行する(引数は、なし)。 例: public class GeneratorUser { public static void main(String[] args) throws Exception { Class[] parameterArray= {java.lang.Integer.TYPE}; Class[] exceptionArray= {java.rmi.RemoteException.class}; method = new MethodDefinition("methodName", java.lang.Void.TYPE, parameterArray, exceptionArray); MethodDefinition[] md= {method}; ServiceDefinition sd= new ServiceDefinition("SampleService",md); JiniProxyGenerator generator= new JiniProxyGenerator(sd, "policy.all"); generator.generate(); } } ここまでの手順で、JINI代理クライアントは生成されている。また、このJINI代理クライアントがサーバにアクセスするために使用するインタフェースも生成されます。 ニ、 生成したJINI代理クライアントを、SOAPサービスとして登録する。これには、net.eitoku.hmm.proxy.client.JiniProxyDeployer を使用することができる。JiniProxyDeployerでSOAPサービスに登録する場合は、引数に登録先のURLと、サービスを表すインタフェース(ここでは、その代理クライアントがサーバにアクセスするのに使用するためにJiniProxyGeneratorで生成された、あるいは元々あってJINI 代理クライアントの生成に利用したインタフェース)を指定する。    例:java net.eitoku.hmm.proxy.client.JiniProxyClientDeployer http://hoge:8080/soap/servlet/rpcrouter net.eitoku.jini.SampleService ホ、SOAPを通じてクライアントからアクセスする。 例えば、次のようなJINIサービスのインタフェースがあった場合…… public interface SampleService extends java.rmi.Remote; { public void hoge1(int i) throws java.rmi.RemoteException; public String hoge2() throws java.rmi.RemoteException; } これに対応する代理サーバを生成し、Apache SOAPに登録すると次のようになる。 5 使用方法(JINI代理サーバ生成)  JINIクライアントから本システムのサービスを利用するためには、通常、JiniProxyGeneratorクラスを使用して、目的のサービスに対応したJINI代理サーバを生成する。生成したJINI代理サーバは、JINIサービスとしてJINI Lookupに登録する。以下に、その手順を示す。 代理サーバ生成に必要なもの 目的のサービスのインタフェース情報、SOAPサービスを提供しているURL イ、 目的のサービスを表現する、ServiceDefinitionオブジェクトを作成しする。その手順はJINI代理クライアントを生成するときと同様である。 ロ、 JiniProxyGeneratorクラスのインスタンスを生成する。この時、第一引数に先のServiceDefinitionオブジェクト、第二引数にSOAPサービスを提供しているURLを表すjava.net.URLオブジェクトをそれぞれ渡す。 例:JiniProxyGenerator generator= new JiniProxyGenerator (sd, new URL("http://hoge:8080/soap/servlet/rpcrouter")); ハ、 JiniProxyGeneratorオブジェクトのgenerateメソッドを実行する(引数は、なし)。 ここまでで、JINI代理サーバが生成される。生成されるJINI代理サーバは、指定した名前+「Impl」という名前になっている。なお、指定した名前のインタフェースも生成している。生成した代理サーバはこれを実装していて、クライアントから代理サーバにアクセスするときに使用する。 ニ、 rmic等を使用して、このJINI代理サーバのスタブを生成する。 ホ、 JINI代理サーバを、JINI Lookupに登録する。 JINI代理サーバ(例:SampleServiceImpl)を登録するには、net.eitoku.hmm.util.jini.ServerListenerとnet.jini.discovery.LookupDiscoveryを使用して、以下のようなプログラムを書く。    import net.eitoku.hmm.util.jini.*;    import net.jini.discovery.*; public class TestRegister{ public static void main(String[] args) throws Exception { System.setSecurityManager(new RMISecurityManager()); String[] groups = new String[] {""}; LookupDiscovery reg = new LookupDiscovery(groups); SampleServiceImpl ssi = (SampleServiceImpl) new SampleServiceImpl(); ServerListener sl = new ServerListener(reg, ssi); reg.addDiscoveryListener(sl); } } あるいは、JiniProxyServerRegister クラスを使用して登録することもできる。 例:java -Djava.rmi.server.codebase=http://hoge:8085/ -Djava.security.policy=/usr/local/jini1_1/policy/policy.all net.eitoku.hmm.proxy.server.JiniProxyServerRegister net.eitoku.hmm.proxy.server.SampleService ヘ、 クライアントからアクセスする。 このサービスを利用するには、生成されたインタフェースを使用してJINIサービスとしてアクセスする。net.eitoku.hmm.util.jini.ServiceFinderを使用して、以下のようなプログラムを書こともできる。   import net.eitoku.hmm.util.jini.*; public class TestClient{  public static void main(String[] args) throws Exception{   System.setSecurityManager(new RMISecurityManager()); ServiceFinder sf = new ServiceFinder(SampleService.class); SampleService ss = (SampleSOAPService) sf.getObject(); ss.methodName();  } } ※ 生成したJINI代理サーバのスタブは、rmic等を使用して、別に手動で生成する必要がある。 ※ 生成したJINI代理サーバは、自動的に、「代理サーバを収納するパッケージ」(デフォルトではnet.eitoku.hmm.proxy.serverパッケージ)に編入される。 6 使用方法(GUIの使用)  JINI代理サーバおよびJINI代理クライアントの生成をGUI環境で行うプログラであるJiniProxyGeneratorGUIを用意している。  起動すると、図のようなウィンドウが開く。その使用手順を以下に示す。 <図> イ、 JINI代理サーバを生成するか、JINI代理クライアントを生成するかを選択する。 ロ、 JINI代理クライアントを生成する場合は、既存のインタフェースを使用するかどうかを選択する。 ハ、 生成するJINI代理サーバあるいはJINI代理クライアントの名称を入力する。 ニ、 JINI代理サーバを生成する場合はURLを、JINI代理クライアントを生成する場合はSecurity Policyファイル名を、それぞれ入力する。 ホ、 生成するJINI代理サーバあるいはJINI代理クライアントが持つ、メソッドを入力する。各メソッドに対して以下の操作を行い、これをメソッドの数にあわせて繰り返す。なお、JINI代理クライアントを生成する場合で既存のインタフェースを使用する場合は、ここでメソッドを入力する必要はない。 (a)下段のパネルで、メソッド名、戻り値の型を入力する。 (b)引数、例外はその名前を「追加」「削除」ボタンのすぐ上に名前を入力し、 「追加」ボタンを押してリストに追加する。   (c)中段の「追加」ボタンを押して、リストにメソッドを追加する。   (d)一度追加したメソッドを再編集・削除する場合は、そのメソッドを選択して 中段のボタンを押す。 ヘ、生成ボタンを押す。 (以上) ------------------------------------------------------------------------------- X10API仕様書 1 必要システム シリアルポート Java2SDK,もしくはJava2互換の環境 Java Communications API 2 概要 X10APIはX10 Home Automation System(http://www.x10.com)をJavaから使うためのAPIである。X10はX10プロトコルを用いてPC-X10間の通信を行う。X10APIはこの通信を抽象化し、X10アプリケーションの開発を容易にする。 3 内容 net.eitoku.x10以下,すべて。 4 X10プロトコル x10protocol.txtを参照。 5 スタンドアロン方式とサーバクライアント方式 X10APIには、X10Contollerインタフェースを実装した2つのクラスがある。アプリケーションは、これらのオブジェクトを使って、X10を操作する。ひとつは、X10ControllerImplクラスで、このクラスは、スタンドアロンで動作する。つまり、このクラスをインスタンス化すると、一つのアプリケーションがシリアルポートを占有してしまう。もうひとつは、Clientクラスで、このクラスは、TCPでServerクラスと通信する。シリアルポートはServerクラスが管理し、複数のクライアントからの要求を処理できるので、一つのアプリケーションに占有されない。 6 実行の流れ 1.X10へのコマンドの送信 アプリケーションはX10ControllerImpl、もしくはClientを利用する.これらのオブジェクトはsend(X10Packet)メソッドを持つ。このメソッドで正しいコードを送信するとモジュールが動作する. したがってアプリケーションの主な処理はX10Packetオブジェクトを作ることにある。X10のモジュールはAからP、1から16のハウスコード、デバイスコードによって識別される。しかし実際には、X10プロトコルはこれらの位置情報とモジュールのファンクションコードを1ニブルのバイナリコードとしてあらわす。コードの変換を行うクラスはLocation,X10Function,Moduleである。Locationはハウスコード、デバイスコードをバイナリ形式に変化する。X10Functionはファンクションをあらわす文字列から適切なバイナリへの変換を行う。Moduleはこれらのバイナリコードから,パケットのデータを生成する.したがって,X10Packetを生成するには(1)ハウスコード、デバイスコード、ファンクションコードの変換、(2)変換されたコードからデータの生成、(3)データからパケットの生成という段階を必要とする。 パケットを送った際に発生する通信のやり取りは、APIによって処理され結果のみがイベントとして通知される仕組みになっている。 2.X10からの受信 X10APIの心臓部であるX10SerialPortは起動している間シリアルポートを監視している。X10からのイベントがあればX10Eventを生成しX10EventListenerに通知する。イベントは大きく分けて2種類ある。イベントだけのもの、そしてイベントとそれに付随するデータを持つものである。前者は主にコマンドを送信したときのX10インタフェースからの返答である。後者はX10ネットワークの状態をレポートするものである。 7 注意 サーバが各クライアントごとに生成するCommandConnectionは、0を受信するとコネクションを切断し、オブジェクトを開放するようになっている。Clientは終了時に0をサーバ側に送信するようになっている。 8 デモプログラム net.eitoku.x10.test.SwitchLocal commport X10を操作するGUIが起動する。CommportにはX10インタフェースが繋がっているシリアルポートを指定する。 net.eitoku.x10.net.Server comport tcpport net.eitoku.x10.test.Switch host port 上記のプログラムのクライアントサーババージョン。ClientであるSwitchが動作するためには、あらかじめServerを起動しておく必要がある。 ------------------------------------------------------------------------------- X10APIサンプルアプリケーション解説 1 プログラム名 SwitchLocal X10をスタンドアロンで操作するためのプログラム. Switch X10をネットワーク越しに操作するためのプログラム. 2 使い方 java net.eitoku.x10.test.SwitchLocal comport java net.eitoku.x10.test.Switch host port GUIが立ち上がったら、左のプルダウンボックスでハウスコードを選び、中央のプルダウンボックスでデバイスコードを選ぶ。右端のテキストボックスにはランプの明るさ調節の値が入る。明るさは0から22までである。 最低限ハウスコードとデバイスコードを指定してからファンクションボタンを押すと、そのファンクションが実行される。 Switchはネットワーク越しにX10サーバを操作するためのプログラムである。GUIはSwitchLocalと同様である。操作方法も同様。あらかじめ,net.eitoku.x10.net.Serverが動作している必要がある。 ------------------------------------------------------------------------------- 赤外線リモコン制御API仕様書 1 必要システム シリアルポート Java2SDK,もしくは,Java2互換の環境 Java Communications API 2 概要 赤外線リモコン制御APIはHal 赤外線リモートコントローラ、クロッサム2+をJavaから使うためのAPIである.本APIはシリアルポートを利用してクロッサム2+と直接通信するための低レベルなAPI及び、クロッサム2+を利用したアプリケーションを容易に開発するための高レベルなAPIを含む。 3 内容 API本体:net.eitoku.hal以下のAPI。 各APIについてはJavaDocを参照されたし。 デモ:net.eitoku.sampl.IRGUI GUIのデモ。 net.eitoku.jini以下にJiniを利用したデモ。 ※ クロッサム2+ シリアルポート通信仕様 http://www.halcorp.co.jp/hard/crossam/transe.htmを参照. 4 実行の流れ 1.クロッサム2+と通信するシリアルポートを取得する net.eitoku.hal.ControlPortを生成し、openメソッドを実行する。この際、openメソッドの引数にはクロッサム2+が接続されているシリアルポート名を与える(例:COM1)。 2.低レベルな通信を行うPortCommanderを生成する 1で生成したControlPortをnet.eitoku.hal.PortCommunicaterのコンストラクタ引数に与え、PortCommunicaterを生成する。PortCommunicaterはクロッサム2+とコマンドを送受信する低レベルなメソッドを持っている。 例:write(String st) StringをASCIIコード※に変換してクロッサム2+に送信する。   String read() クロッサム2+から受信したASCII文字をStringに変換して返す。 3.高レベルな通信を行うCommanderを生成する。 2で生成したPortCommunicaterをnet.eitoku.hal.Commanderのコンストラクタ引数に与え、Commanderを生成する。Commanderはクロッサム2+とコマンドを送受信する高レベルなメソッドを持っている。 例:pushKey(int, int)ダイヤル値とキー値を引数にとり、特定のキーを押す。 ※クロッサム2+はシリアルポートの通信にASCIIコードを使う。Javaは内部的に文字列をUnicodeで保持しているので、通信の際ASCIIコードを使用しなければならない。net.eitoku.hal.PortCommunicaterは文字列の送受信時にUnicodeとASCIIコードの変換を行う。 ------------------------------------------------------------------------------- リモコンAPIサンプルアプリケーション解説 1 GUI ・net.eitoku.hal.sample.IRGUI クロッサム2+をローカルで制御するGUI。クロッサム2+が接続されているシリアルポート名を第一引数にとる。 実行例: # java net.eitoku.hal.sample.IRGUI 2 Jiniを利用したデモプログラム ・net.eitoku.jini.server.IRControlServiceImpl クロッサム2+へのコマンドインタフェース(Commanderのインタフェース)をJiniに登録するアプリケーション。net.eitoku.hmm.util.jini.*にあるJiniユーティリティが必要。クロッサム2+が接続されているシリアルポート名を第一引数にとる。 実行例: # java -Djava.security.policy=/usr/local/java/policy/policy.all \ -Djava.rmi.server.codebase=http://localhost:8086/ \ net.eitoku.jini.server.IRControlServiceImpl COM1 ・net.eitoku.jini.client.TVController net.eitoku.jini.server.IRControlServiceImplを利用したTVのGUIコントローラ。TVControllerはJiniのクライアントで、登録されたIRControlServiceImplのインタフェースを利用してクロッサム2+へアクセスする。 実行例: #java -Djava.security.policy=/usr/local/java/policy/policy.all \ net.eitoku.jini.client.TVController ○TVControllerのGUI(Linux上で起動) ・net.eitoku.jini.clien.LDController TVControllerと同様の機構で動作するLDのGUIコントローラ。 実行例: #java -Djava.seucity.policy=/usr/local/java/policy/policy.all \ net.eioku.jini.client.LDController ○LDControllerのGUI(Linuxで起動) ------------------------------------------------------------------------------- デモアプリケーション解説 1 携帯電話で家電(Jini, X10)を制御する ○必要システム 制御可能赤外線リモコン(クロッサム2+) X10ホームアプライアンスセット Java2SDK、もしくはJava2互換の環境 Java Communications API Apache SOAP API Javassist ○概要 JiniのTV制御サービスとX10のLamp制御サービスの代理クライアントを生成。それをApache SOAPを利用してSOAPにマッピング。携帯電話のWebブラウザから、サーブレットを利用したSOAP-Webインタフェースを参照し、それぞれのサービスを制御する。 ○手順 *サービスを起動するマシンの名前は以下の通りとする。 JiniLookupServer "lookupserver" Jini-TV制御サーバ  "tvcontroller" X10サーバ "x10server" Apache SOAPゲートウェイ "soapgateway" ※クロッサム2+にはダイヤル1にTVの制御が登録されているものとする。 ※soapgatewayではApache SOAPが起動しているものとする。 ※各API、アプリケーションの詳細な使用方法は別途ドキュメントを参照されたし。 (1) JiniのTV制御サービスをSOAPサービスにマッピングする @ クロッサム2+をサービス起動するPCのシリアルポート(例:COM1)に接続する。 A lookupserverでJiniLookupServiceを起動する。 JiniLookupService起動のサンプル: [lookupserver]# scripts/JiniGettingStarted.sh B tvcontrollerでコードダウンロード用のhttpdを起動する。 [tvcontroller]# java -jar /jdkhome/lib/tools.jar -dir /class_path_head -port 8086 C LookupServiceにTV制御用のJiniサービスを登録する。 [tvcontroller]# java -Djava.rmi.server.codebase=http://tvcontroller:8086/ -Djava.security.policy=/jini/security.policy \ net.eitoku.jini.server.TVControlServiceImpl COM1 1 D JiniProxyGeneratorを利用して、Jini代理クライアントを生成する [soapgateway]# java net.eitoku.hmm.proxy.JiniProxyGeneratorGUI E JiniProxyClientDeployerを利用して、生成した代理クライアントをApache SOAPに登録する [soapgateway]# java net.eitoku.hmm.proxy.client.JiniProxyClientDeployer \ http://soapgateway/soap/servlet/rpcrouter TVControlService (2) X10のLampモジュールをセットアップ、SOAPサービスにマッピングする @ X10のコントロールインタフェースをx10serverのシリアルポートに接続する。 A LampモジュールのX10デバイスコードをセットする(例:B-7) B X10Serverを立ち上げる [x10server]# java net.eitoku.x10.net.Server COM1 9000 C X10ServiceGeneratorを利用して、X10代理クライアントを生成する [soapgateway]# deply_x10 http://soapgateway/soap/servlet/rpcrouter \ urn:x10Lamp x10server 9000 A 1 (3) SOAP-WebインタフェースにTV制御サービスとLamp制御サービスを登録する (4) 携帯電話でSOAP-Webインタフェースのサービス起動ページにアクセスする 2 メールによる家庭内アプライアンス(Jini, X10)制御 ○必要システム 「携帯電話による家電制御」と同様 ○概要 SOAPにマッピングされたTV制御サービスとLamp制御サービスをSMTPoverSOAPを利用してMTAから利用する。 ○手順 (1)「携帯電話による家電制御」の(1)と(2)を行う。 (2)SMTPoverSOAPのマニュアルに従い、メールアカウントを作成する。 (3)POP監視スクリプトを起動する。 [soapgateway]# ./pop.sh (4)MTAからサービスにアクセスする。(SMTPoverSOAPマニュアル参照) 3 X10センサによるオートメーション ○必要システム 「携帯電話による家電制御」と同様 ○概要 X10センサからのイベントをSOAPに変換し、Jiniリモコンのトリガーとする。 ○手順 (1)「携帯電話による家電制御」の(1)と(2)を行う。 (2)X10モーションセンサをセットアップする(例:A-1) (3)X10toSOAPSampleGUIを利用して、A-1に対するX10VirtualDeviceを生成する。 (4)モーションセンサのイベントがトリガーとなってSOAPサービス(Jiniリモコン)が起動する。 ------------------------------------------------------------------------------- net.eitoku.hmm.utilに関するドキュメント 1 必要システム l Java 2 内容 l net.eitoku.hmm.util.debug.Logger l net.eitoku.hmm.util.MethodNameReflector l net.eitoku.hmm.util.jini.ServiceFinder l net.eitoku.hmm.util.jini.ServerListener 3 各クラスの概要 l net.eitoku.hmm.util.debug.Logger  デバッグ時にメッセージを出力する静的メソッドであるprintとprintlnを提供する。デフォルトでは、デバッグ中を表すシステムプロパティの「net.eitoku.DEBUG」が有効なときに、これらのメソッドはメッセージを出力する。  使用例   Logger.println("サービスを起動します "); l net.eitoku.hmm.util.MethodNameReflector  実行中のメソッド名を取得するための静的メソッドであるgetNameを提供する。getNameメソッドは、Exceptionを吐いてそのスタックトレースを読むことで、このgetNameメソッドを呼んだ元のメソッド名を取得して返す。 使用例   System.out.println(MethodNameReflector.getName()); l net.eitoku.hmm.util.jini.ServiceFinder  JINIクライアントが、インタフェースからJINI サービスを取得するために使用する。コンストラクタの引数に目的のインタフェースを表すクラスオブジェクトを渡してインスタンス化した後、getObjectメソッドを実行してサービスを取得する。 (使用例は、JINI代理サーバに関するドキュメント参照) l Net.eitoku.hmm.util.jini.ServerListener  JINIサービスを登録するときに使用する。ServerListenerクラスは、JINIサービスのオブジェクトを引数にしてコンストラクタを呼び出してインスタンス化する。それを引数にnet.jini.discovery.LookupDiscoveryオブジェクトのaddDiscoveryListenerメソッドを呼び出して、サービスを登録する。 (使用例は、JINI Proxy生成のドキュメント参照) (以上)