摘要:本文阐述了在欧视迈(OZEAM)全数字可视对讲系统中进行internet校时的必要性和实现途径
关键词:internet校时全数字可视对讲系统欧视迈OZEAMRFC-868
Abstract:Thispaperexplainedthenecessityandtheimplementationtosynchronizethesystemclockoftheoutdoorunitandtheindooruintinthedigitalvideointercomsystem(brand:OZEAM)usinganNTP(networktimeprotocol)server.
Keywords:timesynchronizing,NTP(networktimeprotocol),digitalvideointercomsystem,OZEAM.
1.全数字可视对讲系统校时的现状
目前全数字可视对讲系统主要通过以下方法进行校时:
(1)在安装有管理中心的情况下,管理中心充当时间服务器,门口机和室内机与管理中心通讯,获取当前时间来设置本机时间。
(2)在没有安装管理中心的情况下,只能在门口机和室内机上手动设置本机时间。但一旦断电,又恢复到初始时间。这给用户带来不便,特别是单家独户的别墅用户,一般是不可能安装管理中心的。
没有安装管理中心但全数字可视对讲门口机和室内机已连接互联网,能不能通过互联网进行自动校时?答案是肯定的。
2.RFC-868时间协议
本RFC规范了一个ARPAInternetcommunity上的标准。在ARPAInternet上的所有主机应当采用和实现这个标准。
此协议提供了一个独立于站点的,机器可读的日期和时间信息。时间服务返回的是以秒数,是从1900年1月1日午夜到现在的秒数。
设计这个协议的一个重要目的在于,网络上的许多主机并没有时间的观念,在分布式的系统上,我们可以想一想,北京的时间和东京的时间如何分呢?主机的时间往往可以人为改变,而且因为机器时钟内的误差而变得不一致,因此需要使用时间服务器通过选举方式得到网络时间,让服务器有一个准确的时间观念。不要小看时间,这对于一些以时间为标准的分布运行的程序简单是太重要了。
这个协议可以工作在TCP和UDP协议下。下面是通过TCP协议工作的时间协议的工作过程:这里S代表服务器,C代表客户。
S:检测端口37
U:连接到端口37
S:以32位二进制数发送时间
U:接收时间
U:关闭连接
S:关闭连接
服务器在端口37上监听连接。当连接建立后,服务器返回一个32位的时间值,然后关闭连接。这个过程也不难,如果服务器不能决定现在是什么时间,服务器会拒绝连接或不发送任何数据而直接关闭连接。
下面我们看看使用UDP协议的情况:这里S代表服务器,C代表客户。
S:检测端口37
U:发送一个空数据报到端口37
S:接收这个空数据报
S:发送包含32位二进制数(用于表示时间)的数据报
U:接收时间数据报
服务器在端口37上监听数据包。当一个数据包来后,服务器返回一个包含32位的时间的数据包。这个过程也不难,如果服务器不能决定现在是什么时间,服务器会抛弃接收到的数据报而不作出任何应答。
*时间
时间是由32位表示的,是自1900年1月1日0时到当前的秒数,我们可以计算一下,这个协议只能表示到2036年就不能用了。(但是我们也知道计算机发展速度这么快,可能到时候就会有更好的协议代替这个协议,或者有已经想出有效的解决办法了。)
下面是些例子:
thetime2,208,988,800correspondsto00:001Jan1970GMT,
2,398,291,200correspondsto00:001Jan1976GMT,
2,524,521,600correspondsto00:001Jan1980GMT,
2,629,584,000correspondsto00:001May1983GMT,
以及-1,297,728,000correspondsto00:0017Nov1858GMT.
3.Internet校时的程序实现
下面是使用TCP协议的实现Internet校时的部分代码。
voidtime_internet_to_local(void*recv_buf)//接到的数据转换为本地时间
{
assert(recv_buf);
charp[4],*precv=((char*)recv_buf)+3;
for(inti=0;i<4;i++)< p="">
p[i]=*precv--;
*(long*)p-=2208988800;
SYSTEMTIMEst;
tm*ptm=gmtime((time_t*)p);
st.wYear=ptm->tm_year+1900;
st.wMonth=ptm->tm_mon+1;
st.wDay=ptm->tm_mday;
st.wHour=ptm->tm_hour;
st.wMinute=ptm->tm_min;
st.wSecond=ptm->tm_sec;
st.wMilliseconds=0;
SetSystemTime(&st);
}
BOOLGetTimeFromServer(DWORD*lpdwTime)//TCP方式
{
*lpdwTime=0;
BOOLbReturn=FALSE;
SOCKETsSock=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET!=sSock)
{
structsockaddr_insin;
memcpy(&sin.sin_addr,&NISTSVRSARY[choice].addr,sizeof(in_addr));
sin.sin_family=AF_INET;
sin.sin_port=htons(IPPORT_TIMESERVER);
wprintf(L"\n...waitingtolink...\n");
if(0!=connect(sSock,(structsockaddr*)&sin,sizeof(structsockaddr_in)))
{
wprintf(L"Linked.Receivingdata...\n");
intiResult;
iResult=recv(sSock,(char*)lpdwTime,4,0);
if(iResult==4)
{
*lpdwTime=ntohl(*lpdwTime);
bReturn=TRUE;
}
else
{
wprintf(L"Failtogettime!iResult=%d\n",iResult);
}
}else
wprintf(L"Failtolink,overtime!\n");
closesocket(sSock);
}
returnbReturn;
}
4.结束语
程序在EVC4.0编写调试正确,并在WinCE5.0下运行正确。只要门口机或室内机连接Internet,则自动进行校时,无需手动设置,也无需安装管理中心。
Internet自动校时为欧视迈(OZEAM)全数字可视对讲系统增色不少。
4000-020-230