1. NTP和SNTP協議
NTP是網絡時間協議(Network Time Protocol),用來同步網絡設備(如PC、手機)的時間的協議
SNTP由 NTP改編而來(簡單網絡時間協議,Simple NTP)大大簡化了 NTP協議,同時也能保證時間達到一定的精確度。在實際應用中,SNTP協議主要被用來同步因特網上計算機的時間
SNTP協議采用客戶端/服務器的工作方式,可以采用單播(點對點)或者廣播(一點對多點)模式操作。SNTP服務器通過接收 GPS信號或自帶的原子鐘作為系統的時間基準。單播模式下,SNTP客戶端能夠通過定期訪問 SNTP服務器獲得準確的時間信息,用于調整客戶端自身所在系統的時間,達到同步時間的目的。廣播模式下,SNTP服務器周期性地發送消息給指定的 IP廣播地址或者 IP多播地址。SNTP客戶端通過監聽這些地址來獲得時間信息
一些常見的 NTP服務器
- 最常見的NTP服務器:www.pool.ntp.org/zone/cn
- 其國內地址為:cn.pool.ntp.org
- Windows系統上自帶的兩個:time.windows.com 和 time.nist.gov
- Mac OS上自帶的兩個:time.apple.com 和 time.asia.apple.com
2. SNTP接口說明
設置SNTP服務器:通過IP地址設置SNTP服務器,最多支持設置3個
void sntp_setserver(unsigned char idx, ip_addr_t *addr)
//idx 服務器編號,最多?持3個(0~2);0為主服務器,1和2為備用
//addr 服務器IP地址;需自行確保傳入的是合法SNTP服務器地址
設置SNTP服務器:通過域名設置SNTP服務器,最多支持設置3個
void sntp_setservername(unsigned char idx, char *server)
//idx 服務器編號,最多?持3個(0~2);0號為主服務器,1和2號為備用
//server 服務器域名;需自行確保傳入的是合法SNTP服務器域名
初始化和關閉SNTP
void sntp_init(void)
void sntp_stop(void)
查詢當前距離基準時間(1970.01.01 00:00:00 GMT+8)的時間戳,單位為秒
uint32 sntp_get_current_timestamp()
//返回值:距離基準時間的時間戳
查詢實際時間(GMT+8)
char* sntp_get_real_time(long t)
//t 與基準時間相距的時間戳
//返回值:實際時間
3. SNTP功能實現
SNTP功能開發:在 freeRTOS下新建 SNTP任務,實現定時5秒串口打印一次網絡時間
任務流程如下示:
實現步驟如下:
在ESP8266_RTOS_SDK目錄下新建sntp文件夾,把ESP8266開發環境搭建中的 app目錄下所有文件拷貝到該文件夾中
在user目錄下新建 user_sntp.c文件,并添加如下代碼
/*******************user_sntp.c********************************/
char* SntpServerNames[3] ={
"ntp1.aliyun.com",
"ntp2.aliyun.com",
"ntp3.aliyun.com"
};
//ATaskSntp任務
void ATaskSntp( void *pvParameters ){
STATION_STATUS Status;
uint32 time;
do{
Status = wifi_station_get_connect_status();
vTaskDelay(100);
}while(Status != STATION_GOT_IP);
printf("task is SNTP
");
printf("STATION_GOT_IP!
");
sntp_setservername(0,SntpServerNames[0]);
sntp_setservername(1,SntpServerNames[1]);
sntp_setservername(2,SntpServerNames[2]);
sntp_init();
for(;;){
time = sntp_get_current_timestamp();
if(time){
printf("current date:%s
",sntp_get_real_time(time));
}
vTaskDelay(500);
}
vTaskDelete(NULL);
}
//Sntp_init 初始化
void Sntp_init(void){
xTaskCreate(ATaskSntp, "Sntp", 512, NULL, 4, NULL);
}
在include目錄下新建 user_sntp.h文件,并添加聲明
void ATaskSntp(void *pvParameters);
void Sntp_init(void);
在user_main.c文件中的 user_init()函數下添加如下代碼
#define SSID "Hotspot" //ESP8266要加入的無線網
#define PASSWORD "88888888"
void ICACHE_FLASH_ATTR
user_init(void){
printf("SDK version:%s
", system_get_sdk_version());
Led_init();
wifi_set_opmode(STATION_MODE);
struct station_config *config = (struct station_config *) zalloc(sizeof(struct station_config));
sprintf(config->ssid,SSID);
sprintf(config->password,PASSWORD);
wifi_station_set_config(config);
free(config);
wifi_station_set_auto_connect(TRUE);
Sntp_init();
xTaskCreate(ATaskLed, "LED", 256, NULL, 2, NULL);
}
在ESP8266編譯器中編譯完成,燒寫 bin文件到 ESP8266,打開串口助手,每5秒輸出一次實時時間
-
計算機
+關注
關注
19文章
7614瀏覽量
89899 -
服務器
+關注
關注
12文章
9609瀏覽量
87035 -
NTP
+關注
關注
1文章
209瀏覽量
14285 -
ESP8266
+關注
關注
50文章
963瀏覽量
46603 -
sntp
+關注
關注
0文章
5瀏覽量
3771
發布評論請先 登錄
通過void sntp_set_system_time(sntp_time_t GMT_Time);設置后,通過什么api接口獲取本地的時間?
請問如何在ESP8266上使用sntp協議連接到ssl中的服務器?
ESP8266獲取網絡時間的方法
ESP8266使用AT指令獲取網絡時間的步驟
使用STM32和ESP8266獲取網絡天氣的源代碼程序免費下載

ESP8266獲取網絡時間、獲取天氣

ESP8266通過MQTT協議連接ONENET

評論