999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

如何在VxWorks下實現SNTP同步對時功能

2012-12-31 00:00:00陳利葉順流
科技創新導報 2012年9期

摘要:本文闡述了在VxWorks嵌入式實時操作系統下如何實現SNTP(Simple Network Time Protocol)網絡時間協議的服務器端和客戶端的功能的開發,關鍵點為服務器端獲取可靠時鐘源的鉤子函數sntpsClockHook()的編寫。

關鍵詞:VxWorksSNTP服務器SNTP客戶端鉤子函數

中圖分類號:TP399 文獻標識碼:A 文章編號:1674-098X(2012)03(c)-0000-00

1 前言

SNTP是簡單網絡時間協議(Simple Network Time Protocol)的簡稱,是由網絡時間協議NTP(Network Time Protocol)簡化而來,是一種使Internet上的計算機保持時間同步的一種通信協議,可通過提供完全的機制來訪問國際標準時間,廣泛用于需要精確時間同步的場合。

VxWorks嵌入式實時操作系統的網絡組件(network components)支持SNTP網絡對時協議,用戶要在該系統下實現SNTP對時功能,并不需要關心協議本身,只需把SNTP客戶端和SNTP服務器端這兩個組件分別包括進來,再調用相應的VxWorks API函數,即可分別實現SNTP客戶端和服務器端的對時功能。

2 SNTP服務器的實現

SNTP 服務器端有兩種工作模式,主動模式(SNTP_ACTIVE)和被動模式(SNTP_PASSIVE),VxWorks操作系統啟動時會自動調用SNTP初始化函數sntpsInit( ),設置服務器的工作模式(SNTPS_MODE)、廣播時間間隔(SNTPS_INTERVAL)、目標IP地址(SNTPS_DSTADDR)和SNTP端口號(SNTP_PORT)等。

如果服務器工作模式選為被動模式(SNTP_PASSIVE),則服務器將等待來自客戶端的請求,并發送包含NTP時間戳的回應幀。如果選擇主動模式(SNTP_ACTIVE),則服務器端在固定的時間間隔周期性的發送NTP時間戳信息。

當采用主動模式時,SNTP服務器根據SNTPS_DSTADDR 和 SNTPS_INTERVAL的值來決定目標的IP地址和廣播的時間間隔。默認情況下,服務器每隔64秒廣播發送一次時間戳信息。SNTPS_DSTADDR 和 SNTPS_INTERVAL的值可以通過sntpsConfigSet()函數來進行設置。SNTP服務器工作在主動模式下時仍然響應客戶端的請求。

SNTP服務器需要獲得一個外部可靠的時鐘源,可通過調用API函數sntpsClockSet( )來獲取,其聲明為:

STATUS sntpsClockSet

(

FUNCPTRpClockHookRtn /* new interface to reference clock */

)

也就是說,sntpsClockSet( )通過安裝一個鉤子函數來獲取參考時鐘的值,該鉤子函數必須采用如下的接口方式:

STATUS sntpsClockHook (int request, void *pBuffer);

這個鉤子函數需要用戶自己編寫來獲取參考時鐘的值:如果request的值為SNTPS_ID,則pBuffer區域填寫根據RFC1769標準格式定義的32位參考標識符;如果request的值為SNTPS_RESOULTION,則pBuffer區域填寫32位的時鐘精度;如果request的值為SNTPS_TIME,則pBuffer區域填寫64位的NTP時間戳。最后還需調用API函數sntpsNsecToFraction( )將納秒級的時間戳轉化為NTP協議格式需要的小數部分。

sntpsClockHook()函數的正確編寫是實現SNTP時間服務器功能的關鍵,需要實現SNTPS_ID, SNTPS_RESOLUTION和SNTPS_TIME三個請求類型,客戶端決定用哪個類型進行請求,在系統啟動時應通調用API函數sntpsClockSet( )來掛接sntpsClockHook()函數。以下為sntpsClockHook函數的實現以及掛接方式:

STATUS sntpsClockHook(int request, void *buffer)

