通过精密时间协议(PTP)对计算机网络中的多个设备进行时间同步

news2024/12/27 5:33:15

PTP 模块 - 使用教程


目录

  • PTP 模块 - 使用教程
    • 简介
    • 第 1 步:为主时钟创建一个 PTP 时钟实例
    • 第 2 步:添加 PTP 端口
    • 第 3 步:查询 PTP 时钟或 PTP 端口的状态
    • 第 4 步:清除 FAULTY 状态
    • 第 5 步:为 PTP 事件安装处理程序
    • 第 6 步:锁定 PTP 时钟
    • 第 7 步:获取当前 PTP 时间


简介

在本教程中,您将了解如何使用 PTP 协议在网络中设置时间同步。我们假设您已经知道如何设置项目并打开驱动程序以开始工作。如果你不熟悉这个,你应该看看 第一个项目 教程。

精确时间协议 (PTP) 是遵循 IEEE 1588 标准的网络协议。使用此协议,可以同步计算机网络中多个设备的时间。Kithara PTP模块实现了PTP Version 2 IEEE 1588-2008的 “边界时钟”,它可以通过多个网络连接拥有多个端口。

主时钟可以是 grandmaster、master 或 slave。它也可以在一个端口上是 slave 端口,在其他端口上是 master 端口。该模式可通过 API 选择: 1. 大师 2.最佳主时钟算法 (BMCA) 3.仅限 Slave。通过为网络中的 PTP 时钟设置优先级,可以配置特定的层次结构。这还可能包括在发生故障时接管的冗余组件。否则,clock 参数,如 clocksource 的精度和 type (例如 Atomic clock,GPS) 决定哪个 clock 成为 master。

作为传输层,Raw-Ethernet 和 IPv4/UDP 是可能的为了获得极高的精度 (< 1 us),选定的网络控制器支持硬件时间戳。本教程将引导您完成以下步骤:

1 步:为主时钟创建 PTP 时钟实例
 	第 2 步:添加 PTP 端口
	第 3 步:查询 PTP 时钟或 PTP 端口的状态
	第 4 步:清除 FAULTY 状态
 	第 5 步:为 PTP 事件安装处理程序
 	第 6 步:锁定 PTP 时钟]7 步:获取当前 PTP 时间

第 1 步:为主时钟创建一个 PTP 时钟实例

要为 system-master-clock 创建 PTP 时钟实例,请调用 KS_createPtpClock 并将 KS_INVALID_HANDLE传递给 hDevice。可以为一个或多个进程创建多个句柄,这些进程共享这个 master-clock-instance。使用 KSPtpClockConfig 结构,可以设置 clock 参数。参数 0 ,代表使用默认值。

  KSPtpClockConfig clockConfig  = {0};
  clockConfig.structSize = sizeof(KSPtpClockConfig);
  clockConfig.mode = KS_PTP_BEST_MASTER_CLOCK_ALGORITHM;
  clockConfig.priority1 = 128;
  clockConfig.priority2 = 128;

KSHandle hClock;
  ksError = KS_createPtpClock(
              &hClock,           // 指向 store Handle 的指针
              KS_INVALID_HANDLE, // 设备句柄(可选)
              &clockConfig,      // 指向 KSPtpClockConfig 的指针
              0);                  // 标志

第 2 步:添加 PTP 端口

要首先将 PTP 端口添加到 PTP 时钟,必须打开应建立协议的网络适配器。通过在 KSNetworkAdapterConfig 结构的 configFlags 中设置配置标志 KS_NETWORK_ENABLE_PTP,将为网络适配器启用硬件时间戳(如果支持)。

  KSNetworkAdapterConfig adapterConfig = {0};
  adapterConfig.structSize = sizeof(KSNetworkAdapterConfig);
  adapterConfig.configFlags = KS_NETWORK_ACCEPT_ALL |KS_NETWORK_ENABLE_PTP;

KSHandle hAdapter;
  ksError = KS_openNetworkAdapter(
              &hAdapter,               // 适配器手柄
              pDeviceName,             // 适配器的设备名称
              &adapterConfig,          // 指向到 KSNetworkAdapterConfig
              0);                        // 标志

