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

news2025/1/16 3:37:38

前言

        上一章我们用开发板进行ping测试,本章我们用它通过SNTP获取网络时间并在串口显示。

什么是SNTP? 能用来做什么?

        SNTP(Simple Network Time Protocal简单网络时间协议),用于跨广域网或局域网同步时间的协议,具有较高的精确度(几十毫秒),SNTP是NTP协议的简化版;我们可用来给本地设备进行校正时间。

SNTP报文

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文件夹了,打开sntp.c文件,本章我们直接调用的是这几个函数:SNTP_init()、SNTP_run(),一个是初始化,一个是运行;其中初始化函数我们依次传入socket端口号、NTP服务器IP地址、时区(直接在sntp.c文件里可知中国对应为39)、数据收发缓存buf;运行函数我们传入对应的时间结构体即可,如下所示:

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 Flag
	memcpy(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 40

	switch(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_SIZE
			recvfrom(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);
#endif
					ntp_retry_cnt++;
					return 1;
				}
			}
		}
		else //ntp retry fail
		{
			ntp_retry_cnt=0;
#ifdef _SNTP_DEBUG_
			printf("ntp retry failed!\r\n");
#endif
			close(NTP_SOCKET);
		}
		break;
	case SOCK_CLOSED:
		socket(NTP_SOCKET,Sn_MR_UDP,ntp_port,0);
		break;
	}
	// Return value
	// 0 - failed / 1 - success
	return 0;
}

        主函数比较简单,我们直接初始化网络配置信息对应参数,以及NTP服务器IP地址;然后初始化sntp后在循环里调用即可,如下所示:

#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
  
void network_init(void);

wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},
    .ip = {192, 168, 1, 11},
    .sn = {255, 255, 255, 0},
    .gw = {192, 168, 1, 1},
    .dns = {8, 8, 8, 8},
    .dhcp = NETINFO_STATIC};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
static uint8_t sntp_server_ip[4]={202, 112, 10, 60};
static uint16_t timezone = 39;
datetime date;

int main()                                                          
{   
    stdio_init_all();
    sleep_ms(2000);
    network_init();

    SNTP_init(SOCKET_ID, sntp_server_ip, timezone, ethernet_buf);
    
    while(true)
    {
        SNTP_run(&date);
        sleep_ms(1000);
        printf("NOW: %d-%d-%d  %d:%d:%d\r\n",date.yy,date.mo,date.dd,date.hh,date.mm,date.ss);
        
    }
}

void network_init(void)
{
    uint8_t temp;
    wizchip_initialize();
    printf("W5100s udp client example.\r\n");
    sleep_ms(2000);
    wizchip_setnetinfo(&net_info);
    print_network_information(get_info);
    sleep_ms(2000);   
}

2. 测试现象

编译烧录后,打开串行监视器,即可看到在打印的实时时间信息,前两次打印为0是由于socket端口未开启和开启后首次发送请求前这两次状态期间,尚未获得时间数据,因此打印的是初始化赋的0,如下图所示:

相关链接

本章相关例程链接icon-default.png?t=N7T8https://gitee.com/wiznet-hk/w5100s-evb-pico-routine.git

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

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

相关文章

PXE网络批量装机(centos7)

目录 前言 一、实验拓扑图 二、PXE的组件 三、配置PXE装机服务器 1、设置防火墙、selinux 2.安装、启动vsftp 3、拷贝系统文件到/var/ftp用于装机 4、配置tftp 5、准备pxelinx.0文件、引导文件、内核文件 6、配置本机IP 7、配置DHCP服务 8、创建default文件 四、配…

撤回IPO背后:透视树根互联“以退为进”的成长逻辑

如果说&#xff0c;互联网的上半场属于消费互联网&#xff0c;那么下半场的主角将会是工业互联网&#xff0c;它也被称为“第四次工业革命的重要基石”。 工业互联网属于典型的“长坡厚雪”型赛道&#xff0c;前期需要在技术、资金、人才等方面进行大量投入&#xff0c;而等待…

【强化学习】基本概念

基本大概框架 强化学习的主要角色是 智能体 &#xff08;agent&#xff09;和 环境,环境是智能体存在和互动的世界。智能体根据当前的环境做出action&#xff0c;action影响环境。然后智能体根据新的环境再进行action。 基础用语 状态&#xff08;state, s&#xff09;&…

Krahets 笔面试精选 88 题——40. 组合总和 II

使用深度搜索的方法&#xff1a; 由于题目说候选数组中的每个数字在每个组合只能出现一次&#xff0c;所以&#xff0c;为了避免重复&#xff0c;在开始之前对候选数组进行升序排序&#xff0c;这样优先选择小的数&#xff0c;如果当前的数都小于目标值&#xff0c;则后面的数就…

CSAPP的Lab学习——BombLab

