精华内容
下载资源
问答
  • 如何使用GPSPPS实现时钟同步采集系统
  • 倍福使用2个EL6688实现时钟同步
  • 如何使用GPS PPS实现时钟同步采集系统
  • 网络游戏-MPLS-TP网络实现时钟同步的方法及装置.zip
  • 在第46届IEEE决策与控制会议上由Luca Schenato和Giovanni Gamba提出的IEEE出版物“无线传感器网络中的时钟同步的分布式共识协议”,通过分布式线性迭代实现时钟同步的算法“ Average TimeSync Protocol”的MATLAB...
  • 实现时钟同步,一致性,分布式互斥,组长选举的算法 时钟同步:在交易系统的4台服务器网络中实现矢量时间戳,其中交易,核对余额,存款或取款等每个过程都是一项工作,并根据网络中请求的到达情况进行同步。 为了...
  • 模拟NTP协议实现时钟同步

    万次阅读 2011-11-12 20:59:11
    Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),...
      
    

        Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。

        NTP提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间是按NTP服务器的等级传播。按照距离外部UTC 源的远近将所有服务器归入不同的Stratun(层)中。Stratum-1在顶层,有外部UTC接入,而Stratum-2则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构并相互连接,而Stratum-1的时间服务器是整个系统的基础。

        进行网络协议实现时最重要的是了解协议数据格式。NTP数据包有48个字节,其中NTP包头16字节,时间戳32个字节。其协议格式如下图所示。

     

        其协议字段的含义如下所示。

          LI:跳跃指示器,警告在当月最后一天的最终时刻插入的迫近闺秒(闺秒)。

          VN:版本号。

          Mode:工作模式。该字段包括以下值:0-预留;1-对称行为;3-客户机;4-服务器;5-广播;6-NTP控制信息。NTP协议具有3种工作模式,分别为主/被动对称模式、客户/服务器模式、广播模式。在主/被动对称模式中,有一对一的连接,双方均可同步对方或被对方同步,先发出申请建立连接的一方工作在主动模式下,另一方工作在被动模式下;客户/服务器模式与主/被动模式基本相同,惟一区别在于客户方可被服务器同步,但服务器不能被客户同步;在广播模式中,有一对多的连接,服务器不论客户工作在何种模式下,都会主动发出时间信息,客户根据此信息调整自己的时间。

         Stratum:对本地时钟级别的整体识别。

         Poll:有符号整数表示连续信息间的最大间隔。

         Precision:有符号整数表示本地时钟精确度。

         Root Delay:表示到达主参考源的一次往复的总延迟,它是有15~16位小数部分的符号定点小数。

         Root Dispersion:表示一次到达主参考源的标准误差,它是有15~16位小数部分的无符号定点小数。

         Reference Identifier:识别特殊参考源。

          Originate Timestamp:这是向服务器请求分离客户机的时间,采用64位时标格式。

         Receive Timestamp:这是向服务器请求到达客户机的时间,采用64位时标格式。

         Transmit Timestamp:这是向客户机答复分离服务器的时间,采用64位时标格式。

         Authenticator(Optional):当实现了NTP认证模式时,主要标识符和信息数字域就包括已定义的信息认证代码(MAC)信息。

    ---------------------------------------------------------------------------------------------------------------------------

        以上对NTP协议原理的描述来自网络,感谢网络上的朋友!

        以下是我写的模拟NTP协议进行时钟同步的Demo程序。完整的代码可从这里下载: http://download.csdn.net/detail/chexlong/3787414

    NTP.h

    #ifndef NTP_H
    #define NTP_H
    
    #include <winsock2.h>
    #include <stdio.h>
    #include <time.h>
    #pragma comment(lib, "WS2_32")	// 链接到WS2_32.lib
    
    
    #define LI 0
    #define VN 3
    #define MODE 3
    #define STRATUM 0
    #define POLL 4 
    #define PREC -6
    
    #define JAN_1970      0x83aa7e80      /* 2208988800 1970 - 1900 in seconds */
    #define NTPFRAC(x) (4294 * (x) + ((1981 * (x))>>11))
    #define USEC(x) (((x) >> 12) - 759 * ((((x) >> 10) + 32768) >> 16))
    
    typedef struct ntptime_t 
    {
    	unsigned int coarse;
    	unsigned int fine;
    }ntptime;
    
    typedef struct ntp_packet_t
    {
    	//header
    	unsigned int leap_year_indicator:2;
    	unsigned int version_number:3;
    	unsigned int mode:3;
    	unsigned int stratum :8;
    	unsigned int poll :8;
    	unsigned int precision :8;
    
    	unsigned int root_delay;
    	unsigned int root_dispersion;
    	unsigned int reference_identifier;
    
    	//时间戳
    	ntptime  reference_timestamp; //T4
    	ntptime originate_timestamp;  //T1
    	ntptime receive_timestamp;    //T2
    	ntptime transmit_timestamp;   //T3
    }ntp_packet;
    
    typedef union
    {
    	ntp_packet ntp;
    	char c[48];
    }NTP_PACKET_T;
    
    void GetNTPTime(ntptime *ntpTime)
    {
    	SYSTEMTIME sysTime;
    	FILETIME fileTime;
    	GetSystemTime(&sysTime);
    	SystemTimeToFileTime(&sysTime,&fileTime);
    	ntpTime->coarse = fileTime.dwHighDateTime;
    	ntpTime->fine = fileTime.dwLowDateTime;
    }
    
    
    SOCKET CreateSock(char *psLocalIP, unsigned short usLocalPort, unsigned int iTimeOut)
    {
    	//创建套节字
    	SOCKET sock = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    	if( INVALID_SOCKET == sock )
    	{
    		printf("Failed socket() %d \n", ::WSAGetLastError());
    		return 0;
    	}
    
    	if (0 != iTimeOut)
    	{
    		//设置套接字发送,接收超时时间
    		int iRet = setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&iTimeOut, sizeof(iTimeOut));
    		iRet = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&iTimeOut, sizeof(iTimeOut));
    	}
    
    	//绑定本地地址
    	sockaddr_in addrLocal;
    	memset(&addrLocal, 0, sizeof(addrLocal));
    	addrLocal.sin_family = AF_INET;
    	addrLocal.sin_addr.s_addr = htonl(INADDR_ANY);
    	addrLocal.sin_port = htons(usLocalPort);
    
    	if ( 0 != bind(sock, (struct sockaddr*)&addrLocal, sizeof(addrLocal)) )
    	{
    		printf("Failed bind() %d \n", ::WSAGetLastError());
    		closesocket(sock);
    		return 0;
    	}
    
    	return sock;
    }
    
    #endif

     

    Base64.h

    #ifndef BASE64_H
    #define BASE64_H
    
    const int pr2six[256]={
    	64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
    	64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62,64,64,64,63,
    	52,53,54,55,56,57,58,59,60,61,64,64,64,64,64,64,64,0,1,2,3,4,5,6,7,8,9,
    	10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,64,64,64,64,64,64,26,27,
    	28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,
    	64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
    	64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
    	64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
    	64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
    	64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
    	64,64,64,64,64,64,64,64,64,64,64,64,64
    };
    
    char six2pr[64] = {
    	'A','B','C','D','E','F','G','H','I','J','K','L','M',
    	'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
    	'a','b','c','d','e','f','g','h','i','j','k','l','m',
    	'n','o','p','q','r','s','t','u','v','w','x','y','z',
    	'0','1','2','3','4','5','6','7','8','9','+','/'
    };
    
    void Base64Decode(const char *bufcoded, char * dst,int *nbytes)
    {
    	int nbytesdecoded;
    	const char *bufin = bufcoded;
    	unsigned char *bufout = (unsigned char*)dst;
    	int nprbytes;
    
    	/* Figure out how many characters are in the input buffer.
    	* If this would decode into more bytes than would fit into
    	* the output buffer, adjust the number of input bytes downwards.
    	*/
    	//bufin = bufcoded;
    	while(pr2six[(int)*(bufin++)] <= 63){}
    	nprbytes = (int)(bufin - bufcoded - 1);
    	nbytesdecoded = ((nprbytes+3)/4) * 3;
    
    	bufin = bufcoded;
    
    	while (nprbytes > 0)
    	{
    		*(bufout++) =
    			(unsigned char) (pr2six[(int)*bufin] << 2 | pr2six[(int)bufin[1]] >> 4);
    		*(bufout++) =
    			(unsigned char) (pr2six[(int)bufin[1]] << 4 | pr2six[(int)bufin[2]] >> 2);
    		*(bufout++) =
    			(unsigned char) (pr2six[(int)bufin[2]] << 6 | pr2six[(int)bufin[3]]);
    		bufin += 4;
    		nprbytes -= 4;
    	}
    
    	if(nprbytes & 03)
    	{
    		if(pr2six[(int)bufin[-2]] > 63)
    			nbytesdecoded -= 2;
    		else
    			nbytesdecoded -= 1;
    	}
    	dst[nbytesdecoded] = '\0';
    	if ( nbytes )
    	{
    		*nbytes = nbytesdecoded;
    	}
    }
    
    void Base64Encode(const unsigned char *bufin, unsigned int nbytes, char * dst)
    {
    	unsigned char *outptr = (unsigned char *)dst;
    	unsigned int i;
    
    	for (i=0; i<nbytes; i += 3)
    	{
    		*(outptr++) = six2pr[*bufin >> 2];            /* c1 */
    		*(outptr++) = six2pr[((*bufin << 4) & 060) | ((bufin[1] >> 4) & 017)]; /*c2*/
    		*(outptr++) = six2pr[((bufin[1] << 2) & 074) | ((bufin[2] >> 6) & 03)];/*c3*/
    		*(outptr++) = six2pr[bufin[2] & 077];         /* c4 */
    
    		bufin += 3;
    	}
    
    	/* If nbytes was not a multiple of 3, then we have encoded too
    	* many characters.  Adjust appropriately.
    	*/
    	if(i == nbytes+1)
    	{
    		/* There were only 2 bytes in that last group */
    		outptr[-1] = '=';
    	} 
    	else if(i == nbytes+2)
    	{
    		/* There was only 1 byte in that last group */
    		outptr[-1] = '=';
    		outptr[-2] = '=';
    	}
    
    	*(outptr++) = '\0';
    
    	//size_t len = outptr - 1 - (unsigned char*)dst;
    }
    
    
    #endif


    NTPClient.cpp

    #include "../Include/NTP.h"
    #include "../Include/Base64.h"
    
    //NTP请求包打包
    int CreateNtpPacket(NTP_PACKET_T &ntpPacket)
    {
    	static unsigned long ulNTPId = 0;
    	ulNTPId++;
    	char szBuf[1024];
    	int iDataLen;
    
    	ntpPacket.ntp.leap_year_indicator = LI;
    	ntpPacket.ntp.version_number = VN;
    	ntpPacket.ntp.mode = MODE;
    	ntpPacket.ntp.stratum = STRATUM;
    	ntpPacket.ntp.poll = POLL;
    	ntpPacket.ntp.precision = (PREC&0xFF);
    	ntpPacket.ntp.root_delay = htonl(1<<16);
    	ntpPacket.ntp.root_dispersion = htonl(1<<16);
    	ntpPacket.ntp.reference_identifier = 0;
    
    	ntpPacket.ntp.reference_timestamp.coarse = 0;
    	ntpPacket.ntp.reference_timestamp.fine = 0;
    	GetNTPTime(&ntpPacket.ntp.originate_timestamp);
    	ntpPacket.ntp.receive_timestamp.coarse = 0;
    	ntpPacket.ntp.receive_timestamp.fine = 0;
    	ntpPacket.ntp.transmit_timestamp.coarse = 0;
    	ntpPacket.ntp.transmit_timestamp.fine = 0;
    
    	return 0;
    }
    
    int NtpRequest(SOCKET &sock)
    {
    	int iRet;
    	sock = CreateSock("127.0.0.1", 4567, 5000);
    	if ( 0 == sock )
    	{
    		printf("Failed create sock1 \n");
    		return -1;
    	}
    
    	//填写远程地址信息
    	sockaddr_in addrRemote; 
    	addrRemote.sin_family = AF_INET;
    	addrRemote.sin_port = htons(5678);
    	addrRemote.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    
    	while (true)
    	{
    		char szTimeValue[128];
    		char szbuf[128];
    		memset(szTimeValue,0,128);
    		memset(szbuf,0,128);
    
    		NTP_PACKET_T ntpPacket;
    		memset(&ntpPacket,0,sizeof(ntpPacket));
    		CreateNtpPacket(ntpPacket);
    
    		//Base64进行编码
    		Base64Encode((unsigned char *)ntpPacket.c, sizeof(ntpPacket), szTimeValue);
    
    		//发送NTP请求数据包
    		iRet = ::sendto(sock, szTimeValue, strlen(szTimeValue), 0, (sockaddr*)&addrRemote, sizeof(addrRemote));
    		if ( SOCKET_ERROR == iRet )
    		{
    			printf("Failed sendto() sock %d \n", ::WSAGetLastError());
    			closesocket(sock);
    		}
    		else
    		{
    			printf("Successed sendto sock = %d, data lenth = %d \n", sock, iRet);
    		}
    
    		memset(szTimeValue,0,sizeof(szTimeValue));
    		int nLen = sizeof(addrRemote);
    	
    		//接收NTP请求应答消息
    		iRet = ::recvfrom(sock, szbuf, 128, 0, (sockaddr*)&addrRemote, &nLen); 
    		
    		if(iRet > 0)
    		{
    			szbuf[iRet] = '\0';
    			printf(" 接收到数据(%s):%s \n", ::inet_ntoa(addrRemote.sin_addr), szbuf);
    
    			//Base54解码
    			Base64Decode(szbuf, szTimeValue, 0);
    			if ( '\0' == szTimeValue[0] )
    			{
    				printf("time value is empty. \n");
    				closesocket(sock);
    				::WSACleanup();	
    				return -1;
    			}
    			memset(&ntpPacket,0,sizeof(ntpPacket));
    			memcpy(ntpPacket.c,szTimeValue,sizeof(ntpPacket));
    
    			//设置本地系统时钟
    			SYSTEMTIME sysTime;
    			struct tm *tm1 = _localtime32((__time32_t*)&ntpPacket.ntp.transmit_timestamp.coarse);
    			sysTime.wYear = tm1->tm_year+1900;
    			sysTime.wMonth = tm1->tm_mon+1;
    			sysTime.wDay = tm1->tm_mday;
    			sysTime.wHour = tm1->tm_hour;
    			sysTime.wMinute = tm1->tm_min;
    			sysTime.wSecond = tm1->tm_sec;
    			sysTime.wMilliseconds = 0;
    			//SetLocalTime(&sysTime);
    
    			printf("NTP ok, %4d-%02d-%02d %02d:%02d:%02d %d \n", sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond,sysTime.wMilliseconds);
    		}
    		else
    		{
    			printf("Failed recvfrom() sock %d \n", ::WSAGetLastError());
    		}
    
    		Sleep(5000);
    	}
    
    }
    
    int main(int argc, char* argv[])
    {
    	int iRet;
    	WSADATA wsaData;
    	WORD sockVersion = MAKEWORD(2, 2);
    	if(::WSAStartup(sockVersion, &wsaData) != 0)
    	{
    		exit(0);
    	}
    	
    	SOCKET sock;
    	iRet = NtpRequest(sock);
    	if (0 != iRet)
    	{
    		printf("ntp request failed. \n");
    	}
    
    	system("pause");
    
    	closesocket(sock);
    	::WSACleanup();	
    
    	return 0;
    }


    NTPServer.cpp

    #include "../Include/Base64.h"
    #include "../Include/NTP.h"
    
    int StartNtpServer(SOCKET &sock)
    {
    	int iRet;
    	sock = CreateSock("127.0.0.1", 5678, 0);
    	if ( 0 == sock )
    	{
    		printf("Failed create sock1 \n");
    		return -1;
    	}
    
    	sockaddr_in addrRemote; 
    
    	char szTimeValue[128];
    	char szbuf[128];
    	memset(szTimeValue,0,128);
    	memset(szbuf,0,128);
    	NTP_PACKET_T ntpPacket;
    
    	while (true)
    	{
    		memset(&addrRemote,0,sizeof(addrRemote));
    		int nLen = sizeof(addrRemote);
    
    		//接收来自客户端的NTP请求消息
    		iRet = ::recvfrom(sock, szbuf, 128, 0, (sockaddr*)&addrRemote, &nLen); 
    		if(iRet > 0)
    		{
    			szbuf[iRet] = '\0';
    			printf(" 接收到数据(%s):%s \n", ::inet_ntoa(addrRemote.sin_addr), szbuf);
    		}
    
    		//base64解码消息
    		Base64Decode(szbuf, szTimeValue, 0);
    		
    		//构造NTP请求应答数据包
    		memset(&ntpPacket,0,sizeof(ntpPacket));
    		memcpy(ntpPacket.c,szTimeValue,sizeof(ntpPacket));
    		ntpPacket.ntp.mode = 4;
    		ntpPacket.ntp.transmit_timestamp.coarse = _time32(NULL);
    		memset(szTimeValue,0,sizeof(szTimeValue));
    
    		//Base64编码NTP请求应答消息
    		Base64Encode((unsigned char *)ntpPacket.c,sizeof(NTP_PACKET_T),szTimeValue);
    
    		//填写远程地址信息
    		addrRemote.sin_family = AF_INET;
    		addrRemote.sin_port = htons(4567);
    		addrRemote.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    
    		//发送NTP请求应答消息
    		iRet = ::sendto(sock, szTimeValue, strlen(szTimeValue), 0, (sockaddr*)&addrRemote, sizeof(addrRemote));
    		if ( SOCKET_ERROR == iRet )
    		{
    			printf("Failed sendto() sock %d \n", ::WSAGetLastError());
    			closesocket(sock);
    			return -1;
    		}
    		else
    		{
    			printf("Successed sendto sock = %d, data lenth = %d \n", sock, iRet);
    		}
    	}
    
    	return 0;
    }
    
    int main(int argc, char* argv[])
    {
    	WSADATA wsaData;
    	WORD sockVersion = MAKEWORD(2, 2);
    	if(::WSAStartup(sockVersion, &wsaData) != 0)
    	{
    		exit(0);
    	}
    	
    	SOCKET sock;
    	int iRet = StartNtpServer(sock);
    	if (0 != iRet)
    	{
    		printf("start ntp server failed. \n");
    	}
    
    	system("pause");
    	closesocket(sock);
    	::WSACleanup();	
    	return 0;
    }
    
    


        上述代码代码在VC2005环境中已测试通过,以下是客户端和服务端程序截图:

    客户端

    服务端

    展开全文
  • 时钟同步MATLAB实现

    2018-04-10 09:38:25
    主要通过MATLAB实现时钟同步,进行仿真分析。本系统采用前导符号作为定时同步符号,前导符号采用CAZAC序列。
  • 局域网时钟同步

    2014-07-17 11:23:15
    实现集群内服务器的时钟同步,很简单的几步就能实现时钟同步,而且不用连外网
  • 利用IEEE 1588和 Blackfin 嵌入式处理器实现设备时钟同步
  • AIMS系统实现GPS时钟同步方法.pdf
  • 利用GPS时钟及NTP实现广电网络时钟同步.pdf
  • java实现时钟同步程序

    热门讨论 2011-01-27 16:58:27
    时间同步 linux NTP 时钟同步 同步 最近做一个项目,发现几台Linux服务器的时间都有严重偏差,本想启用NTP时间同步服务,但是想到自己是个程序员,这些事情自己写程序来实现倒是蛮有趣,所以就有了这个小程序. 将这个...
  • 可以采用同步以太网、IEEE 1588v2、网络时间协议(NTP)等多种技术实现时钟同步。同步以太网标准的同步状态信息(SSM)算法存在时钟成环,以及难以对节点跟踪统计的问题。中兴通讯提出了一种扩展SSM算法可以改进时钟...
  • 详细分析了IEEE1588时钟同步的基本原理,介绍了阿尔卡特朗讯TSS-5产品中实现IEEE1588时钟同步系统的方案,给出具体的硬件架构框图以及系统功能框图,最后列出TSS-5网元在实验室做的时间性能实验。实验结果表明TSS-5 ...
  • 倍福EL6692实现2台CX的时钟同步
  • 利用GPS实现控制系统时钟同步.pdf
  • IEEE1588时钟同步实现方式研究,对于RTP协议的研究非常有帮助,可以精确到微妙级别,欢迎研发人员借鉴
  • 然后通过建立协议的有色Petri 网模型, 利用状态方程等工具针对不安全状态的可达性进行判断分析, 从而实现时钟同步协议的安全性分析; 最后具体分析了一种基于精密时钟同步协议(PTP) 的时钟同步协议以及针对该协议的...
  • 该实验报告研究了基于两个linux系统(centos系统与ubuntu系统)的时钟同步,从ntp的安装到实现时钟同步的过程,并包含一些易错点和注意事项,以及未来研究方向。
  • 可以采用同步以太网、IEEE 1588v2、网络时间协议(NTP)等多种技术实现时钟同步。同步以太网标准的同步状态信息(SSM)算法存在时钟成环,以及难以对节点跟踪统计的问题。中兴通讯提出了一种扩展SSM算法可以改进时钟同步...
  • 采用STM32F407+DP83848及PTPd协议栈实现支持IEEE1588V2协议的采集节点,通过井下工业环网将北斗的绝对时钟同步到各采集节点;本地后备时钟采用STM32F407内部RTC(实时时钟)实现,给各采集节点提供秒级精度的时间戳...
  • 在介绍IEEE1588精确时钟协议基本原理的基础上,提出了使用具有IEEE1588协议硬件支持功能的DP83640以太网物理层收发器在基于ARM-WinCE的嵌入式系统平台上实现时钟同步的设计方案,给出了硬件设计的接口电路和软件设计...
  • 给出一个基于Windows操作系统的计算机网络同步时钟实现方案,该方案可以有效提高计算机时钟同步精度,在LAN中时钟同步精度达250 μs。同时采用了校正时钟频率误差算法,校正后的时钟长期计时误差能达到10天少于1 s。
  • 测试与测量、电信和多媒体流处理等许多不同应用,都开始首选这种时钟同步方法。这种标准化时钟同步法成本效益高,支持异构系统,并可提供纳秒级同步精度。  本文介绍原版IEEE 1588-2002标准以及更新版本IEEE 1588-...
  • 可以采用同步以太网、IEEE 1588v2、网络时间协议(NTP)等多种技术实现时钟同步。同步以太网标准的同步状态信息(SSM)算法存在时钟成环,以及难以对节点跟踪统计的问题。中兴通讯提出了一种扩展SSM算法可以改进时钟...
  • 全网目前最好的,基于windows下写的四次握手ptp时钟同步程序,自动对时钟偏差进行修正,并计算双向延迟,实现毫秒级精度。修改时间需要提前关闭系统的自动对时功能,并用管理员方式打开程序。
  • 摘 要:本文介绍了一种基于嵌入式微控制器MSP430构建的嵌入式同步时钟系统的设计与实现方案,在实现了网络时钟同步的基础上又提供了方便易用的网络管理接口。关键词:同步时钟;MSP430单片机;数字锁相环;CPLD ...
  • 基于TMS320DM642的硬件实现IEEE1588时钟同步.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,313
精华内容 31,325
关键字:

怎么实现时钟同步