文章开始之前让我们设想下面的几个情形:我们在办公室内就能访问到生产车间的网络摄像机,而无需到监控室查看生产情况;在下班之前,或在回去的路上,就可以先打开家里的空调器和厨房设备,等进入家门,立刻就是一个温度宜人的环境――厨房里的饭也做好了;我们想在电视机上回味一下几天前在景区拍的照片,把相机或者DV联网就可以了,无需再去拷贝。工作生活都如此方便,将是一个很惬意的事情。
实现这些场景的网络设备都要基于一种叫端口映射的网络技术。端口映射就是路由器将外网某一个端口与内网中某个设备的IP地址和端口号建立起一一对应关系。内网主动访问外网时,路由器主动建立了映射关系,内外网间就可以通信。但是外网要主动访问内网是不可行的,因为不知道内网的设备IP和端口,只能和路由器外网通信。路由器可以进行手动配置端口映射,但是便携式设备经常移动,内网的IP地址也是不是固定的,每次使用都要手动配置路由器显然是个麻烦的事情。本文就为你讲解如何使用UPnP协议实现网络设备自动配置路由器进行端口映射。
一、UPnP协议简介
UPnP(Universal Plug and Play,即插即用)是各种各样的智能设备、无线设备和个人电脑等实现遍布全球的对等网络连接(P2P)的结构。使用UPnP达到的效果是任何设备一旦连接上网络,所有在网络上的设备马上就能知道有新设备加入,这些设备彼此之间能互相通信,更能直接使用或者控制它,一切都不需要人工设置。
1.1 UPnP结构
服务、设备和控制点是UPnP网络的基本组件,如图1:
图1 UPnP组件图
设备(Device):家电、手机、智能设备、无线设备、电脑等等都可以称之为设备。服务(Service):是指设备在不同情况下的动作和设备的状态。控制点(Control Point):指的是可以发现并控制其他设备的控制设备。在UPnP网络中,设备可以和控制点合并为同一台设备。
1.2UPnP工作流程
UPnP定义了设备之间、设备和控制点、控制点之间通信的协议。完整的UPnP有设备寻址、设备发现、设备描述、设备控制、事件通知和基于HTML的描述等几部分构成。UPnP协议最底层是TCP/IP协议,UPnP实现的工作流程如图2所示:
图2 UPnP实现的工作流程
寻址:就是找个可用IP地址。一般都采用DHCP服务,使设备自动得到一个IP地址。
发现:加入到网络中,设备会定期的以组播的方式表明自身的存在以及告知(Advertise)它提供的服务;控制点则是网络中广播search packets来发现具有某些服务的设备,具有该服务的设备以单播的方式应答。
描述:控制点可以从发现消息中得到设备描述的URL(可以认为是浏览器地址),通过URL取回设备描述的信息。
控制、事件和展示则是控制点获取描述之后进行的各种通信交互。其中控制是控制点对设备进行的操作;事件为设备向控制点定期发送其感兴趣的信息,展示可以认为是设备的一个功能,它给控制点一个URL,可以登录到设备的网页服务器。
二、UPnP路由器端口映射控制点在W5500实现
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.2UPnP自动端口映射软件实现流程
本文中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
三自动端口映射功能测试
程序讲解完毕后将讲解如何测试我们写的W5500EVB程序,看是不是能够达到我们的实现目的,实现控制路由器端口映射功能。
第一步:开启路由器UPnP。登陆路由器控制界面,打开“转发规则->UPnP设置”,如果UPnP状态没有开启,则需要开启一下。
第二步:将编译好的可执行文件下载到开发板中,接网线到路由器上,接USB调试线到PC端,打开串口助手对应的COM口以便查看调试信息和进入串口命令菜单。按复位键,程序开始执行,经过串口打印信息,我们看到DHCP获取正确IP地址,发现UPnP设备、获得描述,设置事件都已完成,如图9所示:
图9 UPnP执行成功打印输出
接下来就是我们的串口操作菜单,如图10:
图10程序完成初始化后的菜单界面
第三步:基本命令输入。按照菜单提示进行命令输入,在此1-4就是基本的串口命令操作:打开/关闭led,设置/查看网络配置;5、6步就是开启TCP、UDP回环测试。TCP回环实际上就是开启了一个TCP Server,同一网段的TCP Client可以直接与其建立通信,可发送数据到此TCP Server,TCP Server会回复相同的数据。串口基本配置和内网回环测比较简单,在此不再贴图查看。
第四步:配置TCP端口映射。在串口调试助手上输入7,进行配置选项,按照菜单提示,我们端口映射,外网端口号为12222,内网端口号为5000,添加成功后会提示AddPortSuccess。如图11所示:
图11添加端口映射成功后串口打印出信息
刷新第一步进入的UPnP状态设置和设备列表,可发现控制节点W5500_Control_Point已经加入内部端口号为5000,外部端口53F7为12222。可见我们已经成功用UPnP协议对路由器端口进行了映射。而且看到Thunder5在这里也有UDP /TCP端口映射列表。如图12所示。在这里也说一下,我们常用的P2P软件,Thunder PPlive等都支持UPnP端口映射。
图12添加端口映射后路由器端口映射表
第五步,用外网测试配置好的端口映射。
如图3端口映射网络图,W5500和PC2不在同一个网络中,如果不进行端口映射,PC2不可能连接到W5500 TCP Server。首先我们在串口界面上输入5进入TCP Server回环程序。接下来查看路由器的外网IP,可见外网IP为“36.36.141.53”,其为公网IP。我们任意找一台PC用网络调试助手建立一个TCP Client,去连接我们刚才配置好的服务器IP为“36.36.141.53”端口为“12222”。连接成功后,发送LED_ON(红色为发送的数据),通过网络调试助手我们可以看到收到LED_ON(黑色为收到的数据),证明回环已建立。这就如同,无论我们在什么地方都能对我们的设备进行连接和控制。如图13所示:
图13外网连接到内网并进行数据回环测试
同时通过EVB上的LED,我们可以发现,LED灯可以根据我们输入的指令执行亮灭动作。如图14所示:
图14 LED根据命令进行亮灭
第六步:删除已添加的端口。在菜单界面中输入8,然后按指示删除刚才的端口,刷新路由器映射表,发现已经没有这个应用了。
四总结
目前,实现各种设备的互联互通已经成为人们的迫切需求,而实现这一目的的关键是家庭网络的中间件技术,最有前景的就是今天讲的UPnP,因此支持UPnP标准的设备越来越多。本文通过UPnP部分协议实现了设备的自动端口映射,方便设备直接部署在内网中,无需客户去配置,就能在外网中直接访问内网设备,查看或者配置设备信息。作为一个UPnP协议的一个简单应用,希望能给大家一个思路。