WIZ550io UDP loopback 질문 드립니다.


안녕하세요 W5500io로 TCP 테스트는 loopback.c파일에 있는 loopback_tcps, loopback_tcpc를

활용하여 서버 /클라이언트에 대한 테스트는 마쳤습니다.

udp테스트를 하려고 loopback_udps를 아래와 같이 구현하여 테스트 진행 시…

wiz_NetInfo gWIZNETINFO = { { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 }, // Mac address
{ 192, 168, 1, 130 }, // IP address
{ 255, 255, 255, 0 }, // Subnet mask
{ 192, 168, 1, 1 }, // Gateway
{ 8, 8, 8, 8 }, // DNS Server
};

uint8_t des_ip[4] = { 192, 168, 1, 123 }; //TCP IP PC Server IP

#define PORT_TCPS 5000
#define PORT_UDPS 3000
#define SOCK_TCPS 0
#define SOCK_UDPS 1
#define DATA_BUF_SIZE 2048

uint8_t gdata[DATA_BUF_SIZE];

main()
{
for(;:wink:
{
loopback_udps(SOCK_UDPS, gdata, PORT_UDPS);
}
}

=> 이 코드를 돌리면 Hercules를 사용했을 때 udp의 loopback이 정상적으로 되질 않습니다.
Herclues에서 데이터 Send 했을때 SocketError가 발생 됩니다.

 ![image|579x500](upload://zcv0hZnnvLWOM6OBf8nc7AqeKXP.png) 

 그래서 Debug를 해보니 아래와 같이 printf가 되며,,

 1:UDP loopback start
 1:Opened, UDP loopback, port [3000]

switch(getSn_SR(sn)) => 이 부분에서 SOCK_UDP까지 상태를 받아오나 
if((size = getSn_RX_RSR(sn)) > 0) => 여기에서 계속 데이터가 0이 리턴 됩니다.

제대로 연결이 안된 것 같은데, 어떤 문제 인지 알 수 있을까요??

아 그리고 Herclues에 보면 Port와 Local Port로 두개로 되어있는데
Port의 경우 loopback_udps의 매개변수로 주면 되는것 같은데
Local_Port는 프로그램 어디 부분에서 서로 맞춰줘야 하나요??
Herclues 세팅 : Port 3000, Local 4023
W5500 세팅 : Port 3000, Local : ??

그리고 UDP는 서버밖에 없나요? Hercules도 Listen버튼이 있고 api함수도 서버인듯 해보여서,,
혹시 한쪽을 클라이언트로 접속해야 하는 것인지.. 이것도 잘 모르겠네요..

답변 부탁 드리겠습니다. 감사합니다.

else if(g_uart2_buffer[0] == ‘3’)
{
int32_t recv_size = 0;
uint16_t udp_port = 4023;

				printf("socket open : %d\r\n", socket(SOCK_UDPS, Sn_MR_UDP, 3000, 0));

				for(;;)
				{
					recv_size = recvfrom(SOCK_UDPS, gdata, DATA_BUF_SIZE, des_ip, &udp_port);

					if(recv_size)
					{
						sendto(SOCK_UDPS, gdata, recv_size, des_ip, udp_port); //Local Port 4023
					}
				}
			}

이렇게 수정해도 Socketerror #11001이 발생 되네요.

-. socket을 열면 1이 리턴되며, Hercules에서 Send data를 눌러도 Socket error #11001만 발생 되네요.

-. recv단 주석 처리 후 sendto만 사용해서 문자열 보내는 것까진 되네요… 받는것만 안되는걸로 보입니다.

-. Herclues에 Module IP가 W5500의 IP가 되는것이 맞나요"?? 여기에 0을 넣고 접속해도
sendto로 넘기는 문자열이 Received data창에 표기가 되네요;;;;;

안녕하세요

UDP는 Server, Client의 개념이 없습니다.
TCP와 달리 별도의 연결과정없이 Destination 을 설정하여 send하면 데이터 전송이 가능합니다.

Hercules에서 Module IP와 Port에는 W5500 IP와 pot를 적어주시면 됩니다.
이때 port는 loopback_udps함수에서 매개변수 port와 같습니다.

Hercules에서 Local port는 W5500에서 맞춰줄 필요가 없습니다.
아래 코드와 같이 W5500에서 data를 수신하면 전송한 target의 IP와 port를 확인하여 loopback 해주게 되어있습니다.
image

socket error #11001은 host not found error로 파악됩니다.
ip와 port 등을 한번더 확인하시고 가능하면 wireshark도 확인해보시는게좋을 것 같습니다.

안녕하세요. IP와 PORT가 제대로 설정이 안되어있었네요…

wiz_NetInfo gWIZNETINFO => 여기 구조체에서 자동으로 참조 하는줄 알았는데
loopback_udps() => 이 function에서 값을 넣어주니 잘 동작합니다.

uint8_t destip[4] = { 192, 168, 1, 130 }; //IP 추가
uint16_t destport = PORT_UDPS; //PORT 추가

답변 감사드립니다.

구조체에 값을 설정해주신후
wizchip_setnetinfo(&gWIZNETINFO);
함수를 사용해주시면 설정됩니다.

앞서 말씀드렸듯이 W5500은 recvfrom함수에서 destination ip와 port를 확인하여 해당 변수에 return해줍니다. 따라서 loopback 동작에서는 설정해줄 필요가 없습니다.
다만, loopback이 아닌 W5500에서 데이터를 먼저 전송하는경우에는 위와같이 설정해주셔야합니다.

또한,
W5500 port (loopback_udps()매개변수)- Hercules port
W5500 dest port - Hercules Local port
입니다.
W5500 port 와 Hercules port PORT_UDPS으로 설정하신걸로 확인했는데
destination port에도 PORT_UDPS로 설정하셨네요

다만 Hercules Local port도 3000으로 설정하셔서 모두 3000으로 설정해주시면 통신하는데는 문제 없습니다.

1 Like