[无线电易读版]基于STM32和W5500的UPnP自动端口映射功能实现

博客
文章开始之前让我们设想下面的几个情形:我们在办公室内就能访问到生产车间的网络摄像机,而无需到监控室查看生产情况;在下班之前,或在回去的路上,就可以先打开家里的空调器和厨房设备,等进入家门,立刻就是一个温度宜人的环境――厨房里的饭也做好了;我们想在电视机上回味一下几天前在景区拍的照片,把相机或者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.2  UPnP工作流程 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.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 三自动端口映射功能测试 程序讲解完毕后将讲解如何测试我们写的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协议的一个简单应用,希望能给大家一个思路。  
Read More

剖析:WIZnet以太网核心技术–全硬件TCP/IP协议栈

博客
WIZnet,是全球第一家专注于全硬件TCP/IP协议栈技术(iOffloadTM Tech)的半导体公司,精心为用户提供高速稳定的以太网解决方案,广泛应用在工业自动化、智能电网、安防门禁、金融机具等众多领域。该方案有效地卸载了主控芯片对于TCP/IP处理的负载,非常适应于物联网行业高速稳定,简单易用,移植性强的要求。 WIZnet以太网核心技术,说到底就是:全硬件TCP/IP协议栈。今天就给大家剖析一下核心技术。 首先,来说一下TCP/IP协议中的四大层:应用层(Application);传输层(Transport);网络层(IP);网络接口层。其中,应用层中支持FTP、HTTP、SMTP、DNS等应用协议,对应到传输层中TCP及UDP不同的传输方式,在网络层中,提供ICMP、IP、IGMP、ARP和RARP等网络协议。如上协议就构成了网络通信中丰富的通信方式及功能。WIZnet以太网芯片中,在网络接口上仅提供以太网接口。 下面我们看一下WIZnet以太网芯片的结构:(全硬件协议栈)将TCP/IP协议中的传输层和网络层集成到了一颗以太网芯片中(WIZnet以太网芯片中大部分集成了MAC和PHY),实现了一片解决联网,真正实现了TCP/IP卸载引擎技术(ToE),为单片机减负,缩短了开发周期。   好,那我们看一下全硬件TCP/IP的优势都体现在哪里? 首先,我们和市场上常见的以太网方案(用软件协议栈实现)对比一下: 下面是WIZnet以太网方案(全硬件协议栈): 从方案结构图就可以看出,TCP/IP+MAC+PHY的集成为开发者省去了繁琐的软件协议栈移植,缩短了开发的周期,同时卸载了MCU的负载,稳定程度也可见一斑,下图就是相关测试性能对比: 图中,我们可以清楚看到,同款ARM9 MCU上,软件协议栈和硬件协议栈以太网芯片,体现出来的巨大的性能差异,全硬件TCP/IP协议栈卸载MCU 63%的负载,TCP/IP传输速率提高一倍之多。 所以,穹顶之下,数据之上的剖析,才为每一个开发者带来福音。   感谢阅读! WIZnet官方网站:http://www.iwiznet.cn WIZnet官方微博:http://weibo.com/wiznet2012 关注WIZnet微信公众号:
Read More