Presentation Title

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