Transcript デバイス ホストは
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