九、W5100S/W5500+RP2040树莓派Pico<SNTP 获取网络时间>

news2024/11/21 2:33:52

文章目录

  • 1 前言
  • 2 协议简介
    • 2.1 什么是SNTP
    • 2.2 SNTP的优点
    • 2.3 SNTP原理
    • 2.4 应用场景
  • 3 WIZnet以太网芯片
  • 4 SNTP网络设置示例概述以及使用
    • 4.1 流程图
    • 4.2 准备工作核心
    • 4.3 连接方式
    • 4.4 主要代码概述
    • 4.5 结果演示
  • 5 注意事项
  • 6 相关链接


1 前言

  随着科技的不断进步和应用需求的不断变化,SNTP协议也面临着一些挑战和机遇。随着网络技术的普及和物联网设备的增多,对于更精确的时间同步和更高效的同步方法的需求也将增加。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网SNTP应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

2 协议简介

2.1 什么是SNTP

  SNTP(Simple Network Time Protocol)是网络时间协议的简化版,它是一种用于在网络计算机上同步计算机时间的协议。

  SNTP协议采用客户端/服务器的工作方式,可以单播或者广播模式操作。SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。在单播模式下,SNTP客户端能够通过定期访问SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。

2.2 SNTP的优点

  SNTP的优点主要包括:

  1. 高度精确性:SNTP可以提供高度精确的时间同步,它可以将计算机时钟与全球卫星网络同步。这个同步可以达到10毫秒的精度,这对于计算机系统的日志、文件备份和还原等操作都非常重要。
  2. 网络延迟自适应:SNTP可以自动适应网络延迟的变化。当网络延迟变化时,SNTP可以自动调整时间戳,确保所有计算机都同步到正确的时间。
  3. 轻量级:与NTP相比,SNTP是一个轻量级的协议,它在网络中传输的数据量很小。这使得SNTP非常适合于低带宽、高延迟的网络环境中

2.3 SNTP原理

  工作原理是采用客户端/服务器的工作方式,可以通过单播(点对点)或者广播(一点对多点)模式操作。SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。

  在单播模式下,SNTP客户端可以通过定期访问SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。

  而在广播模式下,SNTP服务器会周期性地发送消息给指定的IP广播地址或者IP多播地址,SNTP客户端通过监听这些地址来获得时间信息。

  网络中一般存在很多台SNTP服务器,客户端会通过一定的算法选择最好的几台服务器使用。如果一台SNTP服务器在工作过程中失去了外部时间源,此时该SNTP服务器会告诉SNTP客户端“我失去了外部时间”。当SNTP客户端收到这个信息时,就会丢弃发生故障的SNTP服务器发给它的时间信息,然后重新选择其他的SNTP服务器。

2.4 应用场景

  SNTP协议广泛应用于以下场景:

  1. 网络设备时间同步:路由器、交换机等网络设备使用SNTP协议来同步时间,确保网络设备具有一致的时间标准。
  2. 日志记录:服务器、计算机等系统使用SNTP协议来同步时间,确保日志记录的时间准确无误。
  3. 电子商务:电子商务系统使用SNTP协议来同步时间,确保订单、交易等操作的时间一致性。

  除上述外,SNTP还被应用于计算机网络仿真军事仿真城市仿真等领域,SNTP计算方法可以用于模拟各种网络拓扑结构、协议和流量,以及战场环境和作战行动,为这些领域的网络设计和优化、军事决策、城市交通等提供支持。

3 WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

4 SNTP网络设置示例概述以及使用

4.1 流程图

  程序的运行框图如下所示:

在这里插入图片描述

4.2 准备工作核心

软件

  • Visual Studio Code
  • WIZnet UartTool

硬件

  • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • TTL 转 USB
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)
  • 通过TTL串口转USB,连接UART0 的默认引脚:
    • RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040进行接线时
    • RP2040 GPIO16 <----> W5100S MISO
    • RP2040 GPIO17 <----> W5100S CS
    • RP2040 GPIO18 <----> W5100S SCK
    • RP2040 GPIO19 <----> W5100S MOSI
    • RP2040 GPIO20 <----> W5100S RST
  • 通过PC和设备都通过网线连接路由器LAN口

4.4 主要代码概述

  我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。

第一步:sntp_client.c文件中加入对应的.h文件。

第二步:定义DHCP配置需要的宏。

第三步:网络信息的配置还有获取网络时间的服务器,以及配置时区,这里配置的是东八区可以找到sntp.c文件下找到东八区的编号是39。

第四步:编写定时器回调处理函数,用于DHCP 1s滴答定时器处理函数。

第五步:主函数先是对串口和SPI的初始化,然后写入W5100S的网络配置参数,初始化DHCP后开始DHCP获取IP,获取到就打印获取到的IP,获取次数超过最大获取次数时就使用静态IP,之后对SNTP传入socket号、服务器IP、时区序号、缓存buff进行初始化,主循环执行获取网络时间并且每一秒打印一次消息。

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/spi.h"

#include "wizchip_conf.h"
#include "bsp_spi.h"
#include "socket.h"
#include "sntp.h"
#include "dhcp.h"