如果是 UDP/IPv4 用作传输层,则必须设置适配器的 IP 配置。

    
if (portConfig.transportLayer == KS_PTP_UDP) {
    KSIPConfig config;
    KS_makeIPv4(&config.localAddress,192,168,0,5);
    KS_makeIPv4(&config.subnetMask,255,255,255,0);
    KS_makeIPv4(&config.gatewayAddress,192,168,0,1);

ksError = KS_execNetworkCommand(
                hAdapter,                  // 适配器句柄
                KS_NETWORK_SET_IP_CONFIG,  // 命令
                &config,                   // 参数
                0);                          // 标志
  }

最后,通过使用 KS_addPtpPort 传递时钟句柄和网络适配器句柄来添加 PTP 端口。使用 KSPtpPortConfig 可以设置 PTP 端口选项。

    
KSPtpPortConfig portConfig = {0};
  portConfig.structSize = sizeof(KSPtpPortConfig);
  portConfig.transportLayer = KS_PTP_ETHERNET;     //  或 KS_PTP_UDP
  portConfig.announceInterval = 1;
  portConfig.syncInterval = 0;
  portConfig.delayRequestInterval = 0;

KSHandle hPort;
  ksError = KS_addPtpPort(
              hClock,          // PTP 时钟句柄
              &hPort,          // PTP 端口句柄
              hAdapter,        // 连接句柄
              &portConfig,     // 指向 KSPtpPortConfig 的指针
              0);                // 标志

第 3 步:查询 PTP 时钟或 PTP 端口的状态

要查询 PTP 时钟状态,请调用 KS_getPtpClockState。它返回一个填充的 KSPtpClockState 结构,其中包含时钟 ID、父端口 ID 和主 ID 等信息,以及此时钟与所选主时钟之间的步骤。

  KSPtpClockState state = {0};
  state.structSize = sizeof(KSPtpClockState);

ksError = KS_getPtpClockState(
              hClock,           // PTP 时钟句柄
              &state,           // 指向 KSPtpClockState 的指针
              0);                 // 标志

要查询 PTP 端口状态,请使用 KS_getPtpPortState。它返回一个填充的 KSPtpPortState 结构,其中包含端口的当前 PTP 状态。

  KSPtpPortState portState = {0};
  portState.structSize = sizeof(KSPtpPortState);

ksError = KS_getPtpPortState(
              hPort,             // PTP 端口句柄
              &portState,        // 指向 KSPtpPortState 的指针
              0);                  // 标志

第 4 步:清除 FAULTY 状态

如果发生故障或检测到故障,PTP 端口将进入 KS_PTP_STATE_FAULTY 状态。可以通过运行以下命令来清除此状态:

  ksError = KS_execPtpCommand(
              hPort,                // PTP 句柄
              KS_PTP_CLEAR_FAULTS,  // 命令
              NULL,                 // 参数
              0);                     // 标志

执行此命令后,PTP 端口将重新初始化。

第 5 步:为 PTP 事件安装处理程序

使用 KS_installPtpHandler 可以安装 PTP 事件的处理程序:

要安装一个处理程序,如果为 PTP 时钟选择了新的 PTP 主节点,则将被调用,请使用 KS_PTP_MASTER_SELECTED 事件代码:

  ksError = KS_installPtpHandler(
              hClock,                   // PTP 句柄
              KS_PTP_MASTER_SELECTED,   // 事件代码
              hCallBack,                // 信号句柄
              0);                         // 标志

要在每次 PTP 端口更改其状态时收到通知,请使用 KS_PTP_PORT_STATE_CHANGED 事件代码:

  ksError = KS_installPtpHandler(
              hPort,                       // PTP 句柄
              KS_PTP_PORT_STATE_CHANGED,   // 事件代码
              hCallBack,                   // 信号句柄
              0);                            // 标志

第 6 步:锁定 PTP 时钟

通过调用 KS_lockPtpClock ,绝对时间偏移量被锁定。这对于避免时间关键型应用程序中的时间跳跃是必要的。当处于锁定状态时,漂移校正保持工作,偏移量在内部保持。

  ksError = KS_lockPtpClock(hClock,0);

