WPFxUPnP 2 その1
UPnPデバイスのクライアント側の作成にチャレンジです!
対象は、作っていたUPnPライトを操作するアプリケーションを作成してみます。
UPnPのクライアント側は、まず「UPnP 1.0 Type Library(Control Point)」を参照に加えます。
そして、UPnPデバイスの検索には、UPnPDeviceFinderクラスを用います。
こんな感じです。
UPnPDeviceFinder finder = new UPnPDeviceFinder(); UPnPDevices devices = finder.FindByType("upnp:rootdevice", 0); foreach (UPnPDevice dev in devices) { // devが検索されたデバイス }
このコードだと、同期検索で、約2秒くらいかかります。
なので、今回は非同期検索を実行してみます。
非同期検索には、UPnPDeviceFinderのCreateAsyncFind、StartAsyncFindメソッドを用います。
非同期の検索結果を受け取るには、IUPnPDeviceFinderCallbackを継承したインスタンスをCreateAsyncFindメソッドに渡します。
public class DeviceFinder : IUPnPDeviceFinderCallback { int DeviceFindID = 0; UPnPDeviceFinder finder = new UPnPDeviceFinder(); public void Find() { DeviceFindID = finder.CreateAsyncFind("upnp:rootdevice", 0, this); finder.StartAsyncFind(DeviceFindID); } #region IUPnPDeviceFinderCallback public void DeviceAdded(int lFindData, UPnPDevice pDevice) { // デバイスを発見 Marshal.ReleaseComObject(pDevice); } public void DeviceRemoved(int lFindData, string bstrUDN) { // デバイスが削除 } public void SearchComplete(int lFindData) { // 検索完了 } #endregion }
検索されたデバイスはCOMオブジェクトです。
使用後、Marshal.ReleaseComObjectにて解放する必要があります。
また、非同期の場合、通知のCallback終了後、Marshal.ReleaseComObjectにて、解放していない場合、
デバッグ時、DisconnectedContext例外が発生します。
非同期検索の場合、検索完了通知を受け取った後も、デバイスの追加、削除に対して、Callbackが発生します。
終了する場合は、UPnPDeviceFinder.CancelAsyncFindメソッドを呼び出し終了させます。
とりあえず、今回はここまで!