XML用于注册新的UPNP设备

本文关键字:UPNP 设备 用于 注册 XML | 更新日期: 2023-09-27 17:57:49

我正在尝试注册一个新的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;
}

编辑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。它验证了我的服务

XML用于注册新的UPNP设备

COM对象progid必须与真实对象相对应,即:"Test1"必须是在当前注册表中注册的有效COM对象,RegisterDevice调用才能成功。

您很快就找到了XML头。这已经写好了:

如果您发布的设备XML真的是完整的,那么您就缺少XML页眉:这不仅对于UPnP作用域是强制性的,而且对于一般的XML也是强制性的。

如果你的帖子不完整,并且你有标题,我会从省略所有可选元素开始。去掉serviceListpresentationURLUPCserialNumber,甚至更多。如果你不知道,强制性规范在这里。在我的脑海中,我认为UDN也有一个强制性的格式(从uuid:开始),但你在帖子中留下了代码,而不是结果字符串,所以我不知道你做得是否正确。