文章目录 前言一、一号炸弹&#xff08;小试牛刀&#xff09;二、二号炸弹&#xff08;六重循环&#xff09;三、三号炸弹&#xff08;不同输入&#xff0c;不同答案&#xff09;四、四号炸弹&#xff08;判断语句的实现&#xff09;五、五号炸弹&#xff08;跳转&#xff0c;循…

VoxWeekly|The Sandbox 生态周报|20230828

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布&#xff0c;对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容&#xff0c;欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter&#xff0c;并加入 Discord 社区&#xf…

PHP多语言代入电商平台api接口采集拼多多根据ID获取商品详情原数据示例

拼多多商品详情原数据API接口的作用是获取拼多多电商平台上某一商品的详细信息&#xff0c;包括商品的标题、价格、库存、图片、描述、包邮信息、销量、评价、优惠券等数据。通过该API接口可以获取到商品的原始数据&#xff0c;用于分析、筛选和展示商品信息。 pinduoduo.item…

typeerror: web3 is not a constructor

typeerror: web3 is not a constructor

PXE批量装机

目录 目录 一、概念 二、PXE的组件 三、操作步骤 一、配置基础环境 二、安装软件 三、文件配置 一、DHCP配置 二、配置TFTP 三、pxelinx.0 四、新机器验证 一、第一次验证 二、第二次验证 五、配置pxe无人值守安装 六、无人值守验证 一、概念 PXE是批量装机系统…

上海亚商投顾:沪指震荡微跌 北向资金单月净卖出900亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数今日震荡调整&#xff0c;科创50走势较强&#xff0c;盘中一度涨超1%&#xff0c;随后上演冲高回落走…

找不到msvcp140.dll解决方法?msvcp140.dll修复教程

今天&#xff0c;我想和大家分享一个关于电脑问题的解决方法——找不到msvcp140.dll。这个问题在很多使用Windows系统的电脑上都可能出现&#xff0c;尤其是在使用某些软件时&#xff0c;可能会提示缺少msvcp140.dll文件。那么&#xff0c;我们该如何解决这个问题呢&#xff1f…

qt day

#include "widget.h" #include "ui_widget.h" void Widget::my_slot() {} Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));//設置窗口的…

光流法相关论文-LK光流法,HS光流法,Farneback光流法,FlowNet: 端到端的深度光流估计, RAFT: 结构化的光流估计

目录 光流法 1. Lucas-Kanade光流法&#xff08;稀疏光流法&#xff09;&#xff1a; 2. Horn-Schunck光流法&#xff08;稠密光流法&#xff09;&#xff1a; 3. Farneback光流法&#xff1a; 4 FlowNet: 端到端的深度光流估计&#xff1a; 5. RAFT: 结构化的光流…

CSP的理解与绕过

文章目录 前言CSP简介CSP如何工作CSP指令CSP指令值 例题[AFCTF 2021]BABY_CSP 前言 刚学习完xss&#xff0c;把xsss-labs靶场都通了打算试试水&#xff0c;遇到此题[AFCTF 2021]BABY_CSP&#xff0c;借此机会学习下CSP CSP简介 Content Security Policy (CSP)内容安全策略&am…

c++版opencv求二值图的质心

代码 #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp>int main(int argc, char* argv[]) {cv::Mat input_image cv::imread("Untitled.png", cv::IMREAD_GRAYSCALE);cv:…

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…

分布式集群框架——zookeeper必考面试题②

15、数据同步 整个集群完成 Leader 选举之后&#xff0c;Learner&#xff08;Follower 和 Observer 的统称&#xff09;回向Leader 服务器进行注册。当 Learner 服务器想 Leader 服务器完成注册后&#xff0c;进入数据同步环节。数据同步流程&#xff1a;&#xff08;均以消息…

工作流程flowable

目录 Flowable工作流分类&#xff1a;一、会签流程二、或签流程分支流程四、并行流程 第二步&#xff1a;源码及表结构对应关系部署一次流程 第三步 流程监听器与任务监听器 Flowable 工作流分类&#xff1a; 参考: link 官方中文文档&#xff1a;网关 一、会签流程 适用场…

【C语言】循环语句详解

✨个人主页&#xff1a; Anmia.&#x1f389;所属专栏&#xff1a; C Language &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 目录 1.什么是循环结构&#xff1f; 2.while循环 while流程图 while语句中的break和continue break continue 3.for循环 for流…

Ubuntu 20.04.5 怎么安装微信

这是我的ubutun版本号 在这个系统装桌面版微信很多功能不健全。搜索了很多方法&#xff0c;这个算是不错的一个法子。 1.添加仓库 首次使用时&#xff0c;你需要运行如下一条命令将移植仓库添加到系统中。 wget -O- https://deepin-wine.i-m.dev/setup.sh | sh 2.应用安装 …