NodeMCU(ESP8266)获取NTP时间
文章目录
- NodeMCU(ESP8266)获取NTP时间
- NTP协议
- 为啥要同步时间
- 实现思路
- 代码
- 上代码
- 效果图
- 参考文章
NodeMCU(ESP8266)获取NTP时间
很久没有搞ESP8266了,可能是这两年工作太忙了,又或者是对生活失去了斗志,所以最近又重新把两年前的东西重新收拾收拾。
NTP协议
我之前有写一篇NTP 入门介绍,大家如果有对NTP不了解的,可以先查阅这篇《NTP 入门介绍》
为啥要同步时间
之前看到有一个用户通过esp8266做了一个时钟出来( ESP8266物联网创意点阵时钟,女朋友看了都想要!
),自己也想搞一个类似的,然后就发现他有一个功能就是网络自动校准时间,才了解到有NTP这个协议的存在,所以就找到一些代码研究了一番,所以就有了今天这篇博文。
实现思路
esp8266感觉是一个很简单的东西,网上有很多的代码示例,这里我更推荐使用官方的示例库。
如何从官方的示例库中找到我们要用的示例代码:
- net-client-demo
Ticker 图片
ticker的使用请参考从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示
代码
根据上述的示例和其他用户分享的库文件使用方法,我们稍微整理一下,把代码改成我们想要的样子。
- 先连接wifi
- 判断时间是否是正确的,如果不正确就去同步时间
- 如果时间正确就每秒中增加我们的时钟信息,顺便打印出来
上代码
#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时间相关推荐
- esp8266 获取 NTP 实时时间
esp8266 获取 NTP 实时时间 esp8266 获取 NTP 实时时间 开发环境: 背景: NTPClient 库的安装 打开库 Demo 程序 程序设计 [WIFI连接] [NTP连接] [ ...
- 使用RT-Thread Studio DIY 迷你桌面时钟(三)| 获取NTP时间(at_device软件包 + netutils软件包)
寻求更清爽的阅读体验,请移步:Mculover666的个人博客. 1. 项目进度 桌面Mini时钟项目用来演示如何使用RT-Thread Stduio开发项目,整个项目的架构如下: 在前两篇博文中简单 ...
- esp8266获取网络时间
esp8266获取网络时间 我们使用的手机都有 "使用网络上的时间,自动调整日期和时间" 的功能.如果我们自己做的电子时钟也有自动调整时间的功能,那就很方便,而且不怕时间不准了. ...
- 获取北京时间授时api stm32 esp8266获取北京时间、年月日、星期api GMT格林威时间转换北京时间
苏宁获取北京时间的api不要太方便:http://quan.suning.com/getSysTime.do 使用 Fidder抓包调试,查看HTTP返回报文: 双击左侧抓取到的HTTP返回报文.使用 ...
- 【DIY】入门必看:arduino入门实用教程,esp8266获取互联网时间,nodemcu制作NTP客户端获取显示互联网时间...
今天使用ESP8266(nodemcu)做一个互联网时间显示器,没错从互联网获取时间,精准高效,简单粗暴,不用对时.入门级详细教程哦! 按照国际惯例先展示成品: ...
- ESP8266+STM32获取网络时间、OLED显示时间图片视频。
学习过程不易,发文共享以下学习过程~ 先说说我的设计内容的组成: 目录 学习过程不易,发文共享以下学习过程~ 1. STM32控制ESP8266获取网络时间 第一步:电脑控制ESP8266获取时间数据 ...
- Arduino ESP32 获取网络时间并同步本地RTC时钟
Arduino ESP32 获取网络时间并同步本地RTC时钟 相关篇<Arduino ESP32 最简单直接获取网络时间方法> 在 ArduinoESP32核心支持库当中已经包含相关的获取 ...
- linux网络编程应用于生活,[Linux网络编程]应用实例--获取网络时间
#include #include #include #include #include #include #include #include #include #include #include # ...
- 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间
目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...
- java ntpudpclient_使用NTP获取网络时间-----java
在做系统对时的时候,需要使用到ntp来获取时间. 可以使用common-net包来获取ntp服务器的时间(即可以向那些标准时间服务器对时,也可以向自己设置好的ntp服务器进行对时). 使用java获取 ...
最新文章
- 【资源分享】639页《深度学习:Deep Learning》硬核课程PPT
- 单身的我听着单身情歌。。。看着那些儿时看过的小说。。。
- mysql as用法_Spring Data R2DBC响应式操作MySQL
- 前端实操案例丨如何实现JS向Vue传值
- oracle 12c cdb/pdb tnsnames.ora设置
- 自定义路径创建Cocos2d-x项目
- Mac使用技巧:在“快速查看”中查看和编辑文件
- java基本操作-2
- Xamarin教程索引页
- ADAMS学习视频强力推荐--《Adams/ view从入门到提高》ftc正青春制作
- kali渗透综合靶机(九)--Typhoon靶机
- 人民日报海外版总编辑詹国枢谈新闻写作技巧:五句话妙手著文章
- 计算机word保存如何操作,电脑word怎么保存 在电脑上word打字怎么保存
- SI信号仿真及软件 HyperLynx
- Kepserver EX6配置opc ua服务端 以及客户端
- STM32 AT24C64 Hal库写入错误
- html手抄报怎么制作软件,电子手抄报制作软件
- java 适合练手的java项目
- Linux DSA Net Switch驱动开发
- chatGPT Access denied访问被拒绝(已解决)
热门文章
- 【笔记】ubuntu 16.04 centos 7如何配置sudo权限
- oracle表空间可以更改吗,如何更改Oracle数据库表的表空间?
- .php on line 0,windows启动apache提示PHP Startup: in Unknown on line 0
- dms系统与mysql_Mysql的两种存储引擎以及区别
- 中比较两个时间的月份差值_测量血压时,一天中什么时间测比较准?控制血压又有哪些好方式?...
- linux常用命令_linux常用命令
- Introduction to Computer Networking学习笔记(三):IP与子网掩码
- python数据可视化之美 豆瓣_Python数据可视化:豆瓣电影TOP250
- shell 封装方法_反弹shell逃逸基于execve的命令监控(上)
- SpringBoot系列(3):SpringBoot2.1.x源码阅读环境搭建详解