情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

UPnPの利用(1)-概要編-

UPnPとは、IT用語辞典によると、

「家庭内のパソコンや周辺機器、AV機器、電話、家電製品などの機器をネットワークを通じて接続し、相互に機能を提供しあうための技術仕様」

だということです。

この説明では何のことか良く分かりませんが、この仕様に従ってUPnP対応機器(ルータ、プリンタ、スキャナetc)にアクセスすることで、その機器の様々な機能を利用することが出来ます。

ここでは最も身近だと思われるUPnP対応ルータに対し、色々なことを行わせてみます。


第1回はUPnP対応ルータ利用の手順について説明します。

尚、この記事では.NET Framework2.0以上の使用が前提になっています。


大まかな流れは次のようになります。

①ルータのLAN側IPアドレス(ローカルIPアドレス)を取得する。

②M-SEARCHを送信する。

③応答の内容からルータの詳細情報が格納されているXMLファイルの場所を得る。

④XMLファイルを取得し、controlURLを調べる。

⑤cotrolURLに対してコマンドを送る。


①ルータのLAN側IPアドレス(ローカルIPアドレス)を取得する。

.NETでローカルIPアドレスを取得する方法は幾つか存在します。

折角なので、知っている方法をここで紹介します(他にもあるのかな?他に知ってる人いたら教えて下さい)。


(イ)System.Net.Dnsクラスを使う方法(何故かIronPython)

import clr
from System.Net import *

ipAddresses = Dns.GetHostAddresses("")
for ipAddress in ipAddresses:
    print ipAddress

Dns.GetHostAddressesメソッドに空文字列を渡すとPCに割り当てられているIPアドレスが返ってきます。

実行するとIPアドレスがずらずらと表示されます。

fe80で始まるのは、IPv6のリンクローカルユニキャストアドレスです。

192で始まるのは、IPv4のローカルIPアドレスです。通常はこれを使えば良いでしょう。

*で伏せてあるのは、IPv6のグローバルユニキャストアドレスです。

fe80::1000:3f27:3f57:f4f4%9
fe80::b9c5:ffc2:16b9:7814%8
fe80::5efe:192.168.11.11%10
192.168.11.11
2001::*:****:****:****:****:****:****

(ロ)WMI(Windows Management Instrumentation)を使う方法(何故かこれもIronPython)

System.Management名前空間内に用意されているクラスを使ってWMIの機能にアクセス出来ます。

#参照の追加
import clr
clr.AddReferenceByPartialName("System.Management")
from System.Management import *

# ManagementScopeを作って接続
managementScope = ManagementScope("root\\cimv2")
managementScope.Connect()

