arm_linux_ntp.zip

  • RyanLei
    了解作者
  • C/C++
    开发工具
  • 4KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 10 积分
    下载积分
  • 6
    下载次数
  • 2014-12-23 10:22
    上传日期
第一阶段,前5分钟内作为client以每10秒的频率向进行ntpdata网络对时。5分钟后,也就是第二阶段,每一小时对时一次,同时每次对时完成后打开ntpd服务器,作为server给网络中的client提供对时服务。
arm_linux_ntp.zip
  • Makefile
    118B
  • set_time.c
    6.5KB
  • uart.c
    3.2KB
内容介绍
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <errno.h> #include <pthread.h> #include <sys/ioctl.h> #include <time.h> #define MSG_LEN 23 #define BUF_LEN 100 #define DEV_NAME "/dev/ttyAT6" #define CHKSUM_INIT1 5 //XOR(01,01,00,FF,FE,04) #define CHKSUM_INIT2 1 //XOR(02,01,00,FF,FE,03) #define DEBUG 1 int uart_init(char *dev, int speed, int databits,int parity, int stopbits); char CharToHex(char * dest, char * buffer , int len); char DECtoBCD(char num); int test_mcboard() { FILE *fp; char xxx[4]; fp = fopen("/etc/usb.conf", "r"); if (fp == NULL) return 0; fread(xxx, 4, sizeof(char),fp); if (xxx[0]!= 'u' || xxx[1] != 's' || xxx[2] != 'b' || xxx[3] != '0') return 0; return 1; } char date_xor(struct tm * get_local_time) { char chksum=CHKSUM_INIT1; chksum=chksum^DECtoBCD(((get_local_time->tm_year)%100)); chksum=chksum^DECtoBCD(get_local_time->tm_mon); chksum=chksum^DECtoBCD(get_local_time->tm_mday); chksum=chksum^DECtoBCD(get_local_time->tm_wday); return chksum; } char time_xor(struct tm * get_local_time) { char chksum=CHKSUM_INIT2; chksum=chksum^DECtoBCD(get_local_time->tm_hour); chksum=chksum^DECtoBCD(get_local_time->tm_min); chksum=chksum^DECtoBCD(get_local_time->tm_sec); return chksum; } int main(int argc, char *argv[]) { FILE * fp; char flag=0,update_time=0,over_n=0,over_n_flag=0,open_ntpd=0,open_ntpd_first=0,first_update_ok=1; char time_str1[50],time_str2[50],hex_time_str1[50],hex_time_str2[50],str[100],date_chksum,time_chksum; int fd=-1,n1,n2,chk_update=1; struct tm * get_local_time; time_t calendar_time; time_t start,end; int tn; int count=0; fd=uart_init(DEV_NAME, 9600, 8, 'N', 1); if (!fd) return 0; if (test_mcboard() == 0) return 0; /*******************************************************/ system("killall ntpd");// 对时前需要将服务器关闭,方能进行对时 start=time(NULL); //上电时记录下起始日历时间 end=start; while(1) { if(flag==0) //上电5分钟内flag为0 { if((first_update_ok==1)&&(chk_update==0)) //第一次更新成功则执行内部内容 { first_update_ok=0; start=time(NULL); } tn=(int)difftime(end,start); if(tn>=30) //前5分钟内每10秒对时一次 { flag=1; //达到5分钟后不再以每10秒的频率对时,将进行每1H对时一次 start=end;//将起始日历时间设定为到达5分钟的时刻,即上一次的end时间 open_ntpd_first=1;//在5分钟后的0时刻完成对时之后打开ntpd服务器 } update_time=1; if(over_n_flag==1) { over_n_flag=0; over_n++; if(over_n>=6) //上电时连续6次都对时失败,那么退出程序,同时将情况写入日志 { //向日志中说明 over_n=0; fp=fopen("/var/log/ntpd.log","a+"); fputs("Can't update the time,exit from the programme\n",fp); fclose(fp); exit(0); } } else { over_n=0; } } else //上电过了5分钟后flag为1 { if(difftime(end,start)>=30) //5分钟后每1H对时一次 { system("killall ntpd");// 对时前需要将服务器关闭,方能进行对时 start=end; //每过1H将此刻设定为起始时间 update_time=1; //1H进行一次对时 open_ntpd=1; } else { if(open_ntpd==1) //每过1H执行完对时后立刻打开ntpd服务器,以便其他客户端对时 { open_ntpd=0; system("ntpd -l /var/log/ntpd.log"); //开启ntpd服务器。不需要对时期间,ntpd服务器都处于开启状态,以便局域网内其他客户端对时 } } } if(update_time==1) //update_time为1时进行对时 { update_time=0; system("/etc/ntpserver"); //ntpserver文件内设定好了ntpdate server ip fp=fopen("/etc/stdin","r+"); fscanf(fp,"%d",&chk_update); //将echo $? 命令的退出状态返回值送给chk_update,为0表示更新成功,为1表示更新失败 fclose(fp); sleep(1); if(chk_update==1) { //write(fd,"Update failed\n",strlen("Update failed\n")); over_n_flag=1; } else { system("hwclock -w"); calendar_time=time(NULL); //获取此刻的日历时间,日历时间是从1970年1月1日0时0分0秒到此刻的秒数,返回值是long int型。 get_local_time=localtime(&calendar_time); //将日历时间转换为本地时间 date_chksum=date_xor(get_local_time); time_chksum=time_xor(get_local_time); sprintf(time_str1,"AA010100FFFE04%02d%02d%02d%02d%02x",(get_local_time->tm_year)%100,get_local_time->tm_mon,get_local_time->tm_mday,get_local_time->tm_wday,date_chksum); sprintf(time_str2,"AA020100FFFE03%02d%02d%02d%02x",get_local_time->tm_hour,get_local_time->tm_min,get_local_time->tm_sec,time_chksum); n1=CharToHex(hex_time_str1,time_str1,strlen(time_str1)); n2=CharToHex(hex_time_str2,time_str2,strlen(time_str2)); write(fd,hex_time_str1, n1); // //write(fd,"\n", strlen("\n")); sleep(1); write(fd,hex_time_str2, n2); //write(fd,"\n", strlen("\n")); } if(open_ntpd_first==1) //本if语句条件只满足一次,即只在5分钟后的0时刻执行完对时之后立刻打开ntpd服务器,以后每十五分钟打开ntpd服务器是 { //由if(open_ntpd==1)来完成 open_ntpd_first=0; system("ntpd -l /var/log/ntpd.log"); } } end=time(NULL); //记录结束时间 } close(fd); exit(0); } char CharToHex(char * dest, char * buffer , int len) //字符串转化为十六进制,即每两个字符转化为一个十六进制表示的BCD码字符 { //“FF”(两个字符)->0xFF(11111111)一个字符 int i=0; int j=0; unsigned char temp; while(i<len) { temp=buffer[i]; if((temp>=0x30)&&(temp<=0x39)) { temp=temp-0x30; dest[j]=temp<<4; } else if((temp>=0x41)&&(temp<=0x46)) { temp=temp-0x41+0x0A; dest[j]=temp<<4; } else if((temp>=0x61)&&(temp<=0x66)) { temp=temp-0x61+0x0A; dest[j]=temp<<4; } else { dest[j]=0x00; } // dest[j]=dest[j]<<4; temp=buffer[i+1]; if((temp>=0x30)&&(temp<=0x39)) { temp=temp-0x30; dest[j]=dest[j]|temp; } else if((temp>=0x41)&&(temp<=0x46)) { temp=temp-0x41+0x0A; dest[j]=dest[j]|temp; } else if((temp>=0x61)&&(temp<=0x66)) { temp=temp-0x61+0x0A; dest[j]=dest[j]|temp; } else { dest[j]=dest[j]|0x00; } i=i+2; j=j+1; } return j; } char DECtoBCD(char num) { char tmp,BCD; tmp=num%100; BCD=((tmp/10)<<4)+((tmp%10)&0x0F); return BCD; }
评论
    相关推荐