UDP(User Datagram Protocol用戶數(shù)據(jù)報協(xié)議)是一種無連接、不可靠的協(xié)議。UDP協(xié)議沒有流控制,沒有應(yīng)答確認機制,不能解決丟包、重發(fā)、錯序問題。它只是簡單地實現(xiàn)從一端主機到另一端主機的數(shù)據(jù)傳輸功能,數(shù)據(jù)通過IP層發(fā)送,在網(wǎng)絡(luò)中傳輸,到達目標主機的順序是無法預(yù)知的,因此需要應(yīng)用程序?qū)@些數(shù)據(jù)進行排序處理。在發(fā)送端,UDP只是把上層應(yīng)用的數(shù)據(jù)封裝到UDP報文中;在差錯檢測方面,僅僅是對數(shù)據(jù)進行了簡單的校驗,然后將其封裝到IP數(shù)據(jù)報中發(fā)送出去。在接收端,無論是否收到數(shù)據(jù),都不會產(chǎn)生一個應(yīng)答返回送給源主機。如果接收到數(shù)據(jù)校驗錯誤,接收端丟棄該UDP報文,也不會告訴源主機,這樣數(shù)據(jù)是無法保障其準確性的。但是在如今的網(wǎng)絡(luò)環(huán)境下,UDP協(xié)議傳輸出現(xiàn)錯誤的概率很小,并且它的實時性是非常好,常用于實時視頻的傳輸,比如直播、網(wǎng)絡(luò)電話等,即使是出現(xiàn)了數(shù)據(jù)丟失的情況,導致視頻卡幀,也不會產(chǎn)生大的影響。UDP被廣泛應(yīng)用于與對傳輸速度有要求,并且可以容忍出現(xiàn)差錯的數(shù)據(jù)傳輸中。
對于UDP通信來說,可以沒有服務(wù)器,服務(wù)器只是一種規(guī)定。主動發(fā)送的一方為客戶端,被動接受的一方為服務(wù)器(下圖為通信過程,程序也是按照這個步驟進行設(shè)計)。
實驗使用MB-039開發(fā)板,在工程中使用LwIP+FreeRTOS,實驗展示如何實現(xiàn)UDP數(shù)據(jù)收發(fā),實驗使用到的硬件如下:
如圖是MB-039(完整原理圖可以通過MM32官網(wǎng)下載)的ETH部分接口電路。
各個信號引腳對應(yīng)如下:
實驗用到的API前面幾節(jié)已經(jīng)進行了講解,我們直接創(chuàng)建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)創(chuàng)建一個UDP類型的連接結(jié)構(gòu)
2)綁定IP地址與端口
3)接收客戶端發(fā)送的數(shù)據(jù)(值得指出的是UDP可以一對一,也可以一對多以廣播的形式發(fā)送)
4)拷貝出接收的數(shù)據(jù)
5)將數(shù)據(jù)發(fā)送給目標主機
到這里已經(jīng)完成了工程的創(chuàng)建,看一下PC的IP地址,設(shè)備需要處于同一網(wǎng)段,以方便測試。打開命令行窗口輸入: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
將程序下載入開發(fā)板中,使用NetAssist進行如下設(shè)置:
1)協(xié)議設(shè)置,選擇UDP
2)本機主機地址(即PC地址)
3)端口號
4)設(shè)置遠程主機地址(即設(shè)備地址)
點擊打開,在進行這一步前可以則Ping一下開發(fā)板地址,可以正常Ping通則檢查端口號;如果無法Ping通則需要對工程進行檢查。任意輸入字符進行發(fā)送。
可以發(fā)現(xiàn)對接收到的數(shù)據(jù)進行了正確的轉(zhuǎn)發(fā),我們也可以使用Wireshark進行監(jiān)視抓取整個過程,選擇IP過濾:ip.addr==192.168.105.35。
通過上圖表明實驗成功。
實驗程序請登錄我們的官網(wǎng)下載MM32F3270 SDK,工程路徑如下:
~MM32F3270_Lib_Samples_V0.90Demo_appEthernet_DemoETH_RTOSFreertos_UDP
來源:靈動MM32MCU
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17148瀏覽量
351212 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9160瀏覽量
85426 -
UDP
+關(guān)注
關(guān)注
0文章
325瀏覽量
33941
發(fā)布評論請先 登錄
相關(guān)推薦
評論