uPnP端⼝映射
处于内⽹的机器,因为没有⼀个公有的Ip,外⾯是⽆法主动连接到内⽹的设备。如果希望外⾯可以连接到处于内⽹的指定设备。UPNP端⼝映射是⼀个较简易的⽅案。当然这并不是唯⼀⽅案,穿透和转发也是⼀个较普遍的⽅式,本⽂只讨论UPNP端⼝映射的实现⽅式。UPNP端⼝映射将⼀个外部端⼝映射到⼀个【内⽹Ip:端⼝】,当然也指明了使⽤的协议是UDP,TCP,还是此映射同时适应UDP和TCP。
UPNP使⽤的常⽤命令:
"GetStatusInfo",
"GetExternalIPAddress",
"AddPortMapping",
"GetSpecificPortMappingEntry",
1. 建⽴UDP socket,并绑定到⼀个⾃定的端⼝
2、通过UDP发送组播包:M-search,端⼝1900,包的内容如下所⽰
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
MAN: "ssdp:discover"
MX: 2
3、接收M-search的回应,并做相应的处理
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=100
DATE: Thu, 01 Jan 1970 21:39:02 GMT
EXT:
LOCATION: 192.168.1.1:l
SERVER: Mercury Router MR804 Router, UPnP/1.0
ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
USN: uuid:6ec73f58-1dd2-11b2-9465-e6838914e4d9::urn:schemas-upnp-org:device:InternetGatewayDevice:1
1》获取path(lacation) ,此为: /l                                        #path#
端⼝为: 1900 (有些路由并不⼀定是UPNP的端⼝1900)          #ServerPort#
ip:192.168.1.1 (有时候我们的内⽹中可能存在多个路由,并且都开启了upnp服务,这时候我们要判断哪⼀个才是⽹关路由,并且只处理⽹关路由的回应)
2》获取ST,此为:urn:schemas-upnp-org:device:InternetGatewayDevice:1        #ST#
4、建⽴tcp连接,--》【⽹关:ServerPort】
注意:有些路由不⽀持keep-alive特性,做每⼀次交互都做⼀次连接
5、获取path位置的xml数据:
GET /l HTTP/1.1
Host: 192.168.1.1:1900
Connection: Close
User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
6、接收并分析得到的xml数据
HTTP/1.1 200 OK
CONTENT-LENGTH: 2733
CONTENT-TYPE: text/xml
DATE: Thu, 01 Jan 1970 21:39:02 GMT
LAST-MODIFIED: Tue, 28 Oct 2003 08:46:08 GMT
SERVER: Mercury Router MR804 Router, UPnP/1.0
CONNECTION: close
<?xml version="1.0"?>
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<URLBase></URLBase>
<device>
<deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>
<presentationURL>192.168.1.1:80      </presentationURL>
<friendlyName            >Mercury Router MR804</friendlyName>
<manufacturer                        >Mercury</manufacturer>
<manufacturerURL    >urycom</manufacturerURL>
<modelDescription                      >MR804 8.0</modelDescription>
<modelName                          >MR804</modelName>
<modelNumber                            >8.0</modelNumber>
<UDN>uuid:6ec73f58-1dd2-11b2-9465-e6838914e4d9</UDN>
<UPC>123456789001</UPC>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType>
<serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId>
<controlURL>/l3f</controlURL>
<eventSubURL>/l3f</eventSubURL>
<SCPDURL>/l</SCPDURL>
</service>
</serviceList>
<deviceList>
<device>
<deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>
<friendlyName>WAN Device</friendlyName>
<manufacturer                        >Mercury</manufacturer>
<manufacturerURL    >urycom</manufacturerURL>
<modelDescription>WAN Device</modelDescription>
<modelName>WAN Device</modelName>
<modelNumber>1</modelNumber>
<modelURL></modelURL>
<serialNumber>12345678900001</serialNumber>
<UDN>uuid:80104052-1dd2-11b2-a699-e6838914e4d9</UDN>
<UPC>123456789001</UPC>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
<serviceId>urn:upnp-org:serviceId:WANCommonInterfaceConfig</serviceId>
<controlURL>/ifc</controlURL>
<eventSubURL>/ifc</eventSubURL>
<SCPDURL>/l</SCPDURL>
</service>
</serviceList>
<deviceList>
<device>
<deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>
<friendlyName>WAN Connection Device</friendlyName>
<manufacturer                        >Mercury</manufacturer>
<manufacturerURL    >urycom</manufacturerURL>
<modelDescription>WAN Connection Device</modelDescription>
<modelName>WAN Connection Device</modelName>
<modelNumber>1</modelNumber>
<modelURL></modelURL>
<serialNumber>12345678900001</serialNumber>
<UDN>uuid:8c99e7b0-1dd2-11b2-8291-e6838914e4d9</UDN>
<UPC>123456789001</UPC>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>
<serviceId>urn:upnp-org:serviceId:WANIPConnection</serviceId>
<controlURL>/ipc</controlURL>
<eventSubURL>/ipc</eventSubURL>
<SCPDURL>/l</SCPDURL>
</service>
</serviceList>
</device>
</deviceList>
</device>
</deviceList>
</device>
</root>
获取端⼝映射服务<serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>的控制路径<controlURL>:/ipc                #ControlUrl#
7、发送获取外⽹IP的命令请求:GetExternalIPAddress
POST /ipc HTTP/1.1
Host: 192.168.1.1:1900
User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
Content-Length: 285
Content-Type: text/xml
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"
Connection: Close
Cache-Control: no-cache
Pragma: no-cache
<?xml version="1.0"?>
<s:Envelope xmlns:s="/soap/envelope/" s:encodingStyle="/soap/encoding/">
<s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:GetExternalIPAddress></s:Body> </s:Envelope>
8、分析接收数据
HTTP/1.1 200 OK
CONNECTION: close
SERVER: Mercury Router MR804 Router, UPnP/1.0
CONTENT-LENGTH: 404
CONTENT-TYPE: text/xml; charset="utf-8"
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" SOAP-
ENV:encodingStyle="/soap/encoding/">
<SOAP-ENV:Body>
<u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewExternalIPAddress>113.119.126.148</NewExternalIPAddress></u:GetExternalIPAddressResponse></SOAP-ENV:Body>
</SOAP-ENV:Envelope>
解析得到NewExternalIPAddress标签中的外⽹ip:113.119.126.148
9、发送命令获取指定的外部端⼝的详细信息{内部端⼝,ip,协议,外部端⼝,。。。}
使⽤命令GetSpecificPortMappingEntry,并在NewExternalPort指定要查询的外部端⼝
POST /ipc HTTP/1.1
Host: 192.168.1.1:1900
User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
Content-Length: 399
Content-Type: text/xml
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#GetSpecificPortMappingEntry"
Connection: Close
Cache-Control: no-cache
Pragma: no-cache
<?xml version="1.0"?>
<s:Envelope xmlns:s="/soap/envelope/" s:encodingStyle="/soap/encoding/">
<s:Body><u:GetSpecificPortMappingEntry xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost>
</NewRemoteHost><NewExternalPort>5500</NewExternalPort><NewProtocol>TCP</NewProtocol></u:GetSpecificPortMappingEntry> </s:Body></s:Envelope>
10、接收数据并并分析指定的端⼝有没有被映射
HTTP/1.1 200 OK
CONNECTION: close
SERVER: Mercury Router MR804 Router, UPnP/1.0
CONTENT-LENGTH: 574
CONTENT-TYPE: text/xml; charset="utf-8"
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" SOAP-
ENV:encodingStyle="/soap/encoding/">
<SOAP-ENV:Body>
<u:GetSpecificPortMappingEntryResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewInternalPort>80</NewInternalPort><NewInternalClient>192.168.1.83</NewInternalClient><NewEnabled>1</NewEnabled>
<NewPortMappingDescription>JUAN UPNP</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration>
</u:GetSpecificPortMappingEntryResponse></SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如上所⽰:外部端⼝5500已经做了映射,映射到{192.168.1.83:80,TCP}
1.1》映射到期望的客户端
service fault
1.2》没有映射到期望的客户端,如映射到别的ip
2》未映射,会返回500错误:HTTP/1.0 500 Internal Server Error
HTTP/1.1 500 Internal Server Error
CONTENT-LENGTH: 481
CONTENT-TYPE: text/xml; charset="utf-8"
DATE: Thu, 01 Jan 1970 00:00:02 GMT
EXT:
SERVER: Mercury Router MR804 Router, UPnP/1.0
<SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" SOAP-
ENV:encodingStyle="/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:schemas-upnp-org:control-1-0">
<errorCode>402</errorCode>
<errorDescription>Invalid ExternalPort</errorDescription>
</UPnPError>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如果已经做了期望的映射,则进⼊等待下⼀轮的更新
否则做端⼝映射
11、发送命令添加端⼝映射:
POST /ipc HTTP/1.1
Host: 192.168.1.1:1900
User-Agent: MSWindows/6.1.7601, UPnP/1.0, MiniUPnPc/1.6
Content-Length: 589
Content-Type: text/xml
SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#AddPortMapping"
Connection: Close
Cache-Control: no-cache
Pragma: no-cache
<?xml version="1.0"?>
<s:Envelope xmlns:s="/soap/envelope/" s:encodingStyle="/soap/encoding/">
<s:Body><u:AddPortMapping xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"><NewRemoteHost></NewRemoteHost> <NewExternalPort>5500</NewExternalPort><NewProtocol>TCP</NewProtocol><NewInternalPort>80</NewInternalPort>
<NewInternalClient>192.168.1.83</NewInternalClient><NewEnabled>1</NewEnabled><NewPortMappingDescription>JUAN
UPNP</NewPortMappingDescription><NewLeaseDuration>0</NewLeaseDuration></u:AddPortMapping></s:Body></s:Envelope> 12、接收并分析是否映射成功:
HTTP/1.1 200 OK
CONNECTION: close
SERVER: Mercury Router MR804 Router, UPnP/1.0
CONTENT-LENGTH: 332
CONTENT-TYPE: text/xml; charset="utf-8"
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="/soap/envelope/" SOAP-
ENV:encodingStyle="/soap/encoding/">
<SOAP-ENV:Body>
<u:AddPortMappingResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:AddPortMappingResponse></SOAP-ENV:Body>
</SOAP-ENV:Envelope>
返回HTTP/1.1 200 OK,可见操作成功,进⼊等待下⼀轮的更新
【转】blog.csdn/swanabin/article/details/52074193

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。