#クエリを作って送信・結果取得
objectQuery = ObjectQuery("Select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
managementObjectSearcher = ManagementObjectSearcher(managementScope, objectQuery)
managementObjectCollection = managementObjectSearcher.Get()

#結果表示
for managementObject in managementObjectCollection:
print managementObject.Properties["IPAddress"].Value

結果例。

System.String[]('192.168.11.11', 'fe80::b9c5:ffc2:16b9:7814')

(ハ)System.Net.NetworkInformation名前空間を使用する方法(これはC#)

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var networkInterface in networkInterfaces)
{
    try
    {
        UnicastIPAddressInformationCollection unicastIPAddressInformationCollection = networkInterface.GetIPProperties().UnicastAddresses;
        foreach (var unicastIPAddressInformation in unicastIPAddressInformationCollection)
            Console.WriteLine(unicastIPAddressInformation.Address.ToString());
        Console.WriteLine();
    }
    catch
    {
        Console.WriteLine("エラー発生!");
    }
}

②M-SEARCHを送信する。

マルチキャストを使って下のようなメッセージを239.255.255.250:1900に向けて送信します。

サービス名はルータによってurn:schemas-upnp-org:service:WANPPPConnection:1urn:schemas-upnp-org:service:WANIPConnection:1の2つがあるようなので両方試してみる必要があります。

★M-SEARCH(WANPPPConnection)

M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 3
ST: urn:schemas-upnp-org:service:WANPPPConnection:1

★M-SEARCH(WANIPConnection)

M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 3
ST: urn:schemas-upnp-org:service:WANIPConnection:1

③応答の内容からルータの詳細情報が格納されているXMLファイルの場所を得る。

M-SEARCHを送信すると以下のような応答が返ってきます。

LOCATIONの項に書かれているのがルータの詳細が載っているXMLファイルのURLです。

★応答

HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1800
DATE: Wed, 13 Apr 2005 04:43:28 GMT
EXT:
LOCATION: http://192.168.11.1:49152/gatedesc.xml
SERVER: Linux/2.4.25, UPnP/1.0, Intel SDK for UPnP devices /1.2
ST: upnp:rootdevice
USN: uuid:75802409-bccb-40e7-8e6c-fa095ecce13e::upnp:rootdevice

④XMLファイルを取得し、controlURLを調べる。

XMLファイルは次のようになっています。

この中からurn:schemas-upnp-org:service:WANPPPConnection:1またはurn:schemas-upnp-org:service:WANIPConnection:1を探します。

そのサービス項目の中にあるcontrolURLタグの内容がコマンド(SOAP)を送信する場所になります。

★XMLファイルの例

<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
         <specVersion>
                   <major>1</major>
                   <minor>0</minor>
         </specVersion>
         <device>
                  <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>
                   <friendlyName>BUFFALO WHR-HP-AMPG</friendlyName>
                   <manufacturer>BUFFALO INC.</manufacturer>
                   <manufacturerURL>http://buffalo.co.jp/</manufacturerURL>
                   <modelName>WHR-HP-AMPG</modelName>
                   <modelNumber>F/W Version 1.32</modelNumber>
                   <modelURL>http://192.168.11.1/</modelURL>
                   <modelDescription>BUFFALO WHR-HP-AMPG Broadband Router</modelDescription>
                   <serialNumber>2006/01/05 21:31:53 JST</serialNumber>
                   <UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN>
                   <iconList>
                            <icon>
                                     <mimetype>image/gif</mimetype>
                                     <width>16</width>
                                     <height>16</height>
                                     <depth>8</depth>
                                     <url>/ligd.gif</url>
                            </icon>
                   </iconList>
                   <serviceList>
                        <service>
                                <serviceType>urn:schemas-microsoft-com:service:OSInfo:1</serviceType>
                                <serviceId>urn:microsoft-com:serviceId:OSInfo1</serviceId>
                                 <controlURL>/upnp/control/OSInfo1</controlURL>
                                <eventSubURL>/upnp/event/OSInfo1</eventSubURL>
                                     <SCPDURL>/gateinfoSCPD.xml</SCPDURL>
                        </service>
                </serviceList>
                   <deviceList>
                            <device>
                                     <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>
                                     <friendlyName>WANDevice</friendlyName>
                                     <manufacturer>BUFFALO INC.</manufacturer>
                                     <manufacturerURL>http://buffalo.co.jp/</manufacturerURL>
                                     <modelDescription>WANDevice on WHR-HP-AMPG</modelDescription>
                                     <modelName>WHR-HP-AMPG</modelName>
                                     <modelNumber>1.32</modelNumber>
                                     <modelURL>http://192.168.11.1/</modelURL>
                                     <serialNumber>2006/01/05 21:31:53 JST</serialNumber>
                                     <UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN>
                                     <UPC>WHR-HP-AMPG</UPC>
                                     <serviceList>
                                               <service>
                                                        <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
                                                        <serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId>
                                                        <controlURL>/upnp/control/WANCommonIFC1</controlURL>
                                                        <eventSubURL>/upnp/control/WANCommonIFC1</eventSubURL>
                                                        <SCPDURL>/gateicfgSCPD.xml</SCPDURL>
                                               </service>
                                     </serviceList>
                                     <deviceList>
                                               <device>
                                                        <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>
                                                        <friendlyName>WANConnectionDevice</friendlyName>
                                                        <manufacturer>BUFFALO INC.</manufacturer>
                                                        <manufacturerURL>http://buffalo.co.jp/</manufacturerURL>
                                                        <modelDescription>WanConnectionDevice on WHR-HP-AMPG</modelDescription>
                                                        <modelName>WHR-HP-AMPG</modelName>
                                                        <modelNumber>1.32</modelNumber>
                                                        <modelURL>http://192.168.11.1/</modelURL>
                                                        <serialNumber>2006/01/05 21:31:53 JST</serialNumber>
                                                        <UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN>
                                                        <UPC>WHR-HP-AMPG</UPC>
                                                        <serviceList>
                                                                 <service>
                                                                          <serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>
                                                                          <serviceId>urn:upnp-org:serviceId:WANIPConn1</serviceId>
                                                                          <controlURL>/upnp/control/WANIPConn1</controlURL>
                                                                          <eventSubURL>/upnp/control/WANIPConn1</eventSubURL>
                                                                          <SCPDURL>/gateconnSCPD.xml</SCPDURL>
                                                                 </service>
                                                        </serviceList>
                                               </device>
                                     </deviceList>
                            </device>
                   </deviceList>
         <presentationURL>http://192.168.11.1/</presentationURL>
         </device>
</root>

cotrolURLに対してコマンドを送る。

最後にcontrolURLに対してコマンドを送信します。

例えば、WAN側IPアドレス(グローバルIPアドレス)を取得したい場合のコマンドはGetExternalIPAddressになります。このコマンドにはパラメータはありません。

他にも幾つかコマンドが存在しますが、それはSCPDURLタグの中に書かれたURLを参照すれば分かります。

コマンドはSOAPの形で送信します。以下のようになります。


GetExternalIPAddressの場合

POST /upnp/control/WANIPConn1 HTTP/1.1
Host: 192.168.11.1:49152
CONTENT-LENGTH: 304
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
        <u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
        </u:GetExternalIPAddress>
    </s:Body>
</s:Envelope>

応答の中にWAN側IPアドレス(グローバルIPアドレス)が格納されている筈です(伏字しています)。

NewExternalIPAddressの場合

HTTP/1.1 200 OK
CONTENT-LENGTH: 339
CONTENT-TYPE: text/xml; charset="utf-8"
DATE: Wed, 13 Apr 2005 05:05:39 GMT
EXT:
SERVER: Linux/2.4.25, UPnP/1.0, Intel SDK for UPnP devices /1.2

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
        <u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
            <NewExternalIPAddress>***.***.**.**</NewExternalIPAddress>
        </u:GetExternalIPAddressResponse>
</s:Body> </s:Envelope>

(続く...)

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-C#