Windows CE .net SDK Miro Juric Software Design Engineer/Test Microsoft はじめに Windows CE における UPnP サポートの概要 (デ バイス サイド) Windows CEにおけるUPnPデバイスのビルド ー デモ Windows CE における UPNP サポートの概要 (コ ントロール ポイント サイド) IPv6 サポート Windows CE におけるUPnP インターネット ゲート ウェイ デバイスのサポート ― デモ Q&A CE 上での UPnP サポート デバイスをホストする API コントロール ポイント API UPnP デバイスの実装を可能に COM (プライマリ SDK API) C (OEM が利用可能) リモート デバイスのディスカバリー(検出)とコントロール(制御) COM ブリッジ 非 UPnP デバイスを UPnP として公開 特別なサポートは一切不要 CE 上での UPnP アーキテクチャ IUPnPRegistrar デバイスをホストする COM レイヤ IUPnPEventSink App デバイス API コントロール ポイント COM レイヤ コントロール ポイント API UPNP C API デバイス IOCTL コールバック イベント (GENA) SSDP WININET HTTPD Web サーバー ISAPI extn Device.exe UPNP サービス IUpnpDeviceFinder IUpnpDevice IUpnpService UPnP のデバイス ホスト デバイスの構築と Windows® 上でのブリッジを単 純化するインフラストラクチャ UPnP 複数デバイスのホストを可能に デバイス ホスト インフラストラクチャの 機能 登録済みデバイスの存在をアナウンス アドバタイズ〈告知)を自動更新 サーチ(検索)要求にも応答 デバイス/サービスのディスクリプション要求に応答 サービス上のコントロール ポイントの要求でアクションを起動 イベントを処理 サブスクリプション リクエストの受け入れ サービスごとにサブスクライバの一覧を維持 すべてのサブスクライバにイベントを送信 UPnP のデバイス ホスト (C) 低レベルの C スタイル API を使用 (OEM のみ)。 UPnP スタックが、 UPnP デバイスに対するメッセージを、 デバイスの実装によって提供された C スタイルのコール バック機能への呼び出しに変換します。 UPnP スタックは、引数または状態変数のエンコード/デ コードを一切行わない。 フル機能のデバイスとしてではなく、きわめて小さなデバ イスを製造する OEM 向けの小さなフットプリントです。 UPnP のデバイス ホスト (C) UPnPAddDevice() は、ディスクリプションに基づい て命名されたデバイスを作ります。 コールバック機能を供給します。 制御要求を受信すると、コールバック機能が呼び出されま す。 UPnPPublishDevice()は、デバイスをネットワーク 上にアナウンスします。 UPnPSetControlResponse()は、応答を返送しま す。 UPnPSubmitEvent()は、サブスクライバにイベント 通知を送信します。 UPnP のデバイス ホスト (COM) XML デバイス記述テンプレートが必要 各サービスに SCPD XML ファイルが必要 IUPnPDeviceControlを公表する COM オブ ジェクトを実装 各サービスに IDispatch インタフェースを実装 デバイスを公開するため、 IUPnPRegistrarを コール UPnP のデバイス ホスト (COM) デバイス ディスクリプション テンプレート .xml デバイスの 実装 IUPnPDeviceControl IUPnPRegistrar サービス 2 Scpd2.xml Scpd1.xml サービス 1 の 実装 IDispatch IUPnPEventSource IUPnPEventSink UPnP COM デバイス ホスト レイヤ デバイスの登録 デバイス ホストは、デバイス記述テンプレート内に適切な URL を生成します。 デバイス ホストは、デバイス記述テンプレート内の UDN を グローバルな一意の識別子に置き換えます。 同一のテンプレートを使用して、デバイスを複数のマシンに登録で きます。 同一のテンプレートを使用して、デバイスを同じマシンに複数回登 録できます。 パスバックされた識別子で、デバイスの登録を取り消すこと ができます。 UPnP のデバイス ホスト (COM) UPnPRegistrar オブジェクトを使用して、ユーザー のデバイスを公表します。 RegisterDevice ( /* [in] */ BSTR bstrXMLDesc, /* [in] */ BSTR bstrProgIDDeviceControlClass, … /* [retval][out] */ BSTR *pbstrDeviceIdentifier); これにより、デバイス ホストのコンテキストで実行されるデバイスが登録されます (システム ブートを繰り返しても存続しま す)。 RegisterRunningDevice ( /* [in] */ BSTR bstrXMLDesc, /* [in] */ IUnknown *punkDeviceControl, // IUPnPDeviceControl … /* [retval][out] */ BSTR *pbstrDeviceIdentifier); これにより、 Unregister に対して使用されるデバイス識別子が返されます(システム ブートすると消えます)。 UnregisterDevice( /* [in] */ BSTR bstrDeviceIdentifier, /* [in] */ BOOL fPermanent); GetUniqueDeviceName デバイスの UDN を取得します。 UPnP のデバイス ホスト (COM) IUPnPDeviceControl は、デバイスに対するトップ レベルのインタ フェースです。 Initialize( /*[in]*/ BSTR bstrXMLDesc, /*[in]*/ BSTR bstrDeviceIdentifier, // Init に対するデバイス (RegisterDevice) /*[in]*/ BSTR bstrInitString); //デバイスに特定の init ストリングを識別 GetServiceObject( /*[in]*/ BSTR bstrUDN, // デバイス UDN /*[in]*/ BSTR bstrServiceId, // ポインタを取得する対象のサービス ID /*[out, retval]*/ IDispatch ** ppdispService); //サービス オブジェクトに対する Idispatch ポインタ 各サービス オブジェクトは IDispatch と IUPnPEventSource を公 開。 IDispatch は、すべてのコントロール要求に対して実行します。 IUPnPEventSource は、状態変数が変わった際の発信イベン ト通知に使用されます。 イベント イベントをサポートするために、サービス オブジェクトは IUPnPEventSource を実装します。 インタフェースには 2 つのメソッドがあります。 Advise デバイス ホストはこのメソッドを呼び出し、サービス オブジェクト に IUPnPEventSink インタフェースに対するポインタを与えます。 これにより、サービス オブジェクトは、状態変化をデバイス ホスト にパスバックすることができます。 Unadvise デバイス ホストはこのメソッドを呼び出し、イベントを破棄します。 イベントを送信するために サービスは、変更された状態変数に対する dispID の一覧を使用し て、IUPnPEventSink::OnStateChanged を呼び出します。 デバイス ホストは dispID を照会して、変更された値を入手し、イベ ントをサブスクライバに送信します。 Windows CEにおけるUPnPデ バイスのビルド Miro Juric Software Design Engineer/Test Windows CE デバイスが実装するものは? IUPnPDeviceControl Initialize GetServiceObject 各サービスオブジェクトに関して IDispatch サービス内の実行 IUPnPEventSource Advise Unadvise コントロール ポイント API UPnP コントロール ポイント構築のための COM インタフェース IUPnPDeviceFinder IUPnPDeviceFinderインタフェースによってアプリ ケーションがデバイスを検出でます。 IUPnPDevices IUPnPDevicesインタフェースはデバイスを列挙しま す。 IUPnPDevice IUPnPDeviceインタフェースによってアプリケーショ ンが専用デバイスについての 情報を収集できます。 コントロール ポイント API IUPnPServices IUPnPServicesインタフェースはサービスを列挙し ます。 IUPnPService IUPnPServiceインタフェースによってアプリケー ションがサービスのインスタンス上で変数を検索し たりアクションを実行することができます。 オブジェクト モデル デバイス ファインダ デバイス コレクション デバイス サービス コレクション オブジェクト モデル サービス コレクション サービス XML (SOAP) をデバイスに デバイスからのイベント (GENA) UPnP コントロール ポイント デバイス ファインダの作成 IUPnPDeviceFinder * pDevFind = NULL; CoCreateInstance(CLSID_UPnPDeviceFinder, … IID_IUPnPDeviceFinder, (void **) &pDevFind); デバイスの検索 IUPnPDevices * pFoundDevices = NULL; bstrTypeURI = SysAllocString (L”urn:schemas-upnp-org:device:clockdevice”); pDevFind->FindByType(bstrTypeURI, 0, &pFoundDevices); ::FindByType メソッドは、デバイスまたはサービスの種類に応じて検索を行います。 UPnP コントロール ポイント デバイスの列挙 IUPnPDevices *pFoundDevices IUnknwn *pUnk = NULL; pFoundDevices->get_NewEnum(&pUnk) このコレクション内のデバイス オブジェクトは、変数構造体の中に含まれています。 これらの構造体には、デバイス オブジェクト上の IDispatch インタフェースに対する ポインタが含まれています。 // IUPnPDevice *pDevice インタフェースを取得します。 IUPnPServices の取得 ― サービス コレクション GetService(IUPnPDevice *pDevice) IUPnPServices *pServices = NULL; IUPnPService *pClockServics = NULL; pDevice->get_Services(&pServices) UPnP コントロール ポイント サービス オブジェクトの取得 IUPnPServices *pServicesがあります。 IUPnPService *pTimeService = NULL; IUPnPService *pAlarmService = NULL; bstrClockSvcId = SysAllocString (L”urn:upnp-org:serviceId:TimeService”) bstrAlarmSvcId = SysAllocString (L”urn:upnp-org:serviceId:AlarmService”) pServices->get_Item(bstrClockSvcId, &pTimeService) pServices->get_Item(bstrAlarmSvcID, &pAlarmService) オブジェクト モデル デバイス ファインダ デバイス コレクション デバイス サービス コレクション オブジェクト モデル サービス コレクション サービス XML (SOAP) をデバイスに デバイスからのイベント (GENA) UPnP コントロール ポイント アクションの実行 ― 制御 IUPnPService::InvokeAction メソッド pClockService->InvokeAction ( bstrActionName, varInArgs, &varOutArgs, &varReturnVal); 変数 varInArgs; QueryStateVariable UPnP フォーラムでは推奨していません。 UPnP コントロール ポイント コールバックの登録 IUPnPService::AddCallbackメソッドを使用 変数の値が変化したときに通知を取得 サービスが無効になったならば pClockService->AddCallback ( (IUnknown *) pUnkCallback) オブジェクトは pUnkCallback が IUPnPServiceCallbackインタフェースもしくは Idispatchインタフェースをサポートすることによっ て参照されます。 UPnP コントロール ポイント- まとめ DevicesCollectionを知りました。 探したいデバイスの検出 IUPnPServices *pServices 専用サービスタイプの検出 IUPnPDevice *pClockDevice サービスの取得 IUPnPDevices *pFoundDevices IUPnPService *pTimeService アクションの実行とイベントの受信 IPv6 Windows CE は、 IPv4 および IPv6 ネットワーク 上で UPnP をサポートしています。 IPv6 のサポートのみ UPnP デバイスは、IPv6 アドレスのみを使用します。 IPv4 + IPv6 UPnP デバイスは、ネットワーク上の IPv6 対応ホス トには IPv6 アドレスを使用し、 IPv4 のみをサポート するデバイスには IPv4 アドレスを使用します。 IPv4 のみ UPnP デバイスは IPv4 のみを使用します(既定)。 IPv6 スコープ IPv6 アドレスを使用することは、UPnPデバイ スを制御する上で、非常に素晴らしいことです。 リンク ローカルのアドレス (FE80:…..で始まる もの) 同じリンク上のノードだけがデバイスをアクセスできます。 - 既定 (典型的な ホームシナリオ) サイト ローカルのアドレス (FEC0:….で始まる もの) サイトローカルは、リンクローカルの追加オプションです。- エンタープライズ シナリオ (UPnPプリンター) UPnP サンプル Windows CE .Net におけるサンプル デバイス: インターネット ゲートウェイ デバイス 必要なスキーマを実装し、実際のゲートウェイ実 装と対話します。 全機能が使用できる IGD ― UPnP 認定済み。 コントロール ポイント: ユニバーサル コントロール ポイントのサンプル Platform Builder 4.10 Platform Builder は、 Microsoft® Windows® CE .NET オペレーティング システム (OS) に基づいて、カスタマイズさ れた組み込みプラットフォームを構築するための統合開発環 境 (IDE) です。 Platform Builder には、Windows CE をベースとするプラッ トフォームを設計、作成、構築、テスト、デバッグするために必 要な開発ツールがすべて備わっています。IDE には、統合さ れた単一のワークスペースが用意されており、ユーザーはそ こでプラットフォームとプロジェクトの両方の作業ができます。 PB の構成 Residential_gateway PDA Web Pad エンタープライズ … UPnP インターネット ゲートウェイ デバイスを使用して、Windows CE をベースとする住宅用ゲート ウェイ イメージをビルド Miro Juric Software Design Engineer/Test Windows CE まとめ UPnP は Windows CE でサポート デバイス ホストは 4.0 で対応 コントロール ポイントは 4.0 で対応 XP と同じ API!! 汎用コントロール ポイントのサンプル ゲートウェイ用のワーキング IGD ご質問は? For the interconnected lifestyle
© Copyright 2024 ExpyDoc