W5500-EVB-PICO通过SNTP获取网络时间(十一)

前言

        上一章我们用W5500_EVB_PICO 开发板做Ping数据测试IP检测连通性,那么本章我们进行W5500_EVB_PICO SNTP的测试。

什么是NTP?

        NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。提供NTP对时的服务器有很多,比如微软的NTP对时服务器,利用NTP服务器提供的对时功能,可以使我们的设备时钟系统能够正确运行。

NTP报文格式

NTP报文格式如上图所示,它的字段含义参考如下:

LI 闰秒标识器,占用2个bit

VN 版本号,占用3个bits,表示NTP的版本号,现在为3

Mode 模式,占用3个bits,表示模式

stratum(层),占用8个bits

Poll 测试间隔,占用8个bits,表示连续信息之间的最大间隔

Precision 精度,占用8个bits,,表示本地时钟精度

Root Delay根时延,占用8个bits,表示在主参考源之间往返的总共时延

Root Dispersion根离散,占用8个bits,表示在主参考源有关的名义错误

Reference Identifier参考时钟标识符,占用8个bits,用来标识特殊的参考源    

参考时间戳,64bits时间戳,本地时钟被修改的最新时间。

原始时间戳,客户端发送的时间,64bits。

接受时间戳,服务端接受到的时间,64bits。

传送时间戳,服务端送出应答的时间,64bits。

认证符(可选项)

连接方式

开发板和主机都接在路由器LAN口

获取网络时间测试

1.相关代码

        我们打开例程中库文件的sntp_client.c文件,可以看到两个有关于ntp的两个函数,分别是SNTP_init函数和SNRTP_run函数,SNTP_init函数第一个参数是socket号,第二参数是获取时间的服务器ip,第三个参数是所要获取时间的时区(中国是东八区,sntp.c文件中能找到对应编号),第四个参数是缓存buf;然后SNTP_run的函数是传入一个datetime结构类型的参数,结构体里面有相应的参数。

void SNTP_init(uint8_t s, uint8_t *ntp_server, uint8_t tz, uint8_t *buf)
{NTP_SOCKET = s;NTPformat.dstaddr[0] = ntp_server[0];NTPformat.dstaddr[1] = ntp_server[1];NTPformat.dstaddr[2] = ntp_server[2];NTPformat.dstaddr[3] = ntp_server[3];time_zone = tz;data_buf = buf;uint8_t Flag;NTPformat.leap = 0;           /* leap indicator */NTPformat.version = 4;        /* version number */NTPformat.mode = 3;           /* mode */NTPformat.stratum = 0;        /* stratum */NTPformat.poll = 0;           /* poll interval */NTPformat.precision = 0;      /* precision */NTPformat.rootdelay = 0;      /* root delay */NTPformat.rootdisp = 0;       /* root dispersion */NTPformat.refid = 0;          /* reference ID */NTPformat.reftime = 0;        /* reference time */NTPformat.org = 0;            /* origin timestamp */NTPformat.rec = 0;            /* receive timestamp */NTPformat.xmt = 1;            /* transmit timestamp */Flag = (NTPformat.leap<<6)+(NTPformat.version<<3)+NTPformat.mode; //one byte Flagmemcpy(ntpmessage,(void const*)(&Flag),1);
}
int8_t SNTP_run(datetime *time)
{uint16_t RSR_len;uint32_t destip = 0;uint16_t destport;uint16_t startindex = 40; //last 8-byte of data_buf[size is 48 byte] is xmt, so the startindex should be 40switch(getSn_SR(NTP_SOCKET)){case SOCK_UDP:if ((RSR_len = getSn_RX_RSR(NTP_SOCKET)) > 0){if (RSR_len > MAX_SNTP_BUF_SIZE) RSR_len = MAX_SNTP_BUF_SIZE;   // if Rx data size is lager than TX_RX_MAX_BUF_SIZErecvfrom(NTP_SOCKET, data_buf, RSR_len, (uint8_t *)&destip, &destport);get_seconds_from_ntp_server(data_buf,startindex);time->yy = Nowdatetime.yy;time->mo = Nowdatetime.mo;time->dd = Nowdatetime.dd;time->hh = Nowdatetime.hh;time->mm = Nowdatetime.mm;time->ss = Nowdatetime.ss;ntp_retry_cnt=0;close(NTP_SOCKET);return 1;}if(ntp_retry_cnt<0xFFFF){if(ntp_retry_cnt==0)//first send request, no need to wait{sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);ntp_retry_cnt++;}else // send request again? it should wait for a while{if((ntp_retry_cnt % 0xFFF) == 0) //wait time{sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
#ifdef _SNTP_DEBUG_printf("ntp retry: %d\r\n", ntp_retry_cnt);
#endifntp_retry_cnt++;}}}else //ntp retry fail{ntp_retry_cnt=0;
#ifdef _SNTP_DEBUG_printf("ntp retry failed!\r\n");
#endifclose(NTP_SOCKET);}break;case SOCK_CLOSED:socket(NTP_SOCKET,Sn_MR_UDP,ntp_port,0);break;}// Return value// 0 - failed / 1 - successreturn 0;
}

         datetime类型结构体

