UDP(User Datagram Protocol用戶數據報協議)是一種無連接、不可靠的協議。UDP協議沒有流控制,沒有應答確認機制,不能解決丟包、重發、錯序問題。它只是簡單地實現從一端主機到另一端主機的數據傳輸功能,數據通過IP層發送,在網絡中傳輸,到達目標主機的順序是無法預知的,因此需要應用程序對這些數據進行排序處理。在發送端,UDP只是把上層應用的數據封裝到UDP報文中;在差錯檢測方面,僅僅是對數據進行了簡單的校驗,然后將其封裝到IP數據報中發送出去。在接收端,無論是否收到數據,都不會產生一個應答返回送給源主機。如果接收到數據校驗錯誤,接收端丟棄該UDP報文,也不會告訴源主機,這樣數據是無法保障其準確性的。但是在如今的網絡環境下,UDP協議傳輸出現錯誤的概率很小,并且它的實時性是非常好,常用于實時視頻的傳輸,比如直播、網絡電話等,即使是出現了數據丟失的情況,導致視頻卡幀,也不會產生大的影響。UDP被廣泛應用于與對傳輸速度有要求,并且可以容忍出現差錯的數據傳輸中。
對于UDP通信來說,可以沒有服務器,服務器只是一種規定。主動發送的一方為客戶端,被動接受的一方為服務器(下圖為通信過程,程序也是按照這個步驟進行設計)。
實驗使用MB-039開發板,在工程中使用LwIP+FreeRTOS,實驗展示如何實現UDP數據收發,實驗使用到的硬件如下:
如圖是MB-039(完整原理圖可以通過MM32官網下載)的ETH部分接口電路。
各個信號引腳對應如下:
實驗用到的API前面幾節已經進行了講解,我們直接創建UDP工程:
static void udpecho_thread(void* arg) { struct netconn* conn; struct netbuf* buf; char buffer[4096]; err_t err; LWIP_UNUSED_ARG(arg); conn = netconn_new(NETCONN_UDP); // (1) netconn_bind(conn, IP_ADDR_ANY, LOCAL_PORT); // (2) while (1) { err = netconn_recv(conn, buf); // (3) if (err == ERR_OK) { if(netbuf_copy(buf, buffer, sizeof(buffer)) != buf->p->tot_len) { // (4) LWIP_DEBUGF(LWIP_DBG_ON, ("copy failedn")); } else { buffer[buf->p->tot_len] = '?'; err = netconn_send(conn, buf); // (5) if(err != ERR_OK) { LWIP_DEBUGF(LWIP_DBG_ON, ("netconn_send failed: %dn", (int)err)); } else { LWIP_DEBUGF(LWIP_DBG_ON, ("got %sn", buffer)); } } netbuf_delete(buf); } } }
1)創建一個UDP類型的連接結構
2)綁定IP地址與端口
3)接收客戶端發送的數據(值得指出的是UDP可以一對一,也可以一對多以廣播的形式發送)
4)拷貝出接收的數據
5)將數據發送給目標主機
到這里已經完成了工程的創建,看一下PC的IP地址,設備需要處于同一網段,以方便測試。打開命令行窗口輸入:ipconfig
PC的地址為:192.168.105.34,在sys_arch.h文件中對DEST_IP_ADDR0 、DEST_IP_ADDR1、DEST_IP_ADDR2、DEST_IP_ADDR3進行修改,DEST_PORT 隨意修改。
#define LOCAL_PORT 2021 #define IP_ADDR0 192 #define IP_ADDR1 168 #define IP_ADDR2 105 #define IP_ADDR3 35
將程序下載入開發板中,使用NetAssist進行如下設置:
1)協議設置,選擇UDP
2)本機主機地址(即PC地址)
3)端口號
4)設置遠程主機地址(即設備地址)
點擊打開,在進行這一步前可以則Ping一下開發板地址,可以正常Ping通則檢查端口號;如果無法Ping通則需要對工程進行檢查。任意輸入字符進行發送。
可以發現對接收到的數據進行了正確的轉發,我們也可以使用Wireshark進行監視抓取整個過程,選擇IP過濾:ip.addr==192.168.105.35。
通過上圖表明實驗成功。
實驗程序請登錄我們的官網下載MM32F3270 SDK,工程路徑如下:
~MM32F3270_Lib_Samples_V0.90Demo_appEthernet_DemoETH_RTOSFreertos_UDP
來源:靈動MM32MCU
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17317瀏覽量
352640 -
服務器
+關注
關注
12文章
9303瀏覽量
86061 -
UDP
+關注
關注
0文章
327瀏覽量
34043
發布評論請先 登錄
相關推薦
評論