嵌入式linux自动更新网络时间NTP实践

    嵌入式设备中,有些需要得到实时的比较准确的时间,以和服务器或是设备之间进行时间同步,但是很多嵌入式设备又不能通过人工设置时间的方式来同步时间,需要自动从网络上获取时间,这就需要用到NTP。NTP是网络时间协议(Network Time Protocol)的简称,它是用来同步网络中各个计算机设备的时间的协议。目前有第三方的代码可以支持NTP,本文讲诉ntpclient的用法。

    ntpclient is an NTP(RFC-1305)client for unix-alike computers.Its functionality is a small subset of xntpd,but IMHO performs better (or at least has the potential tofunction better) within that limited scope. Since it is muchsmaller than xntpd, it is also more relevant for embedded computers.

    ntpclient的下载地址是: ntpclient下载地址  

    下载好后,进行交叉编译后放入设备中运行就可以了,运行命令如:ntpclient -d -s -g -c 1 -h time.nist.gov

    但是如果你需要将ntpclient整合到你自己的代码里面中,需要怎么做呢,其实也很简单,下载源代码后,例如我下载的是ntpclient_2010_365.tar.gz,解压tar -zxvf ntpclient_2010_365.tar.gz,解压后将ntpclient.c,ntpclient.h,phaselock.c这三个文件放入你的项目中,更改ntpclient.c中的main()函数即可。

    我的更改如下:

void ntp_test(void) 
{
	int usd;  /* socket */
	int c;
	/* These parameters are settable from the command line
	   the initializations here provide default behavior */
	short int udp_local_port=0;   /* default of 0 means kernel chooses */
	char *hostname=NULL;          /* must be set */
	int initial_freq;             /* initial freq value to use */
	struct ntp_control ntpc;
	ntpc.live=0;
	ntpc.set_clock=0;
	ntpc.probe_count=0;           /* default of 0 means loop forever */
	ntpc.cycle_time=600;          /* seconds */
	ntpc.goodness=0;
	ntpc.cross_check=1;
    //hostname = "210.72.145.44"; //中国国家授时中心
    //hostname = "ntp.sjtu.edu.cn"; //上海交通大学NTP服务器,202.120.2.101


	(ntpc.set_clock)++;
	ntpc.probe_count = 1;
	hostname = "time.nist.gov";
	
	if (ntpc.set_clock && !ntpc.live && !ntpc.goodness && !ntpc.probe_count) {
		ntpc.probe_count = 1;
	}

	/* respect only applicable MUST of RFC-4330 */
	if (ntpc.probe_count != 1 && ntpc.cycle_time < MIN_INTERVAL) {
		ntpc.cycle_time = MIN_INTERVAL;
	}

		printf("Configuration:\n"
		"  -c probe_count %d\n"
		"  -d (debug)     %d\n"
		"  -g goodness    %d\n"
		"  -h hostname    %s\n"
		"  -i interval    %d\n"
		"  -l live        %d\n"
		"  -p local_port  %d\n"
		"  -q min_delay   %f\n"
		"  -s set_clock   %d\n"
		"  -x cross_check %d\n",
		ntpc.probe_count, debug, ntpc.goodness,
		hostname, ntpc.cycle_time, ntpc.live, udp_local_port, min_delay,
		ntpc.set_clock, ntpc.cross_check );

	/* Startup sequence */
	if ((usd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))==-1)
	{
		printf ("ntp socket error!\n");
	}

	setup_receive(usd, INADDR_ANY, udp_local_port);

	setup_transmit(usd, hostname, NTP_PORT, &ntpc);

	primary_loop(usd, &ntpc);

	close(usd);
}

    编译运行,在需要的地方调用就可以了。

你可能感兴趣的:(linux)