前言
上一章我们用W5500_EVB_PICO 开发板做UDP组播数据回环测试,那么本章我们进行W5500_EVB_PICO Ping的测试。
什么是PING?
Ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序 。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。
连接方式
使开发板和我们的电脑处于同一网段:
- 开发板(设备)通过交叉线直连主机(PC)
- 开发板和主机都接在路由器LAN口
测试工具
- 串口调试工具(任意)
测试
1.相关代码
我们打开例程中库文件的w5500_ping.c文件我们先找到ping.c头文件下面看下,可以看到几个函数,我们需要用到如下所示几个函数:Ping_auto要我们传入一个socket端口号和需要Ping的对象IP信息;函数里面用一个Switch状态机,对socket端口状态轮询并进行相应的处理,当状态在SOCK_IPRAW,就开始Ping的工作,成功则返回Ping的信息,Ping失败则打印失败的信息。
cpp
void ping_auto(uint8_t s, uint8_t *addr)
{
uint8_t i;
int32_t len = 0;
uint8_t cnt=0;
for(i = 0; i<=3;i++)
{
sleep_ms(10);
switch(getSn_SR(s))
{
case SOCK_CLOSED:
close(s);
IINCHIP_WRITE(Sn_PROTO(s), IPPROTO_ICMP);
if(socket(s,Sn_MR_IPRAW,3000,0)!=0)
{ }
while(getSn_SR(s)!=SOCK_IPRAW);
sleep_ms(1000);
sleep_ms(1000);
break;
case SOCK_IPRAW:
ping_request(s, addr);
req++;
while(1)
{
if ( (len = getSn_RX_RSR(s) ) > 0)
{
ping_reply(s, addr, len);
sleep_ms(50);
rep++;
break;
}
else if(cnt > 200)
{
printf( "Request Time out. \r\n");
cnt = 0;
break;
}
else
{
cnt++;
sleep_ms(50); /*wait 50ms*/
}
// wait_time for 2 seconds, Break on fail
}
break;
default:
break;
}
#ifdef PING_DEBUG
if(rep!=0)
{
printf("Ping Request = %d, PING_Reply = %d\r\n",req,rep);
if(rep == req)
printf( "PING SUCCESS\r\n " );
else
printf( "REPLY_ERROR\r\n " );
}
else{}
#endif
}
}
主函数还是和之前一样,先配置好网络信息,然后配置好所要Ping的IP,添加do_ping()函数来执行Ping_auto函数,并将do_ping放在while循环中运行。
cpp
#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
void do_ping(void);
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, 1};
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);
do_ping();
if(req>=4)
{
close(0);
break;
}
}
}
void network_init(void)
{
uint8_t temp;
wizchip_initialize();
printf("W5500 ping test.\r\n");
sleep_ms(2000);
wizchip_setnetinfo(&net_info);
print_network_information(get_info);
sleep_ms(2000);
}
void do_ping(void)
{
printf("------------PING_TEST_START-----------------------\r\n");
sleep_ms(1000); // wait 1000ms
ping_auto(0,destip);
}
2.烧录现象
我们编译烧录后,打开串行监视器,按下复位键,会打印网络配置信息和所要Ping的ip当Ping成功后串口会打印Ping的信息,出现PING SUCCESS 表示Ping成功。