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メソッドを呼び出し終了させます。

とりあえず、今回はここまで!