当前位置: 首页 > web >正文

测试W5500的第9步_使用SNTP实现网络时间同步

本文摘要: 文章介绍了NTP与SNTP两种网络时间协议的区别,其中NTP提供微秒级精确同步,SNTP是简化版本精度约1秒。列举了常用的NTP服务器域名,包括开源、云服务商和操作系统自带的。提供了ioLibrary库的下载地址,并详细展示了基于W5500芯片实现SNTP协议的STM32代码,包括变量定义、网络参数配置、主程序逻辑和DNS解析过程。最后通过测试成功获取北京时间并输出,验证了SNTP时间同步功能的实现。

1、SNTP和NTP的区别:

NTP是网络时间协议(Network Time Protocol),它用来同步网络设备(如计算机、手机)的时间的协议。NTP是一种用于同步网络中设备时间的协议,提供非常精确的时间同步机制,可以实现微秒级别的时间同步。NTP使用复杂的算法,几乎不受网络延迟和抖动的影响,精度可以达到1-50毫秒。
SNTP是Simple Network Time Protocol的缩写。
SNTP是NTP的简化版本,去除了NTP中的一些复杂特性和功能,使得实现更加简单和轻量。SNTP的精度一般能达到1秒左右,虽然不如NTP精确,但仍然足够满足大多数应用的需求。

2、NTP服务器域名:
开源NTP服务器:cn.pool.ntp.org、0.cn.pool.ntp.org、1.cn.pool.ntp.org、2.cn.pool.ntp.org和3.cn.pool.ntp.org
NTP授时快速域名服务:cn.ntp.org.cn
Windows系统上自带的:time.windows.com
MacOS上自带的两个:time.apple.com 和 time.asia.apple.com
阿里云授时服务器:ntp.aliyun.com
腾讯云授时服务器:time1.cloud.tencent.com、time2.cloud.tencent.com、time3.cloud.tencent.com、time4.cloud.tencent.com和time5.cloud.tencent.com

3、ioLibrary库下载地址
下载地址:https://gitee.com/wiznet-hk/STM32F10x_W5500_Examples
源文件下载地址:https://gitee.com/wiznet-hk 

若遇到找不到的函数,请到前面的文章里去找。

4、W5500_Variable.c

#include "W5500_Variable.h"
#include "socket.h"	// Just include one header for WIZCHIP
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()//W5500的网络参数
//本地物理地址:00 08 DC 11 11 11
//本地IP地址:192.168.1.199
//本地子网掩码:	255.255.255.0
//本地网关:192.168.1.1
//DNS服务器IP地址:8.8.8.8
//程序固化IP地址
/* network information */
wiz_NetInfo net_info = {{0x00, 0x08, 0xdc,0x11, 0x11, 0x11},{192, 168, 1, 199},{255,255,255,0},{192, 168, 1, 1},{8,8,8,8},//DNS服务器IPNETINFO_STATIC}; //静态IP,程序固化IP地址
wiz_NetInfo net_info;uint16_t LocalPort=4000;//W5500的本地端口uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0};uint8_t sntp_server_name[] = "cn.pool.ntp.org";//NTP服务器域名为"cn.pool.ntp.org"
uint8_t sntp_server_ip[4] = {0}; /*用来保存解析NTP服务器域名得到的IP地址*/
uint8_t timezone = 39; //时区为中国
datetime date = {0};
uint8_t TimeFlag=0;//若从NTP服务器获取到时间,则置1

 5、W5500_Variable.h

#ifndef _W5500_Variable_H
#define _W5500_Variable_H#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "wizchip_conf.h"
#include "sntp.h"#define UDP_SOCKET0   0
//W5500使用SOCKET通道0作为UDP,UDP从网络获取时间不用等待extern wiz_NetInfo net_info;
extern uint16_t LocalPort;//W5500的本地端口#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
extern uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE];extern uint8_t sntp_server_name[];
extern uint8_t sntp_server_ip[4]; /*httpbin.org IP adress */
extern uint8_t timezone; //时区为中国
extern datetime date;
extern uint8_t TimeFlag;//若从NTP服务器获取到时间,则置1
#endif

6、main.c

