0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式单片机 来源:未知 作者:李倩 2018-05-09 14:33 次阅读

本文需要读者有一点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 B<a href="https://bbs.elecfans.com/zhuti_1472_1.html" target="_blank"><u>ad</u></a> 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;
}

连接网站成功

获取到的网络时间

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

    关注

    14

    文章

    7492

    浏览量

    88564
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44771

原文标题:利用ESP8266获取网络同步时间(北京时间)

文章出处:【微信号:qrsworld,微信公众号:嵌入式单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ESP8266简易WIFI天气时钟

    本篇介绍了http获取网络天气的基本原理,并通过实践,使用ESP8266连网获取网络天气和网络
    的头像 发表于 06-06 09:31 7356次阅读
    <b class='flag-5'>ESP8266</b>简易WIFI天气时钟

    如何利用STM32+ESP8266获取北京时间

    如何利用STM32+ESP8266获取北京时间呢?如何使用GET B站的服务器对其进行测试呢?
    发表于 12-02 06:26

    请问STM32+ESP8266如何获取网络时间

    请问STM32+ESP8266如何获取网络时间
    发表于 01-19 06:15

    ESP8266获取网络时间的方法

    ESP8266获取网络时间1、注意事项:本文用到了我自己的阿里云服务器,请各位使用的时候频率稍微低一点,不然压力很大哈。2、登录可以用esp8266
    发表于 01-25 07:17

    ESP8266使用AT指令获取网络时间的步骤

    再优化一下,恰巧有一个正在吃灰的装了AT固件库的esp8266,可以让stm32去获取网络时钟从而校正本地时间网络时钟用淘宝的API,它返
    发表于 08-26 15:27

    esp8266如何获取上传固件的日期和时间

    用每个esp8266固件都是*.bin文件,如果我没理解错的话。每个文件都有创建时间。问题是 - esp8266 是否存储固件的日期和时间,通过 OTA(或更新)上传,是否有任何 Ar
    发表于 02-22 06:05

    使用STM32和ESP8266获取网络天气的源代码程序免费下载

    本文档的主要内容详细介绍的是使用STM32和ESP8266获取网络天气的源代码程序免费下载。
    发表于 01-18 08:00 12次下载
    使用STM32和<b class='flag-5'>ESP8266</b><b class='flag-5'>获取</b><b class='flag-5'>网络</b>天气的源代码程序免费下载

    正点原子ESP8266获取网络天气适配战舰V3

    正点原子ESP8266获取网络天气适配战舰V3
    发表于 04-06 14:36 25次下载
    正点原子<b class='flag-5'>ESP8266</b><b class='flag-5'>获取</b><b class='flag-5'>网络</b>天气适配战舰V3

    基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据

    stm32通过ESP8266模块获取天气,时间
    发表于 11-18 18:36 38次下载
    基于STM32的<b class='flag-5'>ESP8266</b>天气时钟(2)--------MCU<b class='flag-5'>获取</b>天气数据

    ESP8266获取网络时间获取天气

    ESP8266获取网络时间1、注意事项:本文用到了我自己的阿里云服务器,请各位使用的时候频率稍微低一点,不然压力很大哈。2、登录可以用esp8266
    发表于 11-30 16:21 12次下载
    <b class='flag-5'>ESP8266</b><b class='flag-5'>获取</b><b class='flag-5'>网络</b><b class='flag-5'>时间</b>、<b class='flag-5'>获取</b>天气

    使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

    在本教程中,我们将使用 ESP8266 NodeMCU 从 NTP 服务器获取当前时间和日期,并将其显示在 OLED 显示屏上。
    的头像 发表于 09-01 16:09 1.9w次阅读
    使用<b class='flag-5'>ESP8266</b>从NTP服务器<b class='flag-5'>获取</b><b class='flag-5'>时间</b>并在OLED显示器上显示

    闪烁的LED和低代码:Arduino/ESP8266和Hackeet基础知识

    电子发烧友网站提供《闪烁的LED和低代码:Arduino/ESP8266和Hackeet基础知识.zip》资料免费下载
    发表于 12-12 10:46 0次下载
    闪烁的LED和低代码:Arduino/<b class='flag-5'>ESP8266</b>和Hackeet<b class='flag-5'>基础知识</b>

    使用ESP8266基础知识

    电子发烧友网站提供《使用ESP8266基础知识.zip》资料免费下载
    发表于 02-07 14:21 4次下载
    使用<b class='flag-5'>ESP8266</b>的<b class='flag-5'>基础知识</b>

    使用ESP8266 OLED和Visuino从NIST TIME服务器获取日期和时间

    电子发烧友网站提供《使用ESP8266 OLED和Visuino从NIST TIME服务器获取日期和时间.zip》资料免费下载
    发表于 06-28 09:55 0次下载
    使用<b class='flag-5'>ESP8266</b> OLED和Visuino从NIST TIME服务器<b class='flag-5'>获取</b>日期和<b class='flag-5'>时间</b>

    ESP8266网络天气时钟OLED显示

    基于ESP8266实现网络获取天气和时钟并OLED显示
    的头像 发表于 06-28 04:46 959次阅读
    <b class='flag-5'>ESP8266</b><b class='flag-5'>网络</b>天气时钟OLED显示