我正在嘗試註冊新的UPNP設備(並試圖瞭解它是如何工作的)。XML用於註冊新的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>@@[email protected]@</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 \服務.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("@@[email protected]@", "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>@@[email protected]@</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工作室命令提示符:validatesd.exe
。它驗證了我的服務
請停止編輯您的文章離開原標題。現在它甚至不提及XML。您不再有XML問題,但使用Win32 IUPnP特定功能參數。我的回答是回答最初的問題。 –
@PavelZdenek我認爲它與XML內容有關,因爲我沒有看到我的c#調用可能超出範圍。在所有情況下,我很抱歉,我看到有點太遲了,我沒有發佈我遇到的最後一個錯誤。 – J4N
好吧,我明白了。然後嘗試做我在答案中提出的建議。刪除所有不需要的東西,直到它工作,然後加回去。最重要的是,你不需要「服務」。 –