#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)
#define DHCP_RETRY_COUNT 5 // DHCP retry times

wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e}, // Define MAC variables
    .ip = {192, 168, 1, 10},                     // Define IP variables
    .sn = {255, 255, 255, 0},                    // Define subnet variables
    .gw = {192, 168, 1, 1},                      // Define gateway variables
    .dns = {8, 8, 8, 8},                         // Define DNS  variables
    .dhcp = NETINFO_DHCP};                       // Define the DNCP mode
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;
static uint8_t sntp_get_ip_count = 0;
datetime date;
static uint8_t dhcp_get_ip_flag = 0; // Define the DHCP acquisition flag

/**
 * @brief   Timer callback processing function, used for dhcp timing processing
 * @param   repeating :Timer structure
 * @return  bool
 */
bool repeating_timer_callback(struct repeating_timer *t);

/**
 * @brief   Initialization of chip network information
 * @param   conf_info :Static configuration information
 * @return  none
 */
void network_init(wiz_NetInfo *conf_info);

int main()
{
    struct repeating_timer timer; // Define the timer structure

    /*mcu init*/
    stdio_init_all();     // Initialize the main control peripheral
    wizchip_initialize(); // spi initialization

    /*dhcp init*/
    DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initialization
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler

    network_init(&net_info);              // Configuring Network Information
    print_network_information(&get_info); // Read back the configuration information and print it

    /*sntp init*/
    SNTP_init(SOCKET_ID, sntp_server_ip, timezone, ethernet_buf); // NTP protocol initialization parameters
    printf("wiznet chip sntp client example.\r\n");

    while (true)
    {
        sntp_get_ip_count++;
        sleep_ms(1000);  // Print once a second
        SNTP_run(&date); // The NTP protocol obtains the current time from the server at the time of authorization
        if (sntp_get_ip_count > 2)
        {
            printf("NOW: %d-%d-%d  %d:%d:%d\r\n", date.yy, date.mo, date.dd, date.hh, date.mm, date.ss);
        }
    }
}

4.5 结果演示

在这里插入图片描述

  1. 打开WIZ UartTool,填入参数:选择串口对应的COM Port,波特率115200,8位数据位,1位停止位,无校验位,无流控,填完参数后点击open打开。
  2. 按下复位后,看到串口每一秒进行打印一次网络时间,表示获取网络时间成功。

5 注意事项

  • 需要选择一个可信赖的网络时间服务器,确保所选服务器支持您使用的网络时间协议。
  • 为了确保输出的时间在不同的时区中保持一致,您应该使用相应的时区编号。您可以使用timezone编号选择特定的时区。
  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:

