文章開始之前讓我們設想下面的幾個情形:我們在辦公室內就能訪問到生產車間的網絡攝像機,而無需到監控室查看生產情況;在下班之前,或在回去的路上,就可以先打開家裡的空調器和廚房設備,等進入家門,立刻就是一個溫度宜人的環境――廚房裡的飯也做好了;我們想在電視機上回味一下幾天前在景區拍的照片,把相機或者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-M3,它使用 USB 口進行供電和調試,單片機為 STM32F103RCT6,網絡芯片為WIZnet硬件 TCP/IP 的以太網芯片W5500。
我們的實驗目的就是讓W5500(Control Point)控制路由器(Device)執行端口映射服務(Service),讓外網中的PC2可以與內網中的 W5500EVB-M3 板建立連接。如圖 3 所示 PC2 往路由器 36.36.141.53:12222 發送的信息,將被轉發到內網 192.168.1.110:5000。
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協議的一個簡單應用,希望能給大家一個思路。