1

新しい UPNP デバイスを登録しようとしています (ちなみに、それがどのように機能するかを理解しようとしています)。

今のところ、単純なテストを作成して、何かを機能させ、そこから構築しようとしています。

現在、UPnP デバイス ホストを使用しています。次のコードがあります。

IUPnPRegistrar registrar = (IUPnPRegistrar)new UPnPRegistrarClass();
String description = GetDescription();
String path = GetPath();
registrar.RegisterDevice(description, "Test1", "Init", "Container", path, 900);

GetDescription メソッドはこれを返します。

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <device>
        <UDN>@@UDN@@</UDN>
        <friendlyName>Test device</friendlyName>
        <deviceType>urn:schemas-upnp-org:device:XmsHostService:1</deviceType>
        <manufacturer>Test</manufacturer>
        <manufacturerURL>http://www.test.com</manufacturerURL>
        <modelName>Test model name</modelName>
        <modelNumber>0.1</modelNumber>
        <modelDescription>Test device</modelDescription>
        <modelURL>http://www.test.com/test-model-url</modelURL>
        <serialNumber>0000001</serialNumber>
        <UPC>00000-00001</UPC>
        <serviceList>
            <service>
                <serviceType>urn:schemas-upnp-org:service:XmsHost:1</serviceType>
                <serviceId>urn:upnp-org:serviceId:XmsHost</serviceId>
                <controlURL></controlURL>
                <eventSubURL></eventSubURL>
                <SCPDURL>serviceDescription.xml</SCPDURL>
            </service>
        </serviceList>
    </device>
</root>

私の C:\upnphost\service.xml には次のコードが含まれています。

<?xml version="1.0" encoding="utf-8"?>
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <actionList>
        <action>
            <name>GetPort</name>
            <argumentList>
                <argument>
                    <name>_ReturnValue</name>
                    <direction>out</direction>
                    <retval />
                    <relatedStateVariable>A_ARG_TYPE_GetPort_RetType</relatedStateVariable>
                </argument>
            </argumentList>
        </action>
    </actionList>
    <serviceStateTable>
        <stateVariable sendEvents="no">
            <name>A_ARG_TYPE_GetPort_RetType</name>
            <dataType>ui4</dataType>
        </stateVariable>
        <stateVariable sendEvents="no">
            <name>Port</name>
            <dataType>ui4</dataType>
        </stateVariable>
    </serviceStateTable>
</scpd>

まず、この xml コードは正しく見えますか?

登録デバイスを呼び出すと、次の例外が発生しました。

    System.ArgumentException was unhandled
  Message=Value does not fall within the expected range.
  Source=UPnPHostLib
  StackTrace:
       at UPnPHostLib.IUPnPRegistrar.RegisterDevice(String bstrXMLDesc, String bstrProgIDDeviceControlClass, String bstrInitString, String bstrContainerId, String bstrResourcePath, Int32 nLifeTime)
       at UPnPHosterTester.Hoster.Start() in E:\Dev\Discovery\XMS_SW_Discovery_B\Solution\UPnPHosterTester\Hoster.cs:line 32
       at UPnPHosterTester.Program.Main(String[] args) in E:\Dev\Discovery\XMS_SW_Discovery_B\Solution\UPnPHosterTester\Program.cs:line 19
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

しかし、何が間違っているのかわかりません。900 は受け入れられる最小値です。その他のリンクされた質問: IUPnPDeviceControl インターフェイスを実装し、Test1 の代わりに以前のコードに挿入する必要があることはわかっていますが、GetServiceObject で何を返すべきかわかりません

編集 GetDescription メソッドは次のとおりです。

private string GetDescription()
{
    string xml = File.OpenText("DeviceDescription.xml").ReadToEnd();
    xml = xml.Replace("@@UDN@@", "uuid:" +Guid.NewGuid().ToString());
    return xml;
}

EDIT 2 必須ではないすべてのプロパティを削除するように推奨されているように、私は試しました:

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
    <specVersion>
        <major>1</major>
        <minor>0</minor>
    </specVersion>
    <device>
        <UDN>@@UDN@@</UDN>
        <friendlyName>Test device</friendlyName>
        <deviceType>urn:test-com:device:HostDevice:1</deviceType>
        <manufacturer>Test</manufacturer>
        <modelName>Test model name</modelName>
    </device>
</root>

しかし、私はまだまったく同じエラーがあります

編集3 サービスxmlファイルの適切な構造をチェックするユーティリティがあることがわかりました(デバイスではありません:()ここ: http://msdn.microsoft.com/en-us/library/aa381938(v=vs .85).aspx VS studio コマンド プロンプトで使用できます: validatesd.exe. 私のサービスを検証します

4

2 に答える 2

1

XML ヘッダーはすぐにわかりました。これはすでに書かれています:

投稿されたデバイス XML が本当に完全である場合、XML ヘッダーがありません。これは UPnP スコープだけでなく、XML 一般に必須です。

投稿が完了しておらず、ヘッダーがある場合は、OPTIONAL 要素をすべて除外することから始めます。、、、、およびおそらくそれ以上は省略serviceListします。ご存じない場合は、必須の仕様はこちら. 頭の中で、UDNにも必須の形式(で始まる)があると思いますが、結果の文字列ではなくコードを投稿に残したので、正しく実行しているかどうかわかりません。presentationURLUPCserialNumberuuid:

于 2013-02-06T12:43:45.210 に答える
1

COM オブジェクトの progid は実際のものに対応している必要があります。つまり、「Test1」は、RegisterDevice 呼び出しが成功するために、現在のレジストリに登録されている有効な COM オブジェクトである必要があります。

于 2013-02-06T14:21:13.573 に答える