typedef struct _datetime
{uint16_t yy;uint8_t mo;uint8_t dd;uint8_t hh;uint8_t mm;uint8_t ss;
} datetime;

2.测试现象

编译烧录完成之后打开串行监视器,复位一下W5500_EVB_PICO,然后串口上就会开始打印网络配置信息,然后开始获取时间,看到串口上一秒打印一次时间,表示成功。

相关连接:

本章例程链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-plus指定el-date-picker的弹出框位置

此处记录一下,通过popper-options指定popper出现的位置

2、QT的信号与槽

一、什么是信号与槽 一个对象发送一个信号出去&#xff0c;另外一个对象接收到该信号后&#xff0c;会触发相应的槽函数 二、信号与槽的语法 connect(信号的发送者&#xff0c;SIGNAL(信号名称),信号的接收者,SLOT(槽函数)); 1、写法&#xff1a; QT 4 的写法 connect(sende…

anaconda环境迁移

conda环境迁移第一步 进入anaconda安装文件夹&#xff0c;然后进入envs文件夹&#xff0c;下面的每一个文件夹都是你创建的环境&#xff0c; 准备一个u盘之类的&#xff0c;把整个文件夹复制下来&#xff0c;然后打开另外一台机器&#xff0c;把同样的文件夹复制到同样的文件夹…

Maven的profiles多环境配置

一个项目通常都会有多个不同的运行环境&#xff0c;例如开发环境&#xff0c;测试环境、生产环境等。而不同环境的构建过程很可能是不同的&#xff0c;例如数据源配置、插件、以及依赖的版本等。每次将项目部署到不同的环境时&#xff0c;都需要修改相应的配置&#xff0c;这样…

0830hw

1.2.链式队列 head.h #include <myhead.h> typedef int datatype; typedef struct seq {union{datatype data;int len;};struct seq *next; }seq,*S; typedef struct PP {S front;S rear; }P; P *create(); void input_tail(P *p,datatype n); void pop_head(P *p); vo…

postgresql-日期函数

postgresql-日期函数 日期时间函数计算时间间隔获取时间中的信息截断日期/时间创建日期/时间获取系统时间CURRENT_DATE当前事务开始时间 时区转换 日期时间函数 PostgreSQL 提供了以下日期和时间运算的算术运算符。 计算时间间隔 age(timestamp, timestamp)函数用于计算两…

恢复已删除的git分支

1.打开对应项目文件夹目录,在目录下执行git命令 2.执行命令 git reflog --dateiso , 找到最后一次commit 的id 3. 执行git checkout -b 新建分支名称 commitId 就会基于commitId这次提交时工作区新建一个分支&#xff0c;就能达到我们找到删除分支的代码效果。 4.直接看ide…

ABB PCD231B101励磁控制模块

电磁励磁控制&#xff1a; PCD231B101 模块专门设计用于电磁励磁设备的控制&#xff0c;以确保发电机的励磁电流和电压维持在合适的水平。 多通道控制&#xff1a; 这种模块通常具有多个控制通道&#xff0c;可用于同时监测和控制多台电力发电机。 通讯接口&#xff1a; PCD2…

