【物联网】QCA4010之SNTP协议
生活随笔
收集整理的這篇文章主要介紹了
【物联网】QCA4010之SNTP协议
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【SNTP協(xié)議簡(jiǎn)介】
在一些特定的場(chǎng)景中,經(jīng)常需要整個(gè)網(wǎng)絡(luò)中的計(jì)算機(jī)保持時(shí)間同步。例如,空中管制系統(tǒng)或者軌道交通控制系統(tǒng)中的計(jì)算機(jī)的時(shí)間需要保持精確同步。在大型計(jì)算機(jī)系統(tǒng)中,往往由很多臺(tái)計(jì)算機(jī)共同執(zhí)行某個(gè)計(jì)算,也需要各臺(tái)計(jì)算機(jī)保持時(shí)間同步。那么,我們通過(guò)什么方法來(lái)同步這些計(jì)算機(jī)的時(shí)間呢? ? ? 科學(xué)家發(fā)明了一種叫做NTP的網(wǎng)絡(luò)時(shí)間協(xié)議。網(wǎng)絡(luò)時(shí)間協(xié)議是一種在網(wǎng)絡(luò)計(jì)算機(jī)上同步計(jì)算機(jī)時(shí)間的的協(xié)議,它具有高度的精確性(能精確到幾十毫秒),但是算法非常復(fù)雜。實(shí)際上,在很多應(yīng)用場(chǎng)景中,并不需要這么高的精確度,通常只要達(dá)到秒級(jí)的精確度就足夠了。于是,科學(xué)家在NTP的基礎(chǔ)上推出了SNTP(簡(jiǎn)單網(wǎng)絡(luò)時(shí)間協(xié)議,Simple Network Time Protocol)。SNTP大大簡(jiǎn)化了NTP協(xié)議,同時(shí)也能保證時(shí)間達(dá)到一定的精確度。在實(shí)際應(yīng)用中,SNTP協(xié)議主要被用來(lái)同步因特網(wǎng)上計(jì)算機(jī)的時(shí)間。
夏時(shí)制,夏時(shí)令(Daylight Saving Time:DST),又稱“日光節(jié)約時(shí)制”和“夏令時(shí)間”,是一種為節(jié)約能源而人為規(guī)定地方時(shí)間的制度,在這一制度實(shí)行期間所采用的統(tǒng)一時(shí)間稱為“夏令時(shí)間”。一般在天亮早的夏季人為將時(shí)間提前一小時(shí),可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個(gè)采納夏時(shí)制的國(guó)家具體規(guī)定不同。目前全世界有近110個(gè)國(guó)家每年要實(shí)行夏令時(shí)。
【注意事項(xiàng)】
中國(guó)大陸、中國(guó)香港、中國(guó)澳門、中國(guó)臺(tái)灣、蒙古國(guó)、新加坡、馬來(lái)西亞、菲律賓、西澳大利亞州的時(shí)間與UTC的時(shí)差均為+8,也就是UTC+8。
【工作原理】
【相關(guān)API】 頭文件:qcom/qcom_sntp.h void qcom_enable_sntp_client(int enable); //使能或關(guān)閉SNTP客戶端 void qcom_sntp_srvr_addr(int flag,char* srv_addr); ?//配置SNTP服務(wù)器的地址 void qcom_sntp_zone(int hour,int min,int add_sub,int enable);//配置SNTP時(shí)區(qū) void qcom_sntp_get_time(A_UINT8 device_id, tSntpTime* time); //獲取SNTP時(shí)間 void qcom_sntp_show_config(); ?//查看配置信息 void qcom_sntp_get_time_of_day(A_UINT8 device_id, tSntpTM* time);//獲取時(shí)間 void qcom_sntp_query_srvr_address(A_UINT8 device_id, SNTP_QUERY_SRVR_ADDRESS* addr); //查詢SNTP地址
【編程步驟】 1. 使能sntp客戶端 2. 配置sntp的時(shí)區(qū)信息 3. 獲取sntp的時(shí)間
【注意】 ceac_sntp_client_enable(DEV_ID, 1); ? ? ?qcom_thread_msleep(5000); ?//前后一定要睡眠 否則獲取的時(shí)間是默認(rèn)的 ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ; ? ? ?qcom_thread_msleep(5000) ?//前后一定要睡眠 否則獲取的時(shí)間是默認(rèn)的 ceac_sntp_show_information(DEV_ID); ceac_sntp_get_time(DEV_ID); 測(cè)試的時(shí)候,要確保開發(fā)板已經(jīng)連接上Wifi,否則獲取的時(shí)間值是默認(rèn)的時(shí)間值。
【參考代碼】
第一步:sntp客戶端使能 /**@function: enable sntp client**@param: 1:enable 0: disable**@return none*/ void ceac_sntp_client_enable(A_UINT8 device_id, int enable) {//enable SNTP at run timeqcom_enable_sntp_client(enable); }
第二步:設(shè)置sntp的時(shí)區(qū)信息
/**@function: Configure SNTP time zone and enable/disable day light saving**@param: utc eg:UTC+05:30*@param: dls_en "disable" or enable*@return none*/ void ceac_config_sntp_zone(A_UINT8 device_id, A_CHAR* utc, A_CHAR* dls_en) {int flag = 0;int hour = 0, min = 0;int add_sub;char hr[3], mn[3], parsing_hour_min[10];if (A_STRLEN(utc) > 9){A_PRINTF("Error : Invalid UTC string. Valid string(UTC+hour:min).Eg UTC+05:30\n\r");return;}if (A_STRLEN(dls_en) > 8){A_PRINTF("Error : Invalid DSE string.Valid string enable/disable \n\r");}A_STRCPY(parsing_hour_min, utc);//UTC+xx:xx or UTC-xx:xxif (A_STRLEN(parsing_hour_min) != 9){A_PRINTF("Error : UTC time format should be UTC+XX:XX or UTC-XX:XX\n");A_PRINTF("Hour from 00 to -12/+13, minute should be 0, 30 or 45\n\r");return;}//parse the hourhr[0] = parsing_hour_min[4];hr[1] = parsing_hour_min[5];hr[2] = '\0';hour = (hr[0] - '0') * 10 + (hr[1] - '0');//parse the minuesmn[0] = parsing_hour_min[7];mn[1] = parsing_hour_min[8];mn[2] = '\0';min = (mn[0] - '0') * 10 + (mn[1] - '0');if (0 != min && 30 != min && 45 != min){A_PRINTF("Error : UTC time offset in minutes should be 0, 30 or 45\n\r");return;}//valid time zone: -12,-11, ...., +13if ('+' == parsing_hour_min[3]){add_sub = 1; // time is to be addedif (hour > 13 || ((13 == hour) && (min > 0))){A_PRINTF("Error : UTC time offset in hour from -12 to +13\n\r");return;}}else if ('-' == parsing_hour_min[3]){add_sub = 0; // time is to be substracted if((hour > 12) || ((12 == hour) && (min > 0))){A_PRINTF("Error : UTC time offset in hour from -12 to +13\n\r");return;}}else{A_PRINTF("Error: Only +/- operation is allowed\n");return ;}//wether disable or enable day light savingif (!A_STRCMP(dls_en, "enable"))flag = 1; //enableelse if (!A_STRCMP(dls_en, "disable"))flag = 0;else{A_PRINTF("DSE(day light saving) input parameter should be enable or disable !\n");return;}A_PRINTF("------>qcom_sntp_zone hour: %d min: %d add_sub: %d flag: %d\n", hour, min, add_sub, flag);qcom_sntp_zone(hour, min, add_sub, flag);return; }
第三步:獲取時(shí)間 /**@function: Get SNTP time***@return none*/ void ceac_sntp_get_time(A_UINT8 device_id) {tSntpTime time;char *months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};char *Day[7] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};qcom_sntp_get_time(device_id, &time);A_PRINTF("\nRTC TimeStamp: %s %s %d %d %d:%d:%d\n", Day[time.wday], months[time.mon], time.yday, time.year, time.hour, time.min, time.Sec);return; }
第四步:測(cè)試程序 void sntp_task(unsigned long which_thread) {// just test SNTP client#define DEV_ID 0 ceac_sntp_client_enable(DEV_ID, 1);//Note that: must sleep serval seconds, or it will config errorqcom_thread_msleep(5000);ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ;qcom_thread_msleep(5000);ceac_sntp_get_time(DEV_ID); } 【測(cè)試環(huán)境】
Win7 + QCA4010開發(fā)板 + Xshell
【測(cè)試結(jié)果】 顯示當(dāng)前正確的時(shí)間
在一些特定的場(chǎng)景中,經(jīng)常需要整個(gè)網(wǎng)絡(luò)中的計(jì)算機(jī)保持時(shí)間同步。例如,空中管制系統(tǒng)或者軌道交通控制系統(tǒng)中的計(jì)算機(jī)的時(shí)間需要保持精確同步。在大型計(jì)算機(jī)系統(tǒng)中,往往由很多臺(tái)計(jì)算機(jī)共同執(zhí)行某個(gè)計(jì)算,也需要各臺(tái)計(jì)算機(jī)保持時(shí)間同步。那么,我們通過(guò)什么方法來(lái)同步這些計(jì)算機(jī)的時(shí)間呢? ? ? 科學(xué)家發(fā)明了一種叫做NTP的網(wǎng)絡(luò)時(shí)間協(xié)議。網(wǎng)絡(luò)時(shí)間協(xié)議是一種在網(wǎng)絡(luò)計(jì)算機(jī)上同步計(jì)算機(jī)時(shí)間的的協(xié)議,它具有高度的精確性(能精確到幾十毫秒),但是算法非常復(fù)雜。實(shí)際上,在很多應(yīng)用場(chǎng)景中,并不需要這么高的精確度,通常只要達(dá)到秒級(jí)的精確度就足夠了。于是,科學(xué)家在NTP的基礎(chǔ)上推出了SNTP(簡(jiǎn)單網(wǎng)絡(luò)時(shí)間協(xié)議,Simple Network Time Protocol)。SNTP大大簡(jiǎn)化了NTP協(xié)議,同時(shí)也能保證時(shí)間達(dá)到一定的精確度。在實(shí)際應(yīng)用中,SNTP協(xié)議主要被用來(lái)同步因特網(wǎng)上計(jì)算機(jī)的時(shí)間。
夏時(shí)制,夏時(shí)令(Daylight Saving Time:DST),又稱“日光節(jié)約時(shí)制”和“夏令時(shí)間”,是一種為節(jié)約能源而人為規(guī)定地方時(shí)間的制度,在這一制度實(shí)行期間所采用的統(tǒng)一時(shí)間稱為“夏令時(shí)間”。一般在天亮早的夏季人為將時(shí)間提前一小時(shí),可以使人早起早睡,減少照明量,以充分利用光照資源,從而節(jié)約照明用電。各個(gè)采納夏時(shí)制的國(guó)家具體規(guī)定不同。目前全世界有近110個(gè)國(guó)家每年要實(shí)行夏令時(shí)。
【注意事項(xiàng)】
中國(guó)大陸、中國(guó)香港、中國(guó)澳門、中國(guó)臺(tái)灣、蒙古國(guó)、新加坡、馬來(lái)西亞、菲律賓、西澳大利亞州的時(shí)間與UTC的時(shí)差均為+8,也就是UTC+8。
【工作原理】
SNTP協(xié)議采用客戶端/服務(wù)器的工作方式,可以采用單播(點(diǎn)對(duì)點(diǎn))或者廣播(一點(diǎn)對(duì)多點(diǎn))模式操作。SNTP服務(wù)器通過(guò)接收GPS信號(hào)或自帶的原子鐘作為系統(tǒng)的時(shí)間基準(zhǔn)。單播模式下,SNTP客戶端能夠通過(guò)定期訪問(wèn)SNTP服務(wù)器獲得準(zhǔn)確的時(shí)間信息,用于調(diào)整客戶端自身所在系統(tǒng)的時(shí)間,達(dá)到同步時(shí)間的目的。廣播模式下,SNTP服務(wù)器周期性地發(fā)送消息給指定的IP廣播地址或者IP多播地址。SNTP客戶端通過(guò)監(jiān)聽這些地址來(lái)獲得時(shí)間信息。 網(wǎng)絡(luò)中一般存在很多臺(tái)SNTP服務(wù)器,客戶端會(huì)通過(guò)一定的算法選擇最好的幾臺(tái)服務(wù)器使用。如果一臺(tái)SNTP服務(wù)器在工作過(guò)程中失去了外部時(shí)間源,此時(shí)SNTP服務(wù)器會(huì)告訴SNTP客戶端“我失去了外部時(shí)間”。當(dāng)SNTP客戶端收到這個(gè)信息時(shí),就會(huì)丟棄發(fā)生故障的SNTP服務(wù)器發(fā)給它的時(shí)間信息,然后重新選擇其他的SNTP服務(wù)器。
【相關(guān)API】 頭文件:qcom/qcom_sntp.h void qcom_enable_sntp_client(int enable); //使能或關(guān)閉SNTP客戶端 void qcom_sntp_srvr_addr(int flag,char* srv_addr); ?//配置SNTP服務(wù)器的地址 void qcom_sntp_zone(int hour,int min,int add_sub,int enable);//配置SNTP時(shí)區(qū) void qcom_sntp_get_time(A_UINT8 device_id, tSntpTime* time); //獲取SNTP時(shí)間 void qcom_sntp_show_config(); ?//查看配置信息 void qcom_sntp_get_time_of_day(A_UINT8 device_id, tSntpTM* time);//獲取時(shí)間 void qcom_sntp_query_srvr_address(A_UINT8 device_id, SNTP_QUERY_SRVR_ADDRESS* addr); //查詢SNTP地址
【編程步驟】 1. 使能sntp客戶端 2. 配置sntp的時(shí)區(qū)信息 3. 獲取sntp的時(shí)間
【注意】 ceac_sntp_client_enable(DEV_ID, 1); ? ? ?qcom_thread_msleep(5000); ?//前后一定要睡眠 否則獲取的時(shí)間是默認(rèn)的 ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ; ? ? ?qcom_thread_msleep(5000) ?//前后一定要睡眠 否則獲取的時(shí)間是默認(rèn)的 ceac_sntp_show_information(DEV_ID); ceac_sntp_get_time(DEV_ID); 測(cè)試的時(shí)候,要確保開發(fā)板已經(jīng)連接上Wifi,否則獲取的時(shí)間值是默認(rèn)的時(shí)間值。
【參考代碼】
第一步:sntp客戶端使能 /**@function: enable sntp client**@param: 1:enable 0: disable**@return none*/ void ceac_sntp_client_enable(A_UINT8 device_id, int enable) {//enable SNTP at run timeqcom_enable_sntp_client(enable); }
第二步:設(shè)置sntp的時(shí)區(qū)信息
/**@function: Configure SNTP time zone and enable/disable day light saving**@param: utc eg:UTC+05:30*@param: dls_en "disable" or enable*@return none*/ void ceac_config_sntp_zone(A_UINT8 device_id, A_CHAR* utc, A_CHAR* dls_en) {int flag = 0;int hour = 0, min = 0;int add_sub;char hr[3], mn[3], parsing_hour_min[10];if (A_STRLEN(utc) > 9){A_PRINTF("Error : Invalid UTC string. Valid string(UTC+hour:min).Eg UTC+05:30\n\r");return;}if (A_STRLEN(dls_en) > 8){A_PRINTF("Error : Invalid DSE string.Valid string enable/disable \n\r");}A_STRCPY(parsing_hour_min, utc);//UTC+xx:xx or UTC-xx:xxif (A_STRLEN(parsing_hour_min) != 9){A_PRINTF("Error : UTC time format should be UTC+XX:XX or UTC-XX:XX\n");A_PRINTF("Hour from 00 to -12/+13, minute should be 0, 30 or 45\n\r");return;}//parse the hourhr[0] = parsing_hour_min[4];hr[1] = parsing_hour_min[5];hr[2] = '\0';hour = (hr[0] - '0') * 10 + (hr[1] - '0');//parse the minuesmn[0] = parsing_hour_min[7];mn[1] = parsing_hour_min[8];mn[2] = '\0';min = (mn[0] - '0') * 10 + (mn[1] - '0');if (0 != min && 30 != min && 45 != min){A_PRINTF("Error : UTC time offset in minutes should be 0, 30 or 45\n\r");return;}//valid time zone: -12,-11, ...., +13if ('+' == parsing_hour_min[3]){add_sub = 1; // time is to be addedif (hour > 13 || ((13 == hour) && (min > 0))){A_PRINTF("Error : UTC time offset in hour from -12 to +13\n\r");return;}}else if ('-' == parsing_hour_min[3]){add_sub = 0; // time is to be substracted if((hour > 12) || ((12 == hour) && (min > 0))){A_PRINTF("Error : UTC time offset in hour from -12 to +13\n\r");return;}}else{A_PRINTF("Error: Only +/- operation is allowed\n");return ;}//wether disable or enable day light savingif (!A_STRCMP(dls_en, "enable"))flag = 1; //enableelse if (!A_STRCMP(dls_en, "disable"))flag = 0;else{A_PRINTF("DSE(day light saving) input parameter should be enable or disable !\n");return;}A_PRINTF("------>qcom_sntp_zone hour: %d min: %d add_sub: %d flag: %d\n", hour, min, add_sub, flag);qcom_sntp_zone(hour, min, add_sub, flag);return; }
第三步:獲取時(shí)間 /**@function: Get SNTP time***@return none*/ void ceac_sntp_get_time(A_UINT8 device_id) {tSntpTime time;char *months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};char *Day[7] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};qcom_sntp_get_time(device_id, &time);A_PRINTF("\nRTC TimeStamp: %s %s %d %d %d:%d:%d\n", Day[time.wday], months[time.mon], time.yday, time.year, time.hour, time.min, time.Sec);return; }
第四步:測(cè)試程序 void sntp_task(unsigned long which_thread) {// just test SNTP client#define DEV_ID 0 ceac_sntp_client_enable(DEV_ID, 1);//Note that: must sleep serval seconds, or it will config errorqcom_thread_msleep(5000);ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ;qcom_thread_msleep(5000);ceac_sntp_get_time(DEV_ID); } 【測(cè)試環(huán)境】
Win7 + QCA4010開發(fā)板 + Xshell
【測(cè)試結(jié)果】 顯示當(dāng)前正確的時(shí)間
總結(jié)
以上是生活随笔為你收集整理的【物联网】QCA4010之SNTP协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【物联网】QCA4010开发环境的搭建
- 下一篇: 【物联网】WiFi基础知识