前言
? ? ? ? 上一章我們用開發(fā)板作為UDP Server進(jìn)行數(shù)據(jù)回環(huán)測(cè)試,本章我們讓我們的開發(fā)板作為UDP Client進(jìn)行數(shù)據(jù)回環(huán)測(cè)試。
連接方式
使開發(fā)板和我們的電腦處于同一網(wǎng)段:
- 開發(fā)板通過(guò)交叉線直連主機(jī)
- 開發(fā)板和主機(jī)都接在路由器LAN口
測(cè)試工具
- 網(wǎng)路調(diào)試工具(任意)
- wireshark抓包工具
回環(huán)測(cè)試
1.相關(guān)代碼
我們打開例程中庫(kù)文件的loopback.c文件,可以看到udp server回環(huán)測(cè)試函數(shù),它有四個(gè)參數(shù):socket(套接字)端口號(hào)(0~7個(gè)端口,可開8路socket)、數(shù)據(jù)收發(fā)緩存buf、目標(biāo)IP和目標(biāo)端口;原理上依舊是通過(guò)Switch狀態(tài)機(jī)輪詢socket端口(所開端口的套接字)狀態(tài),根據(jù)不同狀態(tài)做出相應(yīng)處理;如果為關(guān)閉狀態(tài)就初始化socket狀態(tài)為udp協(xié)議模式;如果狀態(tài)已經(jīng)處于udp模式,即socket初始化后,就主動(dòng)給目標(biāo)IP和設(shè)置的目標(biāo)端口發(fā)送數(shù)據(jù),并且進(jìn)行判斷是否收到數(shù)據(jù),收到就進(jìn)行回傳。如下所示:
int32_t loopback_udpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
{
int32_t ret;
uint16_t size = 0, sentsize=0;
static uint16_t any_port = 50000;
switch(getSn_SR(sn))
{
case SOCK_UDP :
sendto(sn, "test", 4, destip, destport);
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, any_port, 0x00)) != sn)
return ret;
#ifdef _LOOPBACK_DEBUG_
printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, any_port);
#endif
break;
default :
break;
}
return 1;
}
然后我們初始化網(wǎng)絡(luò)配置信息,目標(biāo)IP(本機(jī)電腦IP)和目標(biāo)端口,在主函數(shù)里循環(huán)調(diào)用測(cè)試函數(shù)即可。如下所示:
#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; //UDP Server listener port
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 client example.\r\n");
sleep_ms(2000);
wizchip_setnetinfo(&net_info);
print_network_information(get_info);
sleep_ms(2000);
}
2.測(cè)試現(xiàn)象
編譯燒錄后,打開串行監(jiān)視器,看到網(wǎng)絡(luò)信息配置成功后,打開兩個(gè)網(wǎng)絡(luò)調(diào)試助手,參數(shù)依次設(shè)置為UDP、開發(fā)板初始化的目標(biāo)IP和目標(biāo)端口,遠(yuǎn)程主機(jī)地址和端口為我們開發(fā)板的本地IP和端口,注意這里的端口是在回環(huán)函數(shù)內(nèi)部實(shí)現(xiàn)的,這里為50000,注意區(qū)分UDP Server模式下的本地端口,打開后我們即可看到收到開發(fā)板主動(dòng)發(fā)來(lái)的數(shù)據(jù),然后我們發(fā)送0~9十個(gè)阿拉伯?dāng)?shù)字,可以看到串口打印收到的數(shù)據(jù),而且調(diào)試助手也分別收到了對(duì)應(yīng)回傳的數(shù)據(jù)。如下圖所示:
我們可以打開wireshark抓包工具,輸入命令<ip.addr == 192.168.1.10 and udp>過(guò)濾數(shù)據(jù)包(IP地址改成自己電腦的IP或者開發(fā)板的IP地址即可);然后兩個(gè)調(diào)試助手依次發(fā)送,可以到抓到的數(shù)據(jù)包。如下圖所示:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-660838.html
?相關(guān)鏈接?
本章相關(guān)例程鏈接https://gitee.com/wiznet-hk/w5500-evb-pico-routine.git文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-660838.html
到了這里,關(guān)于W5500-EVB-PICO做UDP Client進(jìn)行數(shù)據(jù)回環(huán)測(cè)試(八)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!