W5500EVB Ping 其他设备


关键词:Ping  W5500  WIZnet  W5500EVB  W5500 Ping 设备


ICMP是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有), 这个“Ping”的过程实际上就是ICMP协议工作的过程。Ping命令利用ICMP回射请求报文和回射应答报文来测试目标系统是否可达。
执行 ping 后,首先向目标服务器发出回送请求报文。计算机送出的回送请求到达目标服务器后,服务器回答这一请求,向送信方发送回送请求。这个 ICMP 回送回答报文在 IP 层来看,与被送来的回送请求报文基本上一样。不同的只是,源和目标 IP 地址字段被交换了,类型字段里填入了表示回送回答的 0, 这两点。也就是,从送信方来看,自己送出的 ICMP 报文从目标服务器那里象鹦鹉学舌那样原样返回了。

主循环代码如下:
void ping_count(uint8 s, uint16 pCount, uint8 *addr)
{
	uint16 rlen, cnt,i;
	cnt = 0;
	for(i=0; i < pCount+1;i++)													/*循环ping pCount次*/
	{		
		if(i!=0)
		{
			/* Output count number */
			printf( "No.%d  ",i);
		}
		switch(getSn_SR(s))														/*获取socket状态*/
		{
			case SOCK_CLOSED:													/*socket关闭状态*/
				close(s);			
				/* Create Socket */  
				IINCHIP_WRITE(Sn_PROTO(s), IPPROTO_ICMP);						/*设置ICMP 协议*/
				if(socket(s,Sn_MR_IPRAW,3000,0)!=0)								/*判断ip raw模式socket是否开启*/
				{ }
				/* Check socket register */
				while(getSn_SR(s)!=SOCK_IPRAW);		
			break;
			case SOCK_IPRAW:													/*ip raw模式*/		
				ping_request(s, addr);											/*发送Ping请求*/
				req++;			
			while(1)
			{
				if ( (rlen = getSn_RX_RSR(s) ) > 0)
				{
					ping_reply(s, addr, rlen);									/*获取回复信息*/
					rep++;
					if (ping_reply_received)  break;				
				}	
				if ( (cnt > 1000) ) 
				{
					printf("Request Time out\r\n\r\n") ;
					cnt = 0;
					break;
				}
				else
				{ 
					cnt++; 	
					delay_ms(1000);
				}
			}
			break;	
			default:					
			break;
		}
		if(req>=pCount)
		{	
			printf("Ping Request = %d, Ping Reply = %d, Lost = %d\r\n",req,rep,req-rep);						  
		}
	}
}
接下来介绍一下具体的测试过程,测试步骤如下
  1. ping例程采用默认的IP信息,所以在w5500_conf.c文件中设置ip_from为IP_FROM_DEFINE。
  2. 具体要ping的IP地址,在w5500_conf.c中通过定义remote_ip变量来表示,大家可以以根据自己的要求修改。
  3. 对代码进行编译,之后将程序烧录到野火开发板。
  4. 连接好网线,USB串口线。打开串口调试工具,复位野火开发板,从输出结果可以得到图1设置信息。

图1: ping回复信息

从打印信息可以看到,发送一次ping请求,之后得到一次ping回复,如果请求和回复的次数保持相同,则说明ping一直正常。



例程下载:【Ping】
编译环境:keil V5.11
硬件要求:W5500EVB