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:1
とurn: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>
(続く...)
