2

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ですが、列挙型はサービスをフェッチしません。可変フェッチは常に0を返します。

Media Player UPnPデバイスのクエリがある場合、利用可能なサービスが返されました。

SCPD xmlファイルに示されているようにサービスを返さないUPnPデバイスの何が問題になっていますか?

デバイスを登録すると、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として返します。

4

2 に答える 2

2

SCPDドキュメントはXML宣言を追加する必要があります。例えば:<?xml version="1.0"?>

<?xml version="1.0"?>
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
...
</scpd>
于 2012-06-14T03:11:23.893 に答える
1

XMLをデバイスおよびサービスXSDに対して検証しましたが、問題はありません。実行中のSwitchPowerデバイスをIntelDeviceSpyなどの外部ツールでチェックして SCPDが実際にデバイスによって提供されているかどうかを確認することをお勧めします。SCPDURLスラッシュが付加されていないのではないかと少し疑っています。DeviceArchitectureによると、「デバイスの説明が配置されているURLに相対的である必要があります」ので、スラッシュで始まらない場合は、面白いURLが作成される可能性があります。そうすれば、実際にサービスを取得できますが(デバイスの説明に記載されているため)、サービスに関する情報を取得できないため、何らかの無効な初期化を取得する可能性があります。ただの理論。これはすべて、私が何も知らないIUPnP*の実装に依存します。

第二に、SwitchPowerには、SCPDで指定していないいくつかの必須機能があります。しかし、(まだ)標準的な方法でサービスにアクセスしようとしていない限り、それは問題ではないかもしれません。

于 2012-06-13T14:54:50.187 に答える