?前言
????????前面我們用W5100S-EVB-PICO 開發(fā)板在TCP Client和TCP Server模式下,分別進行數(shù)據(jù)回環(huán)測試,本章我們將用開發(fā)板在UDP Server模式下進行數(shù)據(jù)回環(huán)測試。
UDP是什么?什么是UDP Server?能干什么?
????????UDP (User Dataqram Protocol) 是一種無連接的、不可靠的傳輸協(xié)議,用于在計算機網(wǎng)絡(luò)上傳輸數(shù)據(jù)UDP Server是指UDP網(wǎng)絡(luò)服務(wù)的服務(wù)器端連接,用于接收客戶端的數(shù)據(jù)報文并返回響應(yīng),實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)的交互。
????????UDP Server的主要作用是接收客戶端發(fā)送的數(shù)據(jù)報文,并進行處理和響應(yīng)。通過UDP Server,客戶端可以將數(shù)據(jù)報文發(fā)送到服務(wù)器,并從服務(wù)器接收響應(yīng)。由于UDP是無連接的,因此每個數(shù)據(jù)報文都是獨立處理的,服務(wù)器對于未收到的數(shù)據(jù)報文不會重傳。
????????在UDP Server中,服務(wù)器程序需要指定監(jiān)聽的端口號,并使用UDP協(xié)議接收客戶端發(fā)送的數(shù)據(jù)報文。一旦接收到數(shù)據(jù)報文,服務(wù)器程序會對報文進行處理,并返回相應(yīng)的響應(yīng)報文。
????????因此,UDP Server可以幫助設(shè)備實現(xiàn)數(shù)據(jù)報文的快速傳輸和響應(yīng),適用于一些對于數(shù)據(jù)傳輸速度和實時性要求較高的應(yīng)用,如視頻直播、語音通話等。在UDP Server中,由于數(shù)據(jù)報文的傳輸是不可靠的,因此需要客戶端程序進行重傳和超時處理,以保證數(shù)據(jù)的可靠傳輸。
UDP Server 和 UDP Client有何不同?
UDP服務(wù)器:
- 首先初始化
- 打開特定端口監(jiān)聽
- 可以接受多個客戶端連接
UDP客戶端:
- 指定目標IP和端口
- 發(fā)送數(shù)據(jù)
從套接字編程角度來看,兩者完全相同。因此我們僅用UDP Server來做數(shù)據(jù)回環(huán)測試。
連接方式
使開發(fā)板和我們的電腦處于同一網(wǎng)段:
- 開發(fā)板通過交叉線直連主機
- 開發(fā)板和主機都接在路由器LAN口
測試工具
- 網(wǎng)路調(diào)試工具(任意)
- wireshark抓包工具
回環(huán)測試
1.相關(guān)代碼
我們打開例程中庫文件的loopback.c文件,可以看到udp server回環(huán)測試函數(shù),它有三個參數(shù):socket(套接字)端口號(0~3個端口,可開4路socket)、數(shù)據(jù)收發(fā)緩存buf、監(jiān)聽端口;原理上依舊是通過Switch狀態(tài)機輪詢socket端口(所開端口的套接字)狀態(tài),根據(jù)不同狀態(tài)做出相應(yīng)處理,與tcp不同的是,udp只有做了兩個狀態(tài)處理,如果為關(guān)閉狀態(tài)就初始化socket狀態(tài)為udp協(xié)議模式,并開始監(jiān)聽設(shè)置的端口;如果狀態(tài)已經(jīng)處于udp模式,即socket初始化后,就進行判斷是否收到數(shù)據(jù),收到就進行回傳。如下所示:
int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{
int32_t ret;
uint16_t size, sentsize;
uint8_t destip[4];
uint16_t destport;
switch(getSn_SR(sn))
{
case SOCK_UDP :
if((size = getSn_RX_RSR(sn)) > 0)
{
if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;
ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);
buf[ret]=0x00;
printf("recv form[%d.%d.%d.%d][%d]: %s\n", destip[0],destip[1],destip[2],destip[3],destport,buf);
if(ret <= 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endif
return ret;
}
size = (uint16_t) ret;
sentsize = 0;
while(sentsize != size)
{
ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);
if(ret < 0)
{
#ifdef _LOOPBACK_DEBUG_
printf("%d: sendto error. %ld\r\n",sn,ret);
#endif
return ret;
}
sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.
}
}
break;
case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_
//printf("%d:UDP loopback start\r\n",sn);
#endif
if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)
return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
#endif
break;
default :
break;
}
return 1;
}
然后我們在主函數(shù)里循環(huán)調(diào)用測試函數(shù)即可??梢钥吹嚼锩孢€注釋了一個udp client回環(huán)測試函數(shù),這個基本跟udp server相同,獨立出來是為了方便用戶自己進行測試,這里不在演示。如下所示:
#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
void network_init(void);
wiz_NetInfo net_info = {
.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},
.ip = {192, 168, 1, 10},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 1, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
static uint8_t destip[4]={192, 168, 1, 2};
static uint16_t destport = 8080;
static uint16_t local_port =8000;
int main()
{
stdio_init_all();
sleep_ms(2000);
network_init();
while(true)
{
// loopback_udpc(SOCKET_ID, ethernet_buf, destip, destport);
loopback_udps(SOCKET_ID, ethernet_buf, local_port);
sleep_ms(500);
}
}
void network_init(void)
{
uint8_t temp;
wizchip_initialize();
printf("W5500 udp test example.\r\n");
sleep_ms(2000);
wizchip_setnetinfo(&net_info);
print_network_information(get_info);
sleep_ms(2000);
}
2.測試現(xiàn)象
編譯燒錄后,打開串行監(jiān)視器,看到網(wǎng)絡(luò)信息配置成功后,打開兩個網(wǎng)絡(luò)調(diào)試助手,參數(shù)依次設(shè)置為UDP、本機的IP、8080,注意另一個調(diào)試助手的端口參數(shù)設(shè)置跟第一個不可以相同,避免沖突;這里將其設(shè)置為8081,完成后打開;然后遠程IP和端口選擇我們開發(fā)板設(shè)置的IP和端口,我這里是192.168.1.10 : 8000,然后我們讓第一個調(diào)試助手發(fā)送0~9十個阿拉伯數(shù)字,第二個發(fā)送字符串:hello wiznet,可以看到串口打印收到不同客戶端的數(shù)據(jù),而且調(diào)試助手也分別收到了相對應(yīng)的數(shù)據(jù)回傳。如下圖所示:
?我們可以打開wireshark抓包工具,輸入命令<ip.addr == 192.168.1.10 and udp>過濾數(shù)據(jù)包(IP地址改成自己電腦的IP或者開發(fā)板的IP地址即可);然后兩個調(diào)試助手依次發(fā)送,可以到抓到的數(shù)據(jù)包。如下圖所示:
文章來源:http://www.zghlxwxcb.cn/news/detail-647463.html
相關(guān)鏈接?
本章相關(guān)例程https://gitee.com/wiznet-hk/w5100s-evb-pico-routine.git文章來源地址http://www.zghlxwxcb.cn/news/detail-647463.html
到了這里,關(guān)于W5100S-EVB-PICO 做UDP Server進行數(shù)據(jù)回環(huán)測試(七)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!