UPNP 相关资料(转)
UPNP的全称是 Universal plug-and-play( 通用即插即用).UPnP 是针对智能家电、无线设备以及各种外观尺寸的个人电脑的普遍对等(peer-to-peer)网络连接而设计的一种架构。它旨在为家庭、小型企业、公共场所中或连接到互联网的ad-hoc 网或未管理网络提供易于使用、灵活且基于标准的连接。 (引自 这里 .)
我们这里用到的自动端口映射只是UPNP的一个小应用。按照UPNP的相关规范,UPNP网络的第0步是寻址(获得一个IP地址,在我要解决的问题中这不是一个问题。)
第1步是发现,控制点在网上搜索感兴趣的设备,而设备向网络中的控制点宣告其服务。对于自动端口映射来说就是发现带UPNP功能的路由器。
发现这个过程主要有两步。第一,使用数据报套接字向239.255.255.250:1900,发送一条多播请求,格式如下
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN:"ssdp:discover"
MX:3
ST:UPnP:rootdevice
这个多播请求的含义如下:M-SEARCH SSDP协议定义的搜索请求方法。HOST必须是这个多播地址。MAN的值也必须是"ssdp:discover" 不可少了双引号。MX的含义是最长等待时间,可以自己设置。ST表示search target 搜索目标。我们在这里用找根设备。另外在编程中我们要在每一行后面加上"rn" 表示换行。(详见源码 UPNPNAT.discovery()).
第二步,如果你的网络存在一个UPNP设备的话,为了被找到,设备必须向发送查找请求的多播通道的源 IP 地址与端口发送响应信息。所以你可以从239.255.255.250:1900这个地址接收到响应消息。类似下面的消息。
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=100
DATE: Sun, 15 Jan 2006 06:51:02 GMT
EXT:
LOCATION: http://192.168.14.1:1900/igd.xml
SERVER: TP-LINK Wireless Router WR541G/5, UPnP/1.0
ST: upnp:rootdevice
USN:uuid:upnp-InternetGatewayDevice-192168141678900001::upnp:rootdevice
接下来我们要从里面获得我们要的消息。首先,我们必须找到" 200 OK ",说明没有错误发生,否则一切免谈。接着,我们要找到LOCATION项,获得设备描述URL。(程序中的处理归根到底就是一个子字符的查找。)
到这里,我们的第一步“发现”完成。
第2步是描述。在第1步中我们往往能获得一个设备的描述URL,在第2步中我们要通过一个URL,下载一个XML文件。并从中找到有关设备的类型,服务类型,控制URL,事件触发URL等。
我们同样分两步进行,首先下载设备描述文件。(请看源码中UPNPNAT::get_description()函数)
1.解析描述文件的URL,获得主机(host)、端口(port)、路径(path).(parseUrl函数)
2.连接到host:port (tcp_connect 函数)
3.构造类似
Host: host:port
获得D的"controlUrl"保存在std::string control_url中。
第3步是控制。通过第2步获得的控制URL,通过向其发送控制消息(同样用XML描述)来实现某些功能。对于自动端口映射来说就是查看、增加、删除等。
在这里我先把各种控制信息的格式说明一下。(下面的rn都是表示换行,我输入不了反斜杠。)
- 增加端口映射。 "AddPortMapping"
- "<NewRemoteHost></NewRemoteHost>rn" "<NewExternalPort>ExternalPort</NewExternalPort>rn" "<NewProtocol>Protocol</NewProtocol>rn" "<NewInternalPort>InternalPort</NewInternalPort>n"
"<NewInternalClient>InternalClient</NewInternalClient>rn"
"<NewEnabled>1</NewEnabled>rn"
"<NewPortMappingDescription>PortMappingDescription" "</NewPortMappingDescription>rn"
"<NewLeaseDuration>LeaseDuration</NewLeaseDuration>rn"- 删除端口映射 "DeletePortMapping"
- "<NewRemoteHost></NewRemoteHost>rn" "<NewExternalPort>ExternalPort</NewExternalPort>rn" "<NewProtocol>Protocol</NewProtocol>rn"
- 获得端口映射信息 "GetGenericPortMappingEntry"
- "<NewPortMappingIndex>PortMappingIndex</NewPortMappingIndex>" "<NewRemoteHost></NewRemoteHost>rn" "<NewExternalPort></NewExternalPort>rn" "<NewProtocol></NewProtocol>rn" "<NewInternalPort></NewInternalPort>rn" "<NewInternalClient></NewInternalClient>rn" "<NewEnabled>1</NewEnabled>rn" "<NewPortMappingDescription>" "</NewPortMappingDescription>rn" "<NewLeaseDuration></NewLeaseDuration>rn"
其中斜体部分需要在编程是填入的。ExternalPort 外部端口。InternalPort内部端口。这 两者一般就填映射的端口。Protocal 填TCP或UDP。InterClient 一般就是本地IP地址。PortMappingDescription 填写端口映射的描述,比如什么程序建立了这个端口。LeaseDuration 是映射的持续时间,用0表示不永久。PortMappingIndex 是端口映射索引,路由上第几个映射。
我们再来看下面这个XML文档结构。
"<?xml version="1.0" encoding="utf-8"?>rn"
"<s:Envelope xmlns:s="
""http://schemas.xmlsoap.org/soap/envelope/" "
"s:encodingStyle="
""http://schemas.xmlsoap.org/soap/encoding/">rn"
"<s:Body>rn"
"<u:actionName xmlns:u="serviceType">rn"
"actionParams</u:actionName>rn"
"</s:Body>rn"
"</s:Envelope>rn"
我们在actionName 处填入"AddPortMapping" "DeletePortMapping" "GetGenericPortMappingEntry"。serviceType 处填入设备的服务类型。"urn:schemas-upnp-org:service:WANIPConnection:1"或"urn:schemas-upnp-org:service:WANPPPConnection:1"。actionParams 填入上面的各种控制信息。
最后在前面加上HTTP头。
"POST path HTTP/1.1rn"
"HOST: host:portrn"
"SOAPACTION:"serviceType#actionName"rn"
"CONTENT-TYPE: text/xml ; charset="utf-8"rn"
"Content-Length: contentLength rnrn"
path host port 意思很明显。contentLength面那个XML文档的长度。
然后连接到host:port,发送到整个信息即可完成控制
第4步事件触发和第5步展示在自动端口映射没用用到。有兴趣可以自己看文档。
原文在:http://blog.csdn.net/ydfok/article/details/1527254
UPNP 相关资料(转)相关推荐
- UPNP自动端口映射的实现与路由器UPNP相关资料
UPNP的全称是 Universal plug-and-play( 通用即插即用).UPnP 是针对智能家电.无线设备以及各种外观尺寸的个人电脑的普遍对等(peer-to-peer)网络连接而设计的 ...
- 【camera】自动泊车-视觉车位检测相关资料汇总(论文、数据集、源代码、相关博客、演示demo)(1)
[camera]自动泊车-视觉车位检测相关资料汇总(论文.数据集.源代码.相关博客.演示demo)parking slot detection 论文 2020论文 2019论文 2018论文 2017 ...
- 【radar】毫米波雷达静态障碍物识别及其相关资料(仿真、生成、标定、运动估计、静态障碍物识别)(3)
[radar]毫米波雷达相关资料(毫米波仿真.毫米波生成模型.毫米波标定.毫米波运动估计.毫米波静态障碍物识别)(3) 毫米波标定:多毫米波雷达联合标定.相机和毫米波雷达联合标定.毫米波雷达和激光雷达 ...
- 【radar】毫米波雷达相关资料(文献综述列表、顶会研讨会资料列表、顶会workshops资料列表、工具书、使用手册)(2)
[radar]毫米波雷达相关资料(毫米波雷达文献综述列表.毫米波雷达顶会研讨会资料列表.毫米波雷达顶会workshops资料列表.毫米波雷达工具书.毫米波雷达使用手册)(2) Review Paper ...
- epoll相关资料整理
http://www.cppblog.com/converse/archive/2008/10/13/63928.html epoll相关资料整理 学习epoll有一段时间了,最近终于有一个服务器采用 ...
- 算法工程师面试问题及相关资料集锦(附链接)
来源:专知 本文约9800字,建议阅读20分钟. 本文为你介绍算法工程师面试问题及相关资料集锦,相当全面,值得收藏. 目录 算法工程师 Github.牛客网.知乎.个人博客.微信公众号.其他 机器学习 ...
- 智能车竞赛相关资料获取
TASKING资料和申请说明 在智能车竞赛网站: smartcar.cdstm.cn/index 上载了关于英飞凌单片机开发软件TASKING的相关资料和License获取流程信息.具体从网站下载相关 ...
- 文本处理相关资料整理
github 搜索文本相似度 文本处理实践相关资料,包含文本特征提取(TF-IDF),文本分类,文本聚类,word2vec训练词向量及同义词词林中文词语相似度计算.文档自动摘要,信息抽取,情感分析与观 ...
- 深度学习相关资料总结
FROM:http://blog.csdn.net/chenyusiyuan?viewmode=contents 近这两年里deep learning技术在图像识别和跟踪等方面有很大的突破,是一大研究 ...
最新文章
- 【观点】程序员应知——循序渐进
- 字符串分割split
- Linux下两个进程可以同时打开同一个文件,这时如下描述错误的是:
- java依赖注入上下文_【Java EE】--Contexts and Dependency Injection (上下文與依賴注入)04...
- python 会计专用格式_python-2.7 – 如何使用xlsxwriter将格式应用为“文本”和“会计”...
- magento更新产品状态报错
- 为什么 Dapper 的批量插入比我预期的要慢很多?
- 【BZOJ3932】[CQOI2015]任务查询系统 主席树
- nginx 根证书 服务器证书,Nginx双向证书校验(服务器验证客户端证书)
- 最大 / 小的K个数
- HTML5 学习准备1
- C++ 关于“堆对象和栈对象”
- java nio 2_Java NIO2:NIO概述
- shell 修改文件格式
- 开关稳压集成电路电源
- 基于 Amazon Nitro Enclaves 构建安全的可信执行环境
- 开源网站访问统计系统Piwik的基本使用
- 【Web】HTML(No.06)表格标签经典案例《小说排行榜》
- Windows服务器应该如何保持长时间连接不断开。
- 深度学习平台demo(一)- C#如何调用python文件