{

struct timespec timeval;

long value;

ULONG *pTime;

if (request == SNTPS_ID)

{

strcpy ((char *)buffer, \"pps\");

return (OK);

}

if (request == SNTPS_RESOLUTION)

{

if (clock_getres (CLOCK_REALTIME, timeval) == -1)

return (ERROR);

value = timeval.tv_nsec;

*((ULONG *)buffer) = (ULONG)value;

}

if (request == SNTPS_TIME)

{

if (clock_gettime (CLOCK_REALTIME, timeval) == -1)

return (ERROR);

pTime = (ULONG *)buffer;

/* Copy number of seconds since 1900 to timestamp. */

*pTime++ = timeval.tv_sec + SNTP_UNIX_OFFSET;

/* Convert nanoseconds to fractional part and copy to timestamp */

*pTime = sntpsNsecToFraction (timeval.tv_nsec);

}

return (OK);

}

STATUS sntpsConfig (void)

{

if (sntpsClockSet ((FUNCPTR)sntpsClockHook) != OK)

return(ERROR);

return(OK);

}

其中,clock_getres()是獲取系統相對時間精度的API函數,clock_gettime()是獲取系統相對時間的API函數,sntpsNsecToFraction()是將單位為納秒的時間轉換成NTP時間戳格式所需要的小數部分。

SNTP服務器端的時間精度取決于時鐘源的時鐘精度,在此由于采用的時鐘源為操作系統時間,故取決于操作系統的時間精度。對于VxWorks嵌入式操作系統,這個精度由硬件上時鐘芯片的精度來決定。

3 SNTP客戶端的實現

SNTP客戶端的實現相對要簡單一些,只需調用API函數sntpcTimeGet()即可,其函數聲明為:

STATUS sntpcTimeGet

(

char *pServerAddr, /* server IP address or hostname */

u_int timeout, /* timeout interval in ticks */

struct timespec * pCurrTime/* storage for retrieved time value */

)

SNTP服務器發送的時間首先被轉化為格林尼治標準時間1970年1月1日0時0分以來所經過的時間,再存放在該函數的參數pCurrTime指針指向的地址區域。參數pServerAddr為服務器的IP地址,如果該參數為NULL,則sntpcTimeGet()函數偵聽來自SNTP服務器以廣播模式發送的時間消息,否則,該函數向指定的服務器發送請求,并將服務器返回的時間信息提取出來,存放在pCurrTime指針指向的地址區域。如果客戶端在參數timeout規定的時間內未接收到時間消息,則該函數返回ERROR值,否則返回OK。一般來說,SNTP服務器在廣播方式下每隔64秒到1024秒發送一次對時消息。

以下為API函數sntpcTimeGet()的使用方法:

struct timespec tspec;

STATUS sntpc_status= ERROR;

STATUS settime_status= ERROR;

time_t li_curr_time = 0;

sntpc_status = sntpcTimeGet(NULL, SNTP_TIMEOUT, tspec);

if (sntpc_status != OK)

{

printf(\"sntpcTimeGet failed\\");

printf(\"Returned sntpc_status: %i errno: %s\\", sntpc_status, strerror(errno));

}

else

{

/*Set clock to received date and time*/

settime_status = clock_settime(CLOCK_REALTIME, tspec);

if (settime_status != OK)

{

printf(\"clock_settime failed\\");

printf(\"Returned settime_status: %i errno: %s\\", settime_status, strerror(errno));

}

else

{

printf(\"Successfull set the system clock.\\");

}

}

其中,clock_settime()為設置VxWorks系統時間的API函數。

4 結語

本文從客戶端和服務器端兩方面詳細介紹了在嵌入式實時操作系統VxWorks下如何實現SNTP同步對時功能,著重闡述了服務器端獲取可靠時鐘源的鉤子函數sntpsClockHook()的編寫方法,供大家參考。總的來說,用戶通過調用VxWorks系統提供的API函數,即可輕松實現VxWorks下的SNTP對時,避免直接編寫相對比較繁瑣的SNTP協議。

參考文獻

[1] VxWorks API Reference: OS Libraries.

[2] 張揚,于銀濤,VxWorks 內核、設備驅動與BSP開發詳解,人民郵電出版社,2009.

主站蜘蛛池模板: 77777亚洲午夜久久多人| 亚洲人成网站色7799在线播放| 色综合成人| 国产乱人伦AV在线A| 天天综合色网| 国产成人AV男人的天堂| 伊人天堂网| 欧美日一级片| 日韩精品无码免费一区二区三区 | 啦啦啦网站在线观看a毛片| 国产国拍精品视频免费看 | 国产毛片一区| 国产亚洲视频免费播放| 国产哺乳奶水91在线播放| 日本影院一区| 深夜福利视频一区二区| 亚洲国产欧美自拍| 亚洲精品中文字幕无乱码| 四虎亚洲国产成人久久精品| 午夜精品福利影院| 国产午夜无码专区喷水| 99青青青精品视频在线| 日韩大乳视频中文字幕 | 亚洲第一视频区| 午夜激情福利视频| 国产香蕉国产精品偷在线观看| 国产在线无码一区二区三区| 国产在线小视频| 四虎AV麻豆| 久久久噜噜噜| 久久久91人妻无码精品蜜桃HD| 亚洲日本在线免费观看| 亚洲大尺度在线| 亚洲日本在线免费观看| 五月六月伊人狠狠丁香网| 青青久视频| 国产日韩精品一区在线不卡| 日韩经典精品无码一区二区| 免费一级毛片完整版在线看| 国产美女在线免费观看| 国产精欧美一区二区三区| 欧美激情福利| 麻豆精品久久久久久久99蜜桃| 91精品啪在线观看国产60岁| 欧美日韩国产在线观看一区二区三区| 亚洲国产一区在线观看| 国产黄视频网站| 狠狠色婷婷丁香综合久久韩国| 狠狠亚洲五月天| 亚洲色图欧美一区| 四虎国产在线观看| 在线色国产| 91福利在线看| 永久免费AⅤ无码网站在线观看| 国产丝袜啪啪| 欧美啪啪视频免码| 国产亚洲男人的天堂在线观看| 在线欧美日韩国产| 国产精品亚洲五月天高清| 91精品伊人久久大香线蕉| 国产视频大全| 伊人狠狠丁香婷婷综合色| 亚洲最新地址| 成年人国产网站| 999国内精品视频免费| 男女性色大片免费网站| 亚洲精品自拍区在线观看| 五月婷婷精品| 亚洲黄色视频在线观看一区| 国产女人爽到高潮的免费视频| 五月婷婷精品| 国产美女久久久久不卡| 毛片免费试看| 免费一看一级毛片| 精品久久人人爽人人玩人人妻| 免费国产小视频在线观看| 久久久久青草大香线综合精品| 欧美五月婷婷| 精品久久久久久中文字幕女| 一级毛片不卡片免费观看| 欧美五月婷婷| 国产成人精彩在线视频50|