【物联网】QCA4010之SNTP协议
生活随笔
收集整理的這篇文章主要介紹了
【物联网】QCA4010之SNTP协议
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【SNTP協議簡介】
在一些特定的場景中,經常需要整個網絡中的計算機保持時間同步。例如,空中管制系統或者軌道交通控制系統中的計算機的時間需要保持精確同步。在大型計算機系統中,往往由很多臺計算機共同執行某個計算,也需要各臺計算機保持時間同步。那么,我們通過什么方法來同步這些計算機的時間呢? ? ? 科學家發明了一種叫做NTP的網絡時間協議。網絡時間協議是一種在網絡計算機上同步計算機時間的的協議,它具有高度的精確性(能精確到幾十毫秒),但是算法非常復雜。實際上,在很多應用場景中,并不需要這么高的精確度,通常只要達到秒級的精確度就足夠了。于是,科學家在NTP的基礎上推出了SNTP(簡單網絡時間協議,Simple Network Time Protocol)。SNTP大大簡化了NTP協議,同時也能保證時間達到一定的精確度。在實際應用中,SNTP協議主要被用來同步因特網上計算機的時間。
夏時制,夏時令(Daylight Saving Time:DST),又稱“日光節約時制”和“夏令時間”,是一種為節約能源而人為規定地方時間的制度,在這一制度實行期間所采用的統一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間提前一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。各個采納夏時制的國家具體規定不同。目前全世界有近110個國家每年要實行夏令時。
【注意事項】
中國大陸、中國香港、中國澳門、中國臺灣、蒙古國、新加坡、馬來西亞、菲律賓、西澳大利亞州的時間與UTC的時差均為+8,也就是UTC+8。
【工作原理】
【相關API】 頭文件:qcom/qcom_sntp.h void qcom_enable_sntp_client(int enable); //使能或關閉SNTP客戶端 void qcom_sntp_srvr_addr(int flag,char* srv_addr); ?//配置SNTP服務器的地址 void qcom_sntp_zone(int hour,int min,int add_sub,int enable);//配置SNTP時區 void qcom_sntp_get_time(A_UINT8 device_id, tSntpTime* time); //獲取SNTP時間 void qcom_sntp_show_config(); ?//查看配置信息 void qcom_sntp_get_time_of_day(A_UINT8 device_id, tSntpTM* time);//獲取時間 void qcom_sntp_query_srvr_address(A_UINT8 device_id, SNTP_QUERY_SRVR_ADDRESS* addr); //查詢SNTP地址
【編程步驟】 1. 使能sntp客戶端 2. 配置sntp的時區信息 3. 獲取sntp的時間
【注意】 ceac_sntp_client_enable(DEV_ID, 1); ? ? ?qcom_thread_msleep(5000); ?//前后一定要睡眠 否則獲取的時間是默認的 ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ; ? ? ?qcom_thread_msleep(5000) ?//前后一定要睡眠 否則獲取的時間是默認的 ceac_sntp_show_information(DEV_ID); ceac_sntp_get_time(DEV_ID); 測試的時候,要確保開發板已經連接上Wifi,否則獲取的時間值是默認的時間值。
【參考代碼】
第一步: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); }
第二步:設置sntp的時區信息
/**@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; }
第三步:獲取時間 /**@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; }
第四步:測試程序 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); } 【測試環境】
Win7 + QCA4010開發板 + Xshell
【測試結果】 顯示當前正確的時間
在一些特定的場景中,經常需要整個網絡中的計算機保持時間同步。例如,空中管制系統或者軌道交通控制系統中的計算機的時間需要保持精確同步。在大型計算機系統中,往往由很多臺計算機共同執行某個計算,也需要各臺計算機保持時間同步。那么,我們通過什么方法來同步這些計算機的時間呢? ? ? 科學家發明了一種叫做NTP的網絡時間協議。網絡時間協議是一種在網絡計算機上同步計算機時間的的協議,它具有高度的精確性(能精確到幾十毫秒),但是算法非常復雜。實際上,在很多應用場景中,并不需要這么高的精確度,通常只要達到秒級的精確度就足夠了。于是,科學家在NTP的基礎上推出了SNTP(簡單網絡時間協議,Simple Network Time Protocol)。SNTP大大簡化了NTP協議,同時也能保證時間達到一定的精確度。在實際應用中,SNTP協議主要被用來同步因特網上計算機的時間。
夏時制,夏時令(Daylight Saving Time:DST),又稱“日光節約時制”和“夏令時間”,是一種為節約能源而人為規定地方時間的制度,在這一制度實行期間所采用的統一時間稱為“夏令時間”。一般在天亮早的夏季人為將時間提前一小時,可以使人早起早睡,減少照明量,以充分利用光照資源,從而節約照明用電。各個采納夏時制的國家具體規定不同。目前全世界有近110個國家每年要實行夏令時。
【注意事項】
中國大陸、中國香港、中國澳門、中國臺灣、蒙古國、新加坡、馬來西亞、菲律賓、西澳大利亞州的時間與UTC的時差均為+8,也就是UTC+8。
【工作原理】
SNTP協議采用客戶端/服務器的工作方式,可以采用單播(點對點)或者廣播(一點對多點)模式操作。SNTP服務器通過接收GPS信號或自帶的原子鐘作為系統的時間基準。單播模式下,SNTP客戶端能夠通過定期訪問SNTP服務器獲得準確的時間信息,用于調整客戶端自身所在系統的時間,達到同步時間的目的。廣播模式下,SNTP服務器周期性地發送消息給指定的IP廣播地址或者IP多播地址。SNTP客戶端通過監聽這些地址來獲得時間信息。 網絡中一般存在很多臺SNTP服務器,客戶端會通過一定的算法選擇最好的幾臺服務器使用。如果一臺SNTP服務器在工作過程中失去了外部時間源,此時SNTP服務器會告訴SNTP客戶端“我失去了外部時間”。當SNTP客戶端收到這個信息時,就會丟棄發生故障的SNTP服務器發給它的時間信息,然后重新選擇其他的SNTP服務器。
【相關API】 頭文件:qcom/qcom_sntp.h void qcom_enable_sntp_client(int enable); //使能或關閉SNTP客戶端 void qcom_sntp_srvr_addr(int flag,char* srv_addr); ?//配置SNTP服務器的地址 void qcom_sntp_zone(int hour,int min,int add_sub,int enable);//配置SNTP時區 void qcom_sntp_get_time(A_UINT8 device_id, tSntpTime* time); //獲取SNTP時間 void qcom_sntp_show_config(); ?//查看配置信息 void qcom_sntp_get_time_of_day(A_UINT8 device_id, tSntpTM* time);//獲取時間 void qcom_sntp_query_srvr_address(A_UINT8 device_id, SNTP_QUERY_SRVR_ADDRESS* addr); //查詢SNTP地址
【編程步驟】 1. 使能sntp客戶端 2. 配置sntp的時區信息 3. 獲取sntp的時間
【注意】 ceac_sntp_client_enable(DEV_ID, 1); ? ? ?qcom_thread_msleep(5000); ?//前后一定要睡眠 否則獲取的時間是默認的 ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ; ? ? ?qcom_thread_msleep(5000) ?//前后一定要睡眠 否則獲取的時間是默認的 ceac_sntp_show_information(DEV_ID); ceac_sntp_get_time(DEV_ID); 測試的時候,要確保開發板已經連接上Wifi,否則獲取的時間值是默認的時間值。
【參考代碼】
第一步: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); }
第二步:設置sntp的時區信息
/**@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; }
第三步:獲取時間 /**@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; }
第四步:測試程序 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); } 【測試環境】
Win7 + QCA4010開發板 + Xshell
【測試結果】 顯示當前正確的時間
總結
以上是生活随笔為你收集整理的【物联网】QCA4010之SNTP协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【物联网】QCA4010开发环境的搭建
- 下一篇: 【物联网】WiFi基础知识