二叉树的前序遍历

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 二叉树的前序遍历 题目要求 题目链接 示例 解答 方法一、 递归法 实现思路 使用递归依次将该结点的数据&#xff0c;该结点的左子树的数据&am…

0202hdfs的shell操作-hadoop-大数据学习

文章目录 1 进程启停管理2 文件系统操作命令2.1 HDFS文件系统基本信息2.2 介绍2.3 创建文件夹2.4 查看指定文件夹下的内容2.5 上传文件到HDFS2.6 查看HDFS文件内容2.7 下载HDFS文件2.8 HDFS数据删除操作 3 HDFS客户端-jetbrians产品插件3.1 Big Data Tools 安装3.2 配置windows…

WPF+Prism+WebApi 学习总结

一、基本概念 WPF:WPF&#xff08;Windows Presentation Foundation&#xff09;是&#xff08;微软推出的&#xff09;基于Windows的用户界面框架&#xff0c;提供了统一的编程模型&#xff0c;语言和框架&#xff0c;做到了分离界面设计人员与开发人员的工作&#xff1b;WPF…

Android开发之性能测试工具Profiler

前言 性能优化问题&#xff0c;在我们开发时都会遇到&#xff0c;但是在小厂和对自己要求不严格的情况下&#xff0c;我都很少去做性能优化&#xff1b; 在性能优化上&#xff0c;基本大家都是通过自己的开发经验和性能分析工具来发现问题&#xff0c;今天给大家分享一下小编最…

Docker从认识到实践再到底层原理(一)|技术架构

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

多张图片转为pdf怎么弄?

多张图片转为pdf怎么弄&#xff1f;在网络传输过程中&#xff0c;为了避免图片格式文件出现差错&#xff0c;并确保图片的清晰度和色彩不因不同设备而有所改变&#xff0c;常见的做法是将图片转换为PDF格式。然而&#xff0c;当涉及到多张图片时&#xff0c;逐一转换将会变得相…

MybatisPlus入门

MybatisPlus入门 1.MyBatis-Plus1.1 ORM介绍1.2 MyBatis-Plus介绍 2.代码链接数据库2.1 创建项目2.2 添加依赖2.3 链接数据库2.3.1 准备数据库2.3.2 链接数据库2.3.3 创建实体类 2.4 创建Mapper层2.5 创建Controller层2.6 浏览器访问测试 MybatisPlus官方网站&#xff1a; 官网…

微信8.0.41更新来了,看看有哪些变化吧

微信给我们带来了极大的方便&#xff0c;无论是日常聊天还是工作沟通&#xff0c;几乎离不开它。 时不时会给我一种熟悉的陌生感。 这个功能&#xff0c;好像我之前是没见过的。 就比如公众号信息流&#xff0c;刷着刷着就会发现&#xff0c;怎么会有看一看的信息推流会突然出现…

pytest pytest.ini 配置日志输出至文件

创建pytest.ini 文件 [pytest] log_file pytest_log.txt log_file_level INFO log_file_date_format %Y-%m-%d %H:%M:%S log_file_format %(asctime)s | %(filename)s | %(funcName)s | line:%(lineno)d | %(levelname)s | %(message)s import pytest import loggingdef …

【Linux】线程安全-互斥同步

文章目录 线程安全问题的引入线程互斥互斥概念互斥锁互斥锁的计数器当中如何保证原子性互斥锁基础API初始化互斥锁变量函数动态初始化静态初始化 加锁函数阻塞加锁非阻塞加锁带有超时时间的加锁 解锁函数销毁互斥锁函数 线程同步线程同步的必要性条件变量条件变量的使用原理条件…

从零开始的Hadoop学习(五)| HDFS概述、shell操作、API操作

1. HDFS 概述 1.1 HDFS 产出背景及定义 1&#xff09;HDFS 产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切 需要一种系统来管理多台机器上的…

基于飞腾芯片的设计与调试入门指导

一、啥是自主可控 国产CPU现在厂家细算起来其实有很多,现在华为、小米也在做自己的CPU,瑞芯微、全志等的SoC现在也是广泛应用。但是真正能叫做自主可控的CPU厂商,只有6家。那啥是自主可控?首先来不严谨的讲下现在数字芯片是怎么做的设计。FPGA大家都知道,可以通过Verilog…