本文需要讀者有一點(diǎn)ESP8266的基礎(chǔ)知識(shí),比如ESP8266的模式設(shè)置,AP連接,聯(lián)網(wǎng)。
1.提供網(wǎng)絡(luò)時(shí)間的網(wǎng)站
要想獲取網(wǎng)絡(luò)時(shí)間首先要有提供網(wǎng)絡(luò)時(shí)間的網(wǎng)站,免費(fèi)提供網(wǎng)絡(luò)時(shí)間的網(wǎng)站有很多,
這里以http://api.k780.com為例子獲取網(wǎng)絡(luò)時(shí)間。
2.ESP8266的工作模式
ESP8266的工作模式設(shè)置為:STA。傳輸協(xié)議選擇TCP,配置為Client(客戶端)。
工作的方式是ESP8266連接到一個(gè)可以連上Internet的路由器,通過這個(gè)路由器連接到Internet,
訪問http://api.k780.com以獲取網(wǎng)絡(luò)時(shí)間。
3.從http://api.k780.com獲取的數(shù)據(jù)中提取時(shí)間
先來看一下這個(gè)網(wǎng)站給ESP8266提供的數(shù)據(jù)是什么。
400 Bad Request
Apr 2018 09:11:18 GMT
Content-Type: text/html
Content-Length: 166
Connection: close
從這些數(shù)據(jù)中可以看出紅色字體的就是我們想要的數(shù)據(jù)。而且這個(gè)時(shí)間是中央時(shí)區(qū)的時(shí)間,
要轉(zhuǎn)換成北京時(shí)間需要+8,以上面的時(shí)間為例子09:11:18 等于北京時(shí)間17:11:18。
提取的方法是利用strstr函數(shù)找到GMT的位置,然后將指針調(diào)整到時(shí)間的十位數(shù)字上,接著一個(gè)
獲取時(shí)間的ascll碼然后轉(zhuǎn)換成數(shù)字,再轉(zhuǎn)換成北京時(shí)間。
獲取網(wǎng)站數(shù)據(jù)的方法是:開啟透傳模式后,發(fā)送"http://api.k780.com:88/?app=life.time&appkey=10003
&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"。
M4平臺(tái)上的代碼實(shí)現(xiàn)
主函數(shù)
int main() { SDErrEnum_Typ sderr; u32 t = 0; u16 i = 0; //u16 *pgbk = (u16*)g_sdcard_rcv_send_buff_5k; u8 *ssid = (u8*)"SP3-20171119FAU-72970";//這里是你路由器的SSID(名字) u8 *password = (u8*)"xxxxxx";//這里是你的路由器密碼 u8 cmdbuff[100]; u8 *p = cmdbuff; NetWorkTime_TypeDef nwt;//保存網(wǎng)絡(luò)時(shí)間的結(jié)構(gòu)體 FATFS fs; FRESULT fres; sderr = sderr; SystickInit(21); LedInit(); KeyInit(); UartInit(115200); UART3Init(115200); t = QuitTrans(); printf("%d\r\n",t); EspSendCmd((u8*)"AT",(u8*)"OK",50); EspSendCmd((u8*)"AT+CWMODE=1",(u8*)"OK",50); EspSendCmd((u8*)"AT+RST",(u8*)"OK",50);//復(fù)位esp8266 delay_ms(3000); EspSendCmd((u8*)"AT+CWMODE?",(u8*)"OK",50); sprintf((char*)p,"AT+CWJAP="%s","%s"",ssid,password);//連接路由器 //sprintf((char*)p,"AT+CWLAP"); while(EspSendCmd(p,(u8*)"WIFI GOT IP",300)) { ; } while(EspSendCmd((u8*)"AT+CWJAP?",(u8*)"OK",50)) { ; } EspSendCmd((u8*)"AT+CIPMUX?",(u8*)"OK",50); while(EspSendCmd((u8*)"AT+CIPSTART=?",(u8*)"OK",50)) { ; } GetNetWorkTime(&nwt,(u8*)"GMT",200);//獲取網(wǎng)絡(luò)時(shí)間 printf("%d:%d:%d\r\n",nwt.hour,nwt.min,nwt.sec); //打印獲取到的網(wǎng)絡(luò)時(shí)間 LCDInit(); LCDFill(0,0,100,100,0); while(1) { t++; if(t%50 == 0) { LED1 = !LED1; } key_delay(); } } |
獲取網(wǎng)絡(luò)時(shí)間的函數(shù)
u8 QuitTrans() { delay_ms(200); UART3Printf("+++"); delay_ms(200);//必須加延時(shí)否則無法退出透傳 return EspSendCmd((u8*)"AT",(u8*)"OK",50);//測試是否退出了透傳(如果退出了AT指令就生效了) } u8 GetNetWorkTime(NetWorkTime_TypeDef *nwt,u8 *resp,u16 overtime_10ms) { u8 res = 0xFF; u8 temp[100] = {0}; u8 *p = temp; u8 *pend; sprintf((char*)p,"AT+CIPSTART="%s","%s",80","TCP",\ "api.k780.com"); while(EspSendCmd((u8*)p,(u8*)"OK",50)) //連接網(wǎng)站 { ; } EspSendCmd((u8*)"AT+CIPMODE=1",(u8*)"OK",50);//開啟透傳模式 EspSendCmd((u8*)"AT+CIPSEND",(u8*)"OK",50); UART3Printf("http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"); if(resp && overtime_10ms) { while(overtime_10ms--) { delay_ms(10); if(g_uart3_rx_sta & 0x8000) { g_uart3_rx_buff[g_uart3_rx_sta & 0x7ff] = 0; printf("%s\r\n",g_uart3_rx_buff); if(strstr((char*)g_uart3_rx_buff,(char*)resp)) //時(shí)間轉(zhuǎn)換 { pend = (u8*)strstr((char*)g_uart3_rx_buff,(char*)resp); p = pend - 9; nwt->hour = ((*p - 48)*10 + (*(p+1) - 48) + 8) % 24; nwt->min = ((*(p+3) - 48)*10 + (*(p+4) - 48)) % 60; nwt->sec = ((*(p+6) - 48)*10 + (*(p+7) - 48)) % 60; res = 0; g_uart3_rx_sta = 0; break; } g_uart3_rx_sta = 0; } } if(overtime_10ms == 0) { printf("send cmd ot\r\n"); //測試用 } } QuitTrans(); EspSendCmd((u8*)"AT+CIPMODE=0",(u8*)"OK",50);//退出透傳模式回到正常模式 EspSendCmd((u8*)"AT+CIPCLOSE",(u8*)"OK",50);//關(guān)閉TCP連接 return res; } |
連接網(wǎng)站成功
獲取到的網(wǎng)絡(luò)時(shí)間
-
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7553瀏覽量
88731 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
44964
原文標(biāo)題:利用ESP8266獲取網(wǎng)絡(luò)同步時(shí)間(北京時(shí)間)
文章出處:【微信號(hào):qrsworld,微信公眾號(hào):嵌入式單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論