文章目录

  • NodeMCU(ESP8266)获取NTP时间
    • NTP协议
    • 为啥要同步时间
    • 实现思路
    • 代码
      • 上代码
      • 效果图
    • 参考文章

NodeMCU(ESP8266)获取NTP时间

很久没有搞ESP8266了,可能是这两年工作太忙了,又或者是对生活失去了斗志,所以最近又重新把两年前的东西重新收拾收拾。

NTP协议

我之前有写一篇NTP 入门介绍,大家如果有对NTP不了解的,可以先查阅这篇《NTP 入门介绍》

为啥要同步时间

之前看到有一个用户通过esp8266做了一个时钟出来( ESP8266物联网创意点阵时钟,女朋友看了都想要!
),自己也想搞一个类似的,然后就发现他有一个功能就是网络自动校准时间,才了解到有NTP这个协议的存在,所以就找到一些代码研究了一番,所以就有了今天这篇博文。

实现思路

esp8266感觉是一个很简单的东西,网上有很多的代码示例,这里我更推荐使用官方的示例库。

如何从官方的示例库中找到我们要用的示例代码:

  • net-client-demo

  • Ticker 图片

    ticker的使用请参考从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示

代码

根据上述的示例和其他用户分享的库文件使用方法,我们稍微整理一下,把代码改成我们想要的样子。

  1. 先连接wifi
  2. 判断时间是否是正确的,如果不正确就去同步时间
  3. 如果时间正确就每秒中增加我们的时钟信息,顺便打印出来

上代码

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Ticker.h>#ifndef STASSID
#define STASSID "你的WiFi名称"
#define STAPSK  "你的WiFi密码"
#endifconst char * ssid = STASSID;
const char * pass = STAPSK;
// 定义时分秒
unsigned int h = 99, m = 99, s = 99;
// 监听本地UDP数据包端口
unsigned int localPort = 2390;
// NTP服务器IP地址
IPAddress timeServerIP;
// NTP服务器网址
const char* ntpServerName = "time.windows.com";
// NTP数据包数据长度
const int NTP_PACKET_SIZE = 48;byte packetBuffer[ NTP_PACKET_SIZE];WiFiUDP udp;
// 创建一个需要定时调度的对象
Ticker ticker;void setup() {Serial.begin(115200);Serial.println();Serial.print("连接wifi中 ");Serial.println(ssid);WiFi.mode(WIFI_STA);WiFi.begin(ssid, pass);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi已连接");Serial.println("设备IP地址: ");Serial.println(WiFi.localIP());Serial.println("开启UDP通信");udp.begin(localPort);Serial.print("本地端口为: ");Serial.println(udp.localPort());
}void loop() {//get a random server from the poolWiFi.hostByName(ntpServerName, timeServerIP);if (h == 99 || m == 99 || s == 99) {sendNTPpacket(timeServerIP); // send an NTP packet to a time server// 等一秒后获取结果delay(1000);setTimes();// 设置定时累加时间操作ticker.attach(1, addtime);}
}/**累加时间
*/
void addtime() {if (s == 59) {s = 0;if (m == 59) {m = 0;if (h == 23) {h = 0;} else {h++;}} else {m++;}} else {s++;}Serial.print("当前时间为: ");Serial.print(h);Serial.print(":");Serial.print(m);Serial.print(":");Serial.println(s);
}/**获取十分秒信息
*/
void setTimes() {//解析Udp数据包int cb = udp.parsePacket();if (!cb) {//解析包为空Serial.println("没有接收到任何的数据包!");} else {//解析包不为空Serial.print("接收到的数据包的长度为: ");Serial.println(cb);// 解析UDP数据包中的数据udp.read(packetBuffer, NTP_PACKET_SIZE);// 说明 todo这里获取到的时间其实不是真实的时间,实际上还包含了网络延时的,但是为了方便,这里我们忽略这个因素的存在// 取出t2时间的高位和低位数据拼凑成以秒为单位的时间戳unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);// 拼凑成以秒为单位的时间戳(时间戳的记录以秒的形式从 1900-01-01 00:00:00 算起)unsigned long secsSince1900 = highWord << 16 | lowWord;Serial.print("1900年格式标准的时间戳为:");Serial.println(secsSince1900);// 前面的32bit是时间戳的秒数(是用1900-01-01 00:00:00开始的秒数,但是我们的是1970年,所以需要减掉2208988800秒)const unsigned long seventyYears = 2208988800UL;unsigned long epoch = secsSince1900 - seventyYears;Serial.print("1970年格式标准的时间戳为:");Serial.println(epoch);// 这里加8 是因为时区的问题,如果不加8,得到的结果就会是其他时区的时间h =  (epoch  % 86400L) / 3600 + 8;m = (epoch % 3600) / 60;s = epoch % 60;}
}/**发送ntp协议数据包
*/
void sendNTPpacket(IPAddress& address) {Serial.println("发送ntp数据包...");// 将字节数组的数据全部设置为0memset(packetBuffer, 0, NTP_PACKET_SIZE);// 请求部分其实是有很多数据的,具体的请看参考请求报文说明,这里我们就只设置一个请求头部分即可packetBuffer[0] = 0b11100011;// 配置远端ip地址和端口udp.beginPacket(address, 123);// 把数据写入发送缓冲区udp.write(packetBuffer, NTP_PACKET_SIZE);// 发送数据udp.endPacket();
}

