我正在尝试注册一个新的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
。它验证我的服务
答案 0 :(得分:1)
你快速找到了XML标题。这已经写好了:
如果您发布的设备XML真的完整,那么您就缺少XML 标题: 这不仅对于UPnP范围是强制性的,而且对于一般的XML也是强制性的。
如果你的帖子没有完成并且你有标题,我会先省略所有OPTIONAL元素。请忽略serviceList
,presentationURL
,UPC
,serialNumber
以及更多内容。如果你不知道,mandatory spec is here。在我的头脑中,我认为UDN也有一个强制格式(从uuid:
开始),但你已经把代码留在你的帖子中,而不是结果字符串,所以我不知道你是不是做得对。
答案 1 :(得分:1)
COM对象progid必须对应于真实的东西,即:“Test1”必须是在当前注册表中注册的有效COM对象,才能使RegisterDevice调用成功。