解锁调用 KS_unlockPtpClock

  ksError = KS_unlockPtpClock(hClock,0);

第 7 步:获取当前 PTP 时间

要获取当前的 PTP 时间调用_KS_getClock_ 和 KS_CLOCK_PTP_TIME 时钟源。

  int64 time;
  KS_getClock(&time,KS_CLOCK_PTP_TIME);

PTP 时间纪元以纳秒为单位计数,自 1970 年 1 月 1 日 00:00:00 TAI(原子时)以来。除了 UTC 时间之外,它不考虑闰秒。要获取当前的 UTC 时间,请使用 KS_CLOCK_ABSOLUTE_TIME 时钟源调用 KS_getClock

  int64 time;
  KS_getClock(&time,KS_CLOCK_ABSOLUTE_TIME);

KS_CLOCK_ABSOLUTE_TIME 自 1.1.1601 00:00:00 以来以 100ns 为单位计数。它确实考虑了闰秒。

建立 PTP 网络后,所有设备中主时钟的时间将同步。根据所使用的硬件,在网络中可以实现低于 1 us 的永久精度。

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

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

相关文章

基于Springboot+Vue的在线答题闯关系统

基于SpringbootVue的在线答题闯关系统 前言&#xff1a;随着在线教育的快速发展&#xff0c;传统的教育模式逐渐向互联网教育模式转型。在线答题系统作为其中的一个重要组成部分&#xff0c;能够帮助用户通过互动式的学习方式提升知识掌握度。本文基于Spring Boot和Vue.js框架&…

Web(CSS+JS+HTML实现简单界面)

前言 写的是个人博客界面&#xff0c;代码比较冗余&#xff0c;web的一个小作业。。。。。。 因为后面改了一次&#xff0c;有些css是直接写到了html文件中&#xff0c;重复的代码也比较多。 项目结构 CSS style.css * {margin: 0;padding: 0;box-sizing: border-box; }b…

Scala:正则表达式