效果图

参考文章

ESP8266物联网创意点阵时钟,女朋友看了都想要!
从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示
ESP8266 – WiFiUDP库

NodeMCU(ESP8266)获取NTP时间相关推荐

  1. esp8266 获取 NTP 实时时间

    esp8266 获取 NTP 实时时间 esp8266 获取 NTP 实时时间 开发环境: 背景: NTPClient 库的安装 打开库 Demo 程序 程序设计 [WIFI连接] [NTP连接] [ ...

  2. 使用RT-Thread Studio DIY 迷你桌面时钟(三)| 获取NTP时间(at_device软件包 + netutils软件包)

    寻求更清爽的阅读体验,请移步:Mculover666的个人博客. 1. 项目进度 桌面Mini时钟项目用来演示如何使用RT-Thread Stduio开发项目,整个项目的架构如下: 在前两篇博文中简单 ...

  3. esp8266获取网络时间

    esp8266获取网络时间 我们使用的手机都有 "使用网络上的时间,自动调整日期和时间" 的功能.如果我们自己做的电子时钟也有自动调整时间的功能,那就很方便,而且不怕时间不准了. ...

  4. 获取北京时间授时api stm32 esp8266获取北京时间、年月日、星期api GMT格林威时间转换北京时间

    苏宁获取北京时间的api不要太方便:http://quan.suning.com/getSysTime.do 使用 Fidder抓包调试,查看HTTP返回报文: 双击左侧抓取到的HTTP返回报文.使用 ...

  5. 【DIY】入门必看:arduino入门实用教程,esp8266获取互联网时间,nodemcu制作NTP客户端获取显示互联网时间...

    今天使用ESP8266(nodemcu)做一个互联网时间显示器,没错从互联网获取时间,精准高效,简单粗暴,不用对时.入门级详细教程哦! 按照国际惯例先展示成品:                     ...

  6. ESP8266+STM32获取网络时间、OLED显示时间图片视频。

    学习过程不易,发文共享以下学习过程~ 先说说我的设计内容的组成: 目录 学习过程不易,发文共享以下学习过程~ 1. STM32控制ESP8266获取网络时间 第一步:电脑控制ESP8266获取时间数据 ...

  7. Arduino ESP32 获取网络时间并同步本地RTC时钟

    Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...

  8. linux网络编程应用于生活,[Linux网络编程]应用实例--获取网络时间

    #include #include #include #include #include #include #include #include #include #include #include # ...

  9. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间

    目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...

  10. java ntpudpclient_使用NTP获取网络时间-----java

    在做系统对时的时候,需要使用到ntp来获取时间. 可以使用common-net包来获取ntp服务器的时间(即可以向那些标准时间服务器对时,也可以向自己设置好的ntp服务器进行对时). 使用java获取 ...

最新文章

  1. 【资源分享】639页《深度学习:Deep Learning》硬核课程PPT
  2. 单身的我听着单身情歌。。。看着那些儿时看过的小说。。。
  3. mysql as用法_Spring Data R2DBC响应式操作MySQL
  4. 前端实操案例丨如何实现JS向Vue传值
  5. oracle 12c cdb/pdb tnsnames.ora设置
  6. 自定义路径创建Cocos2d-x项目
  7. Mac使用技巧:在“快速查看”中查看和编辑文件
  8. java基本操作-2
  9. Xamarin教程索引页
  10. ADAMS学习视频强力推荐--《Adams/ view从入门到提高》ftc正青春制作
  11. kali渗透综合靶机(九)--Typhoon靶机
  12. 人民日报海外版总编辑詹国枢谈新闻写作技巧:五句话妙手著文章
  13. 计算机word保存如何操作,电脑word怎么保存 在电脑上word打字怎么保存
  14. SI信号仿真及软件 HyperLynx
  15. Kepserver EX6配置opc ua服务端 以及客户端
  16. STM32 AT24C64 Hal库写入错误
  17. html手抄报怎么制作软件,电子手抄报制作软件
  18. java 适合练手的java项目
  19. Linux DSA Net Switch驱动开发
  20. chatGPT Access denied访问被拒绝(已解决)

热门文章

  1. 【笔记】ubuntu 16.04 centos 7如何配置sudo权限
  2. oracle表空间可以更改吗,如何更改Oracle数据库表的表空间?
  3. .php on line 0,windows启动apache提示PHP Startup: in Unknown on line 0
  4. dms系统与mysql_Mysql的两种存储引擎以及区别
  5. 中比较两个时间的月份差值_测量血压时,一天中什么时间测比较准?控制血压又有哪些好方式?...
  6. linux常用命令_linux常用命令
  7. Introduction to Computer Networking学习笔记(三):IP与子网掩码
  8. python数据可视化之美 豆瓣_Python数据可视化:豆瓣电影TOP250
  9. shell 封装方法_反弹shell逃逸基于execve的命令监控(上)
  10. SpringBoot系列(3):SpringBoot2.1.x源码阅读环境搭建详解