[無線電易讀版]基於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 協議的一個簡單應用,希望能給大家一個思路。