WIZnet Developer Forum

W5500으로 ntp를 구현하려고 합니다.

w5500으로 ntp를 구현하려고 합니다.(mcu는 STM32F405를 사용하였습니다.)
위즈넷에서 제공하는 sntp 코드 파일, 헤더 파일을 가져왔고(ioLibrary_Driver/Internet/SNTP at master · Wiznet/ioLibrary_Driver · GitHub), 첨부한 이미지 처럼 main.c에 추가로 코드를 작성하였습니다. 컴파일은 문제 없이 되는데, 시간이 불러와지지 않습니다. 어느 부분에 문제가 있는걸까요?

추가로, 네트워크 설정 관련 코드 예제는 아래와 같아 보이는데, 각각 주소들을 어떻게 찾아서 입력을 해주어야 하나요? (아래의 코드를 넣어도 관련 헤더파일은 있어서 컴파일은 됩니다.)
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},
.ip = {192, 168, 0, 91},
.sn = {255, 255, 255, 0},
.gw = {192, 168, 0, 1},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC };

안녕하세요.

Github W5500 SNTP 예제입니다.
참조 부탁드립니다.

아래는 SNTP_LPC11E36_LPCXpresso/W5500EVB.c at master · Wiznet/SNTP_LPC11E36_LPCXpresso · GitHub 의 main 함수 입니다. Network 기본 설정이 완료 된 후 SNTP_init(), SNTP_run()을 실행해 주십시오.

SPI_Init();
W5500_Init();
Net_Conf(gWIZNETINFO);

#ifdef MAIN_DEBUG
uint8_t tmpstr[6] = {0,};

ctlwizchip(CW_GET_ID,(void*)tmpstr);

printf("\r\n=======================================\r\n");
printf(" WIZnet %s EVB Demos v%d.%.2d\r\n", tmpstr, VER_H, VER_L);
printf("=======================================\r\n");
printf(">> W5500 based SNTP Example\r\n");
printf("=======================================\r\n");

Display_Net_Conf(); // Print out the network information to serial terminal

#endif

/* Enable and setup SysTick Timer at a periodic rate */
SysTick_Config(SystemCoreClock / TICKRATE_HZ1);

/* Initialize buttons on the W5500 EVB board */
Board_Buttons_Init();

SNTP_init(0, ntp_server, 40, gDATABUF);	// timezone: Korea, Republic of

while(1) {
	/* Button: SW1 */
	if(Check_Buttons_Pressed() == BUTTONS_BUTTON1)
	{
		printf("\r\n########## SW1 was pressed.\r\n");
		do {}
		while (SNTP_run(&time) != 1);
		printf("%d-%d-%d, %d:%d:%d", time.yy, time.mo, time.dd, time.hh, time.mm, time.ss);
	}
}

질문 하였을 때 이미 w5500evb.c를 참고 하였었는데 SNTP_run 함수의 리턴값이 0아고, 시간 정보가 받아와지지 않았습니다. 제 추측으로는 네트워크 설정과 ntp 서버 연결 문제 같은데…

  1. 제가 첨부해드린 이미지 처럼 메인문에 uint8_t ntp_server[4] = {128, 138, 141, 172}; 구문을 넣기만 해도 NTP서버와 연결이 되는건가요? (혹시나 또 다른 코드 구문을 추가해야 되나요?)
  2. 네트워크 기본 설정 관련해서 main.c에 아래와 같은 구문을 넣어주었는데, 이 작업으로 네트워크 설정이 되는건가요? (혹시 제가 잘못된 주소를 넣었을 수도 있을 것 같은데, 각각의 항목에 어떠한 주소를 넣어야 하는지도 답변 부탁드립니다.)
    wiz_NetInfo gWIZNETINFO = { .mac = {0x0c, 0x01, 0x02, 0x22, 0xc0, 0xa8},
    .ip = {192, 168, 21, 10},
    .sn = {255, 255, 255, 0},
    .gw = {192, 168, 0, 1},
    .dns = {8, 8, 8, 8},
    .dhcp = NETINFO_STATIC };
  3. sntp.c의 SNTP_run 함수에 ‘recvfrom(NTP_SOCKET, data_buf, RSR_len, (uint8_t *)&destip, &destport);’ 구문을 동작 시키면 SOCK_ERROR-5에러가 발생합니다.(#define SOCKERR_SOCKMODE (SOCK_ERROR - 5) ///< Invalid socket mode for socket operation.) 이 에러를 해결할 수 있는 방법을 문의드립니다.

안녕하세요

SNTP_init(0, ntp_server, 40, gDATABUF); 함수에서 위의 변수에 저장한 서버 주소로 접속됩니다. 다른 추가 부분은 없습니다.

이변수에 네트워크 정보값을 저장하고, Net_Conf(gWIZNETINFO); 함수를 통해 정보가 설정됩니다.
첨부하신 이미지에는 Net_Conf등이 보이지 않는데 확인해보시기 바랍니다.

차례대로 mac address, ipaddress, subnet mask, gateway 주소인데 gateway와 ip주소의 네트워크 대역대가 다릅니다. 네트워크 설정하는방법에 대해 좀더 숙지하셔야할 것 같습니다.

Socket open이 제대로 되지않은 것 같습니다. Version Register를 read하시어 CHIP과 MCU간의 SPI 통신이 되고있는지부터 먼저 확인해 보시는게 좋을 것 같습니다.

답변 감사합니다!
wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc, 0xab, 0xcd, 0xef},
.ip = {192, 168, 21, 10},
.sn = {255, 255, 255, 0},
.gw = {?, ?, ?, ?},
.dns = {8, 8, 8, 8},
.dhcp = NETINFO_STATIC };
w5500의 ip, sn, dns, dhcp는 위와 같이 설정하였는데, w5500의 gateway는 어떻게 알 수 있나요?