object test03 {//正则表达式def main(args: Array[String]): Unit {//定义一个正则表达式//1.[ab]:表示匹配一个字符&#xff0c;或者是a&#xff0c;或者是b//2.[a-z]:表示从a到z的26个字母中的任意一个//3.[A-Z]:表示从A到Z的26个字母中的任意一个//4.[0-9]:表示从0到9的10…

经验帖 | Matlab安装成功后打不开的解决方法

最近在安装Matlab2023时遇到了一个问题&#xff1a; 按照网上的安装教程成功安装 在打开软件时 界面闪一下就消失 无法打开 但是 任务管理器显示matlab在运行中 解决方法如下&#xff1a; matlab快捷方式–>右键打开属性–>目标 填写许可证文件路径 D:\MATLAB\MatlabR20…

VCU——matlab/simulink软件建模

一、认识MATLAB/Simulink 1. matlab主界面 2. simulink 二、Simulink 建模基础 1. Simulink模块 2. 模型的仿真 matlab 中比较两个浮点型&#xff0c;不要用&#xff0c;采取差值和Compare To Constant的方案 3. 自动代码生成

(软件测试文档大全)测试计划,测试报告,测试方案,压力测试报告,性能测试,等保测评,安全扫描测试,日常运维检查测试,功能测试等全下载

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

Crash-SQLiteDiskIOException

目录 相关问题 日志信息 可能原因 问题排查 相关问题 蓝牙wifi无法使用 日志信息 可能原因 磁盘空间不足&#xff1a;当设备上的可用存储空间不足时&#xff0c;SQLite无法完成磁盘I/O操作&#xff0c;从而导致SQLiteDiskIOException。 数据库文件损坏&#xff1a;如果数…

PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具

PyTorch 深度学习框架简介&#xff1a;灵活、高效的 AI 开发工具 PyTorch 作为一个深度学习框架&#xff0c;以其灵活性、可扩展性和高效性广受欢迎。无论是在研究领域进行创新实验&#xff0c;还是在工业界构建生产级的深度学习模型&#xff0c;PyTorch 都能提供所需的工具和…

Java Web 4 Maven

本文详细介绍了Maven的用途&#xff0c;包括依赖管理、项目结构统一和构建流程标准化&#xff1b;然后讲解了Maven的安装、IDEA中的集成以及依赖管理的核心概念。 1 什么是Maven&#xff1f; 什么是apache&#xff1f; 2 Maven的作用 &#xff08;1&#xff09;方便依赖管理 有…

无人机吊舱类型详解!

一、侦察与监测类吊舱 电子侦察吊舱 功能&#xff1a;主要用于侦察和监测目标&#xff0c;具备侦察、监听、干扰等多种功能。 设备&#xff1a;通常安装有电子侦察设备和通信设备&#xff0c;可以实时获取目标的电子信息&#xff0c;并将数据传输回地面指挥中心。 应用&…

数据结构与算法之美:顺序表详解

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《题海拾贝》、《编程之路》、《数据结构与算法之美》 欢迎点赞、关注&#xff01; 1、 什么…

Neo4j 图数据库安装与操作指南(以mac为例)

目录 一、安装前提条件 1.1 Java环境 1.2 Homebrew&#xff08;可选&#xff09; 二、下载并安装Neo4j 2.1 从官方网站下载 2.1.1 访问Neo4j的官方网站 2.1.2 使用Homebrew安装 三、配置Neo4j 3.1 设置环境变量(可选) 3.2 打开配置文件(bash_profile) 3.2.1 打开终端…

Linux centOS 7 安装 rabbitMQ

1.安装前需要了解&#xff0c;rabbitmq安装需要先安装erlang&#xff0c;特别注意的是erlang与rabbitmq的版本之间需要匹配。 el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm - rabbitmq/rabbitmq-server packagecloud 3.10版本的rabbitmq 对于erlang的版本要求可以看此连接…

SpringBoot整合Mockito进行单元测试超全详细教程 JUnit断言 Mockito 单元测试

Mock概念 Mock叫做模拟对象&#xff0c;即用来模拟未被实现的对象可以预先定义这个对象在特定调用时的行为&#xff08;例如返回值或抛出异常&#xff09;&#xff0c;从而模拟不同的系统状态。 导入Mock依赖 pom文件中引入springboot测试依赖&#xff0c;spring-boot-start…

QT 中 sqlite 数据库使用

一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …

微信小程序配置less并使用

1.在VScode中下载Less插件 2.在微信小程序中依次点击如下按钮 选择 从已解压的扩展文件夹安装… 3.选中刚在vscode中下载安装的插件文件 如果没有修改过插件的安装目录&#xff0c;一般是在c盘下C:\用户\用户名.vscode\extensions\mrcrowl.easy-less-2.0.2 我的路径是&#xf…

ClouderaManager 集群搭建

前提&#xff1a;服务器之前做过域名映射、免密登录 ClouderaManager 集群 1. 组件分布规划 服务器服务器h1zk、hdfs(dn)、yarn(nm)、spark、kafka、flumeh2hdfs(nn-standy)、yarn(rm-active)、sparkh3hdfs(nn-active)、yarn(rm-standy)、hive、sparkh4zk、hdfs(dn)、yarn(n…

OpenHarmony-3.HDF框架(2)

OpenHarmony HDF 平台驱动 1.平台驱动概述 系统平台驱动框架是系统驱动框架的重要组成部分&#xff0c;它基于HDF驱动框架、操作系统适配层(OSAL, operating system abstraction layer)以及驱动配置管理机制&#xff0c;为各类平台设备驱动的实现提供标准模型。 系统平台驱动(…

Guiding a Diffusion Model with a Bad Version of Itself

Guiding a Diffusion Model with a Bad Version of Itself Abstract1. Introduction2. Background3. Why does CFG improve image quality?Score matching leads to outliers.CFG 消除异常值Discussion 4 Our method Abstract 在图像生成扩散模型中&#xff0c;主要关注的轴心…

Tomcat,javaweb, servlet , springBoot

在server.xml里配置服务器 <scope>provided</scope>打包的时候&#xff0c;这个jar包不会被打进去&#xff0c;因为tomcat已将封装了这个jar包&#xff0c;没必要要这个