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