추가 문의로, ntp 구현 관련하여 유상 기술 지원도 가능한가요?
가능하다면 비용은 어느정도인가요?

IP가 192.168.21.10이라면 게이트웨이주소는 192.168.21.1이 일반적입니다.
IP를 192.168.21.10으로 설정하신 이유가 있으신가요?
임의로 설정하신거라면 환경에따라 통신이 되지않을 수도 있습니다.
게이트웨이 주소는 라우터의 주소를 설정하셔야합니다.
기술지원문의는 lucid@wiznet.io로 주시면됩니다

답변 감사합니다!
IP주소는 공유기 포트포워드 설정에서 ntp관련 내부IP를 192.168.21.10으로 설정하였습니다.

기술지원 문의 관련 메일을 방금 보내드렸습니다. 가끔 문의 메일을 보내면 메일 답장이 없으셔서… 이번 문의 메일은 빠른 답변 부탁드려요

안녕하세요

아래의 프로젝트 참고하시기 바랍니다.
STM32103 mcu 로 제작된 예제입니다. 확인해보시고도 지원이 필요하시면 아까 전화주셨던 번호로 전화부탁드립니다.

안녕하세요. 지난 번에 도움 감사드립니다.
현재 ntp 서버로부터 시간 정보는 받아와 지는데,
1~2번 시간 정보가 갱신된 후 mac,ip,sn,gw,dns,dhcp주소와 현재시간이 전부 0으로 초기화 되다가
다시 1~2번 시간 정보가 갱신된 후 전부 0으로 초기화 되는 증상이 반복됩니다.

do {}
while (SNTP_run(&time) != 1);
printf("%d-%d-%d, %d:%d:%d", time.yy, time.mo, time.dd, time.hh, time.mm, time.ss);

문제는 위 구문인 것 같은데, 현재 위 구문을 main.c의 int main함수 내에 넣어 두었습니다. (물론 다른 곳에 넣어도 같은 증상이 반복됩니다.)
while (SNTP_run(&time) != 1);을 if (SNTP_run(&time) != 1);로 바꾸었을 때는 mac, ip, sn, gw, dns, dhcp주소가 0으로 초기화 되지는 않지만 시간은 1~2번만 가져옵니다. ('SNTP_run(&time);'으로 하여도 마찬가지 입니다. 간혹 길게는 2분 정도 시간정보를 얻어오다 멈추기도 합니다.)
이를 해결하여 mac, ip, sn, gw, dns ,dhcp주소와 시간 정보가 0으로 초기화 되지않고 시간 정보를 연속으로 받아지게 하려면 어떻게 해야할까요? 조언 부탁드립니다.
imageimage

안녕하세요

MAC, IP, SN, GW, DNS 등은 SNTP_run()함수의 영향을 받지 않습니다.
사용하고계시는 환경이 네트워크 정보를 설정하는지 알 수 없어서 도움을 드리기가 어렵습니다.
네트워크가 초기화되는 부분을 찾으셔야할것같습니다.

이부분은 사용하고 계시는 환경에서 다른요인으로 인해 해당코드가 호출되지 않는것은 아닌지 의심됩니다.

시간 정보가 받아질 때는 sntp.c에서 getSn_RX_RSR(NTP_SOCKET)의 값이 56이 되어 아래 빨간 표시한 조건문에 들어가서 시간 정보가 띄어지는데, 잘 동작하다 어느 순간에 getSn_RX_RSR(NTP_SOCKET)의 값이 0만 띄어져 아래 빨간 표시한 조건문이 만족하지 않아 시간 정보가 뜨지 않네요… 혹시 예상되는 문제점을 알 수 있나요?

안녕하세요

getSn_RS_RSR() 은 수신한 Data의 Size를 Return합니다.
0은 수신한 데이터가 없다는것을 의미합니다.
서버에서 데이터를 전송하지않았거나, Request를 전송이 됐는지 같이확인해보시기바랍니다.

답변 감사합니다. 시간이 1~2번만 받아와지고 멈출 때, ntp_retry_cnt이 1에서 멈춰져 있길래 0값을 넣어 주었더니 다시 1~2번 동작합니다. 그래서 SNTP_run 함수 안에 ‘if(ntp_retry_cnt>0) ntp_retry_cnt=0;’ 조건문을 넣어주었더니 멈추지 않고 연속으로 잘 동작합니다!

혹시 ntp_retry_cnt이 1에서 멈춰져 시간이 안받아와졌던 이유를 알 수 있을까요?

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.