文章开始之前让我们设想下面的几个情形:我们在办公室内就能访问到生产车间的网络摄像机,而无需到监控室查看生产情况;在下班之前,或在回去的路上,就可以先打开家里的空调器和厨房设备,等进入家门,立刻就是一个温度宜人的环境――厨房里的饭也做好了;我们想在电视机上回味一下几天前在景区拍的照片,把相机或者DV联网就可以了,无需再去拷贝。工作生活都如此方便,将是一个很惬意的事情。
实现这些场景的网络设备都要基于一种叫端口映射的网络技术。端口映射就是路由器将外网某一个端口与内网中某个设备的IP地址和端口号建立起一一对应关系。内网主动访问外网时,路由器主动建立了映射关系,内外网间就可以通信。但是外网要主动访问内网是不可行的,因为不知道内网的设备IP和端口,只能和路由器外网通信。路由器可以进行手动配置端口映射,但是便携式设备经常移动,内网的IP地址也是不是固定的,每次使用都要手动配置路由器显然是个麻烦的事情。本文就为你讲解如何使用UPnP协议实现网络设备自动配置路由器进行端口映射。
UPnP(Universal Plug and Play,即插即用)是各种各样的智能设备、无线设备和个人电脑等实现遍布全球的对等网络连接(P2P)的结构。使用UPnP达到的效果是任何设备一旦连接上网络,所有在网络上的设备马上就能知道有新设备加入,这些设备彼此之间能互相通信,更能直接使用或者控制它,一切都不需要人工设置。
1.1 UPnP结构
服务、设备和控制点是UPnP网络的基本组件,如图1:
图 1 UPnP组件图
1.2 UPnP工作流程
UPnP定义了设备之间、设备和控制点、控制点之间通信的协议。完整的UPnP有设备寻址、设备发现、设备描述、设备控制、事件通知和基于HTML的描述等几部分构成。UPnP协议最底层是TCP/IP协议,UPnP实现的工作流程如图2所示:
图2 UPnP实现的工作流程
寻址:就是找个可用IP地址。一般都采用DHCP服务,使设备自动得到一个IP地址。
发现:加入到网络中,设备会定期的以组播的方式表明自身的存在以及告知(Advertise)它提供的服务;控制点则是网络中广播search packets来发现具有某些服务的设备,具有该服务的设备以单播的方式应答。
描述:控制点可以从发现消息中得到设备描述的URL(可以认为是浏览器地址),通过URL取回设备描述的信息。
控制、事件和展示则是控制点获取描述之后进行的各种通信交互。其中控制是控制点对设备进行的操作;事件为设备向控制点定期发送其感兴趣的信息,展示可以认为是设备的一个功能,它给控制点一个URL,可以登录到设备的网页服务器。
2.1 实验硬件平台和实验目的
通过以上讲解,相信大家对UPnP也有一定认识了,下面就让我们开始我们实验之旅。我们选用的实验平台为WIZnet W5500EVB,它使用USB口进行供电和调试,单片机为STM32F103RCT6,网络芯片为WIZnet硬件TCP/IP的以太网芯片W5500。
我们的实验目的就是让W5500(Control Point)控制路由器(Device)执行端口映射服务(Service),让外网中的PC2可以与内网中的W5500EVB板建立连接。如图3所示 PC2往路由器36.36.141.53:12222 发送的信息,将被转发到内网192.168.1.110:5000。
图3端口映射网络图
2.2 UPnP自动端口映射软件实现流程
本文中W5500将作为控制点的角色出现,并不需要实现展示的功能,在UPnP协议上仅实现了Search的过程,对网络中的Advertise消息不做处理。下面让我看看程序是如何实现的,首先看一下整个程序流程图如图4,对整个程序有个大致的了解:
图4 主程序流程图
如图所示:
程序首先进行初始化,初始化CPU资源和W5500然后使用DHCP协议自动获取IP,如果获取失败就设定为固定IP,DHCP的过程在此不再详细介绍。
获取IP地址后,先使用SSDP发现设备。W5500打开本地一个socket,再使用UDP组播地址(255.255.255.255)发送SSDP M-SEARCH信息搜索在相同子网中的IGD(Internet Gateway Device),设备收到SSDP M-SEARCH信息后会回复数据包。如图5 所示:
图5发送SSDP广播包和收到回复信息
通过解析收到数据包我们可以得到:LOCATION:设备描述文件的URL。通过Location信息,我们能够获得IGD的IP地址和端口号。利用这个IP地址和端口号生成HTTP GET Header,W5500重新打开一个Socket,然后再将其发送给IGD来获取IGD的服务描述。当IGD接收到HTTP GET Header后,IGD将会让W5500_Control_Piont获知它的设备描述和服务描述。发送的数据包如图6。
图6还显示了设备回复的部分信息,从中我们可以看到设备描述和服务描述,WANIPConnection对应端口映射服务,可以看到该路由设备有该项服务。在WANIPConnection服务描述中可以得到Control URL和eventSubURL,一个用来控制,一个用来订阅。
图6发送获取描述单播包和收到的回复信息
执行完上面的发现设备后在串口上为用户提供了一个菜单页面,通过在菜单中输入命令,我们可以交互添加端口和删除端口。
首先是添加端口,利用IGD的IP地址、端口号以及控制URL来完成XML,然后通过HTTP POST method-basedSOAP执行AddPortMapping操作。其执行过程如图7流程图所示:
图7 AddPortProcess()函数流程图
在SOAP描述中可以看到ExternalPort、Protocol、InternalPort以及控制点IP地址等信息,如图8 AddPort的报文所示。
IGD在收到这样的控制请求后,会给出一系列应答,如果应答中包含收到“<UDN>uuidAddPort Success!!”后,表明端口映射添加成功。添加端口映射成功后,就可以在外网访问内网中指定IP地址和端口了,如果添加了TCP端口映射,可以建立连接并发送数据测试。
图8 AddPort的报文
删除端口与添加端口格式一样,都是通过HTTP POST method-basedSOAP执行DeletePortMapping操作,只需要ExternalPort和Protocol两个参数即可。在此不再详细叙述,请参考我们的程序代码下载链接:http://pan.baidu.com/s/1roc70
继续阅读:http://www.iwiznet.cn/blog/?p=6990
文章评论(0条评论)
登录后参与讨论