我注册了一个UPnP设备:
var o: IUPnPRegistrar;
W: string;
R: HRESULT;
begin
w := TFile.ReadAllText('UPnPDevice_Desc.xml');
o := CoUPnPRegistrar.Create as IUPnPRegistrar;
R := o.RegisterDevice(w, ...);
end;
文件UPnPDevice_Desc.xml:
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<pnpx:X_deviceCategory xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">Other</pnpx:X_deviceCategory>
<!--<pnpx:X_hardwareId xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">Microsoft/SampleDevice/10000/urn:microsoft-com:device:SampleDimmerDevice:1</pnpx:X_hardwareId>-->
<!-- <df:X_containerId xmlns:df="http://schemas.microsoft.com/windows/2008/09/devicefoundation">{8C7B310D-90F8-40D4-B5EA-71D81821DEA6}</df:X_containerId>-->
<deviceType>urn:example-com:device:uPnPDevice:1</deviceType>
<friendlyName>My UPNP Device Hosted by Windows</friendlyName>
<manufacturer>Example Company</manufacturer>
<manufacturerURL>http://www.example.com/</manufacturerURL>
<modelDescription>My UPnP Device</modelDescription>
<modelName>uPnPDevice</modelName>
<modelNumber>1001</modelNumber>
<modelURL>http://www.example.com/</modelURL>
<serialNumber>123456</serialNumber>
<UDN>uuid:RootDevice</UDN>
<UPC>00000-00001</UPC>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:SwitchPower:1</serviceType>
<serviceId>urn:upnp-org:serviceId:SwitchPower:1</serviceId>
<controlURL></controlURL>
<eventSubURL></eventSubURL>
<SCPDURL>UPnPDevice_SCPD.xml</SCPDURL>
</service>
</serviceList>
<presentationURL>DimmerPresentation.htm</presentationURL>
</device>
</root>
文件UPnPDevice_SCPD.xml:
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<actionList>
<action>
<name>MagicOn</name>
</action>
</actionList>
<serviceStateTable>
<stateVariable>
<name>OSMajorVersion</name>
<dataType>i4</dataType>
</stateVariable>
<stateVariable>
<name>OSMinorVersion</name>
<dataType>i4</dataType>
</stateVariable>
<stateVariable>
<name>OSBuildNumber</name>
<dataType>i4</dataType>
</stateVariable>
<stateVariable>
<name>OSMachineName</name>
<dataType>string</dataType>
</stateVariable>
</serviceStateTable>
</scpd>
通过使用IUPnPDeviceFinder或M-SEARCH查找设备,我可以确认UPnP设备已托管在UPnP设备主机服务中。
注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\UPnP Device Host\Description
还包含相应的信息:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\UPnP Device Host\Description\{00BB4949-F3B2-4F5A-B534-C6FE61B71F4E}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\UPnP Device Host\Description\{00BB4949-F3B2-4F5A-B534-C6FE61B71F4E}\Files]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\UPnP Device Host\Description\{00BB4949-F3B2-4F5A-B534-C6FE61B71F4E}\Files\{B11E040A-6858-48BA-B1BD-85B4E8FCBA73}]
"Filename"="M:\\uPNP\\D16\\Win32\\Debug\\UPnPDevice_SCPD.xml"
"Mimetype"="text/xml; charset=\"utf-8\""
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\UPnP Device Host\Description\{00BB4949-F3B2-4F5A-B534-C6FE61B71F4E}\UDN Mappings]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\UPnP Device Host\Description\{00BB4949-F3B2-4F5A-B534-C6FE61B71F4E}\UDN Mappings\uuid:RootDevice]
@="uuid:00bb4949-f3b2-4f5a-b534-c6fe61b71f4e"
使用
查询UPnP设备的服务时var Enum: IEnumVARIANT;
Fetched: Cardinal;
K: OleVariant;
P: IUPnPService;
W: WideString;
D: IUPnPDevice
begin
...
if D.Services.Count > 0 then begin
Enum := D.Services._NewEnum as IEnumVARIANT;
Enum.Reset;
while Enum.Next(1, K, Fetched) = S_OK do begin
P := IDispatch(K) as IUPnPService;
end;
end;
end;
D.Services.Count为1,但Enum不提取任何服务。变量提取始终返回0.
如果我查询了Media Player UPnP设备,它确实返回了可用的服务。
我的UPnP设备有什么问题没有返回SCPD xml文件中指示的服务?
注册设备后,XML说明将更改为:
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<pnpx:X_deviceCategory xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">Other</pnpx:X_deviceCategory>
<!--
<pnpx:X_hardwareId xmlns:pnpx="http://schemas.microsoft.com/windows/pnpx/2005/11">Microsoft/SampleDevice/10000/urn:microsoft-com:device:SampleDimmerDevice:1</pnpx:X_hardwareId>
-->
<!--
<df:X_containerId xmlns:df="http://schemas.microsoft.com/windows/2008/09/devicefoundation">{8C7B310D-90F8-40D4-B5EA-71D81821DEA6}</df:X_containerId>
-->
<deviceType>urn:example-com:device:uPnPDevice:1</deviceType>
<friendlyName>My UPNP Device Hosted by Windows</friendlyName>
<manufacturer>Example Company</manufacturer>
<manufacturerURL>http://www.example.com/</manufacturerURL>
<modelDescription>My UPnP Device</modelDescription>
<modelName>uPnPDevice</modelName>
<modelNumber>1001</modelNumber>
<modelURL>http://www.example.com/</modelURL>
<serialNumber>123456</serialNumber>
<UDN>uuid:9742f52d-f39f-4eaf-9ecf-bb742e9d79e9</UDN>
<UPC>00000-00001</UPC>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:SwitchPower:1</serviceType>
<serviceId>urn:upnp-org:serviceId:SwitchPower:1</serviceId>
<controlURL>
/upnphost/udhisapi.dll?control=uuid:9742f52d-f39f-4eaf-9ecf-bb742e9d79e9+urn:upnp-org:serviceId:SwitchPower:1
</controlURL>
<eventSubURL>
/upnphost/udhisapi.dll?event=uuid:9742f52d-f39f-4eaf-9ecf-bb742e9d79e9+urn:upnp-org:serviceId:SwitchPower:1
</eventSubURL>
<SCPDURL>
/upnphost/udhisapi.dll?content=uuid:40c39217-e93b-4d0a-b5e0-abc582b2a2ed
</SCPDURL>
</service>
</serviceList>
<presentationURL>
/uuid:9742f52d-f39f-4eaf-9ecf-bb742e9d79e9/DimmerPresentation.htm?/upnphost/udhisapi.dll?content=uuid:9742f52d-f39f-4eaf-9ecf-bb742e9d79e9+uuid:9742f52d-f39f-4eaf-9ecf-bb742e9d79e9
</presentationURL>
</device>
</root>
请注意,controlURL,eventSubURL和SCPDURL已更改。访问
http://localhost:2869/upnphost/udhisapi.dll?content=uuid:40c39217-e93b-4d0a-b5e0-abc582b2a2ed
将确切内容作为文件UPnPDevice_SCPD.xml返回。
答案 0 :(得分:2)
SCPD文档必须添加XML declration。例如:<?xml version="1.0"?>
<?xml version="1.0"?>
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
...
</scpd>
答案 1 :(得分:1)
我已针对设备和服务XSD验证了您的XML,但它们没有问题。我建议使用外部工具Intel Device Spy检查正在运行的SwitchPower设备,以确定您的SCPD是否真的由设备提供服务。我有点怀疑SCPDURL
没有加斜杠。根据DeviceArchitecture,它“必须相对于设备描述所在的URL”,因此如果它不是以斜杠开头,则可能会构造一些有趣的URL。这样你确实得到了一个服务(因为设备描述提到它)但是它无法获得任何关于它的信息,所以你可能会得到某种无效的初始化。只是一个理论。这一切都取决于我一无所知的那些IUPnP *实现。
第二个想法,SwitchPower有几个REQUIRED函数,你没有在SCPD中指定。但只要您(还)尝试以标准方式访问服务,这可能不是问题。