#include "stm32f10x.h"//使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "delay.h"
#include "USART4.h"
#include "LED.h"
#include "socket.h"/*
NTP是网络时间协议(Network Time Protocol),它用来同步网络设备(如计算机、手机)的时间的协议。
NTP是一种用于同步网络中设备时间的协议,提供非常精确的时间同步机制,可以实现微秒级别的时间
同步。NTP使用复杂的算法,几乎不受网络延迟和抖动的影响,精度可以达到1-50毫秒。
SNTP是Simple Network Time Protocol的缩写。
SNTP是NTP的简化版本,去除了NTP中的一些复杂特性和功能,使得实现更加简单和轻量。SNTP的精度一
般能达到1秒左右,虽然不如NTP精确,但仍然足够满足大多数应用的需求。NTP服务器域名:
开源NTP服务器:cn.pool.ntp.org、0.cn.pool.ntp.org、1.cn.pool.ntp.org、2.cn.pool.ntp.org和3.cn.pool.ntp.org
NTP授时快速域名服务:cn.ntp.org.cn
Windows系统上自带的:time.windows.com
MacOS上自带的两个:time.apple.com 和 time.asia.apple.com
阿里云授时服务器:ntp.aliyun.com
腾讯云授时服务器:time1.cloud.tencent.com、time2.cloud.tencent.com、time3.cloud.tencent.com、time4.cloud.tencent.com和time5.cloud.tencent.com
*///ioLibrary库下载地址
//下载地址:https://gitee.com/wiznet-hk/STM32F10x_W5500_Examples
//源文件下载地址:https://gitee.com/wiznet-hk
#include "wiz_platform.h"
#include "wizchip_conf.h"
#include "wiz_interface.h"
#include "W5500_Variable.h"
#include "Do_DNS.h"void SNTP_Work(void);const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{	
//	SCB->VTOR = 0x8000000;//中断向量表重定义//	SystemInit();delay_init();//延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4USART4_Serial_Interface_Enable(115200);printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"LED_Init();LED0_ON();wiz_timer_init();  //配置TIM2每毫秒中断一次wiz_spi_init();    //SPI1初始化wiz_rst_int_init();//初始化W5500的RST引脚和INT引脚printf("%s network install example\r\n",_WIZCHIP_ID_);wizchip_initialize();//1.注册SPI片选函数,单字节读写函数和多字节读写函数//2.W5500使用RST引脚复位//3.读取芯片版本号码,并检查是否正确//4.读PHY配置寄存器的bit[2:0],bit0=1表示W5500连接到局域网//bit1=1表示当前网速为100M,否则为10M//bit2=1表示当前以太网采用全双工通讯,否则为半双工通讯TCP_network_init(ethernet_buf, &net_info);
//设置本地网络信息
//1.使用"默认网络参数"设置本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP模式
//2.读本地网络参数:MAC地址,GW网关,SN子网掩码,本地IP地址,DNS服务器IP地址,DHCP模式,然后从串口输出socket(UDP_SOCKET0, Sn_MR_UDP, LocalPort, 0x00);//令SOCKET端口0工作在UDP模式,并设置UDP端口为LocalPort//这里使用SOCKET通道0作为UDP客户端或服务端if (do_dns(ethernet_buf, sntp_server_name, sntp_server_ip)){//根据域名sntp_server_name[],通过DNS解析到IP地址,保存到sntp_server_ip[]printf("DNS request failed.\r\n");while (1){}}SNTP_init(TCP_SOCKET0, sntp_server_ip, timezone, ethernet_buf);while(1){SNTP_Work();LED0=!LED0;delay_ms(1000);}
}//函数功能:从NTP服务器获取时间
void SNTP_Work(void)
{if(TimeFlag!=1){if (SNTP_run(&date)){TimeFlag=1;printf("Beijing time now: %04d-%02d-%02d  %02d:%02d:%02d\r\n",\date.yy, date.mo, date.dd, date.hh, date.mm, date.ss);}}
}

7、测试结果

http://www.xdnf.cn/news/9683.html

相关文章:

  • 尚硅谷redis7 63-69 redis哨兵监控之理论简介
  • javase JDK 环境变量配置
  • 关于线程死锁的相关知识
  • PortSwigger-01-信息泄露
  • 借助Java,让Cloudflare API为你的网站管理加速
  • 篇章五 数据结构——链表(一)
  • 【CAPL实战】LIN校验和测试
  • 电脑硬盘空间大量被占用怎么办
  • 低功耗双目云台监控设备采用国标控制装置
  • 扩散模型原理详解:从噪声到艺术的神奇之旅
  • win32相关(进程间通信)
  • RISC-V特权模式及切换
  • Python中质数筛选及优化效率对比
  • 什么是事务?事务的四大特性(ACID)?
  • 通信应用高速模数转换器ADC
  • Mysql时间函数
  • MODIS数据下载及处理
  • 电商平台 API、数据抓取与爬虫技术的区别及优势分析
  • linux目录
  • CTFSHOW-WEB-36D杯
  • Unity数字人开发笔记——人物模型
  • 【Redis】热点key问题,的原因和处理,一致性哈希,删除大key的方法
  • 【C语言】深入理解C语言中的自定义数据类型:struct、union与enum
  • 大话软工笔记—基本概念
  • 三视图重建 笔记
  • python入门day02
  • 制导与导航总述、分类介绍、MATLABdemo
  • PROFIBUS转PROFINET网关:饲料行业的通信桥梁
  • LeetCode 543 二叉树的直径
  • 使用Miniconda管理Python环境