基于STM32和W5500的UPnP自動端口映射功能實現
二、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在收到這樣的控制請求后,會給出一系列應答,如果應答中包含收到“

圖8 AddPort的報文
刪除端口與添加端口格式一樣,都是通過HTTP POST method-basedSOAP執行DeletePortMapping操作,只需要ExternalPort和Protocol兩個參數即可。在此不再詳細敘述,請參考我們的程序代碼下載鏈接:http://pan.baidu.com/s/1roc70
三 自動端口映射功能測試
程序講解完畢后將講解如何測試我們寫的W5500EVB程序,看是不是能夠達到我們的實現目的,實現控制路由器端口映射功能。
評論