ESP8266的基础知识,怎么获取网络同步时间(北京时间)

描述

本文需要读者有一点ESP8266的基础知识,比如ESP8266的模式设置,AP连接,联网。

1. 提供网络时间的网站

要想获取网络时间首先要有提供网络时间的网站,免费提供网络时间的网站有很多,

这里以http://api.k780.com为例子获取网络时间。

2. ESP8266的工作模式

ESP8266的工作模式设置为:STA。传输协议选择TCP,配置为Client(客户端)。

工作的方式是ESP8266连接到一个可以连上Internet的路由器,通过这个路由器连接到Internet,

访问http://api.k780.com以获取网络时间。

3. 从http://api.k780.com获取的数据中提取时间

先来看一下这个网站给ESP8266提供的数据是什么。

400 Bad Request

400 Bad Request


nginx

Apr 2018 09:11:18 GMT

Content-Type: text/html

Content-Length: 166

Connection: close

从这些数据中可以看出红色字体的就是我们想要的数据。而且这个时间是中央时区的时间,

要转换成北京时间需要+8,以上面的时间为例子09:11:18 等于北京时间17:11:18。

提取的方法是利用strstr函数找到GMT的位置,然后将指针调整到时间的十位数字上,接着一个

获取时间的ascll码然后转换成数字,再转换成北京时间。

获取网站数据的方法是:开启透传模式后,发送"http://api.k780.com:88/?app=life.time&appkey=10003

&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json"。

M4平台上的代码实现

主函数

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;//保存网络时间的结构体
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);//复位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);//获取网络时间
printf("%d:%d:%d\r\n",nwt.hour,nwt.min,nwt.sec);  //打印获取到的网络时间
LCDInit();
LCDFill(0,0,100,100,0);
while(1)
{
t++;
if(t%50 == 0)
{
LED1 = !LED1;
}
key_delay();
}
}

获取网络时间的函数

u8 QuitTrans()
{
delay_ms(200);
UART3Printf("+++");
delay_ms(200);//必须加延时否则无法退出透传
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))   //连接网站
{
;
}
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)) //时间转换
{
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);//关闭TCP连接
return res;
}

连接网站成功

网络

获取到的网络时间

网络

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分