(1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500;

(2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

6 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

想了解更多,评论留言哦!

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

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

相关文章

深度学习之基于Yolov8的汽车车流量统计系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介二、功能三、汽车车流量统计系统四. 总结 一项目简介 基于YOLOv8的汽车车流量统计系统是一种利用深度学习技术进行车辆检测和统计的系统。YOLOv8是一种目标…

解析开关电源测试项目:电源下降时间及其测试方法、测试规范、注意事项

开关电源下降时间是指电压从90%下降到10%的时间。下降时间是开关电源的重要特性参数&#xff0c;对于电路稳定以及信号传输的准确性至关重要&#xff0c;同时也对电路设计和调试具有重要意义。 电源下降时间测试方法和注意事项 测试目的&#xff1a;测试S.M.P.S. POWER ON时&am…

java spring boot 注解、接口和问题解决方法(持续更新)

注解 RestController 是SpringMVC框架中的一个注解&#xff0c;它结合了Controller和ResponseBody两个注解的功能&#xff0c;用于标记一个类或者方法&#xff0c;表示该类或方法用于处理HTTP请求&#xff0c;并将响应的结果直接返回给客户端&#xff0c;而不需要进行视图渲染…

IA3源码分析

IA3源码分析 PEFT 开源包中的模型代码实现 class IA3Model(BaseTuner):"""Example:py>>> from transformers import AutoModelForSeq2SeqLM, ia3Config>>> from peft import IA3Model, IA3Config>>> config IA3Config(... pe…

实力验证 | 求臻医学满分通过CAP及NCCL组织的国内外三项室间质评

近日&#xff0c;求臻医学以满分的优异成绩通过了由美国病理学家协会&#xff08;College of American Pathologists&#xff0c;CAP&#xff09;组织的NGS−A 2023&#xff1a;Next−Generation Sequencing (NGS) – Germline、NEO-B 2023 Neoplastic Cellularity能力验证项目…

User-Agent防爬虫与应对策略

引题 最近在看爬虫&#xff0c;也准备学习一下防爬的策略&#xff0c;世上莫大之事就是&#xff0c;我可以爬别人网站&#xff0c;别人不许爬我网站。 正文 什么是User-Agent User-Agent是一个HTTP请求头的一部分&#xff0c;它向Web服务器提供关于客户端&#xff08;通常是…

使用 RBAC 鉴权实战

使用 RBAC 鉴权实战 官方文档 创建名称 deployment-clusterrole 的 ClusterRole&#xff0c;该⻆⾊具备创建 Deployment、Statefulset、Daemonset 的权限&#xff0c;在命名空间 rbac-test 中创建名称为 cicd-token 的 ServiceAccount&#xff0c;绑定 ClusterRole 到 Service…

Linux学习第28天:Platform设备驱动开发(二): 专注与分散

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、硬件原理图分析 四、驱动开发 1、platform设备与驱动程序开发 53 /* 54 * 设备资源信息&#xff0c;也就是 LED0 所使用的所有寄存器 55 */ 56 static str…

揭秘!产品经理提升效率的秘密武器:10款AI生成PPT工具

AI的爆炸式增长表现令人惊艳&#xff0c;现有的各类AI工具正在重塑各行各业&#xff0c;不同程度地提高人们的工作效率&#xff0c;并有望创造新的职业机会。但是&#xff0c;面对市面上数量众多的AI工具&#xff0c;且每周都会蹦出新的产品&#xff0c;即便是以好奇心富称的产…

巴黎奥运会将基于阿里云实现云上转播

10月31日&#xff0c;2023杭州云栖大会&#xff0c;奥林匹克广播服务公司与奥林匹克频道服务公司首席技术官索蒂里斯萨拉穆里斯&#xff08;Sotiris SALAMOURIS&#xff09;表示&#xff0c;过去5年阿里云作为奥运会转播的基础设施&#xff0c;让奥运故事触达了更多全球观众。 …

c++实现策略模式

前言 看了一会儿大话设计模式&#xff0c;我感觉平常的话&#xff0c;策略模式还挺常用的&#xff0c;记录一下。个人理解策略模式&#xff0c;就是抽象一个算法&#xff0c;然后你可以有很多不同的实现&#xff0c;这些实现去重写抽象算法的虚方法。然后在一个上下文类中有一…

IT服务管理中怎样选择ITSM软件?

对于什么是一个新ITSM工具最重要的选择标准&#xff0c;业界都有不同的看法。其中67%的服务台用户认为是产品的特性和功能&#xff0c; 65%认为是自助服务功能&#xff0c;53%的人认为是轻松配置和定制的能力&#xff0c;45%的人认为是获得高质量的支持&#xff0c;45%的人认为…

Java入门篇 之 逻辑控制

博主的文章希望对大家有所帮助 今日份励志文案:凌空虚度&#xff0c;难成千秋伟业&#xff1b;求真务实&#xff0c;方能善作善成 冲冲冲&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目录 一.if~else语句 1.1.if-else语句基本用法&#xff1a; 1.2.代码…

C语言字符串详解

字符串详解 定义 输入输出 思考一&#xff1a; 思考二&#xff1a; 思考三 字符串的转义字符 思考四 常见的字符串函数 strcpy 拷贝数组 strlen 输出字符串长度 strcat 连接俩个字符串 strcmp 比较俩个字符串的大小 strupr 把字符串里面的小写转换成大写形式 s…

[ZenTao]禅道邮件通知设置

代码增加通知设置节点 module/message/config.php

正则表达式的使用实例

正则表达式的使用实例 1- 表示2- 实例 1- 表示 1, [:digit:] 表示0-9全部十个数字 //等价于 0123456789&#xff0c; 而不等价于[0123456789] 2, [[:digit:]] 表示任意一个数字 \{m,n\} 表示其前面的字符出现最少m次&#xff0c;最多n次的情况 \{3,\} 其前面的字符出…

git命令清单

一、设置和配置 1.初始化一个新的仓库&#xff1a; git init2.克隆&#xff08;Clone&#xff09;一个远程仓库到本地&#xff1a; git clone <repository_url>3.配置用户信息&#xff1a; git config --global user.name "Your Name" git config --global…

SpringBoot / Vue 对SSE的基本使用

一、SSE是什么&#xff1f; SSE技术是基于单工通信模式&#xff0c;只是单纯的客户端向服务端发送请求&#xff0c;服务端不会主动发送给客户端。服务端采取的策略是抓住这个请求不放&#xff0c;等数据更新的时候才返回给客户端&#xff0c;当客户端接收到消息后&#xff0c;再…

深入内核buddy分配器(芯驰X9/杰发8015 buddy系统明明还有几十M到100多M内存,却分配4k内存失败)

如上图内核打印分配4K内存失败&#xff0c;但是normal 类型的buddy系统还有大量内存。居然分配失败。源码分析&#xff1a; 根据logfaddr2line定位到&#xff0c;调用栈为__alloc_pages_slowpath——》get_page_from_freelist——》zone_watermark_fast 可以看到buddy内存低于…

node使用fs模块(一)—— 写入文件的基本使用

文章目录 前言一、写入文件的使用&#xff08;fs.writeFile&#xff09;1.参数说明2.基本使用(1)新建app.js 文件(2)代码如下(3)执行命令(4&#xff09;效果 3.写入文件的同步和异步&#xff08;1&#xff09;默认异步&#xff08;2&#xff09; 同步方法&#xff08;writeFile…