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

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,          // 指向到 KSNetworkAdapterConfig0);                        // 标志

如果是 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_UDPportConfig.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.mzph.cn/bicheng/63198.shtml

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

相关文章

【深度学习】利用Java DL4J 训练金融投资组合模型

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s…

支持向量机算法:原理、实现与应用

摘要&#xff1a; 本文深入探讨支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;算法&#xff0c;详细阐述其原理、数学模型、核函数机制以及在分类和回归问题中的应用方式。通过以 Python 和 C# 为例&#xff0c;展示 SVM 算法在不同编程环境下的具体…

STM32编码器接口及编码器测速模板代码

编码器是什么&#xff1f; 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器&#xff0c;我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分&#xff0c;可以分为增量式编码器和绝对式编码器。 从编码器检测原理上来分&#xff0…

TCP连接过程中涉及到的状态转换

TCP连接过程中涉及到的状态转换 TCP 服务器和客户端都要有一定的数据结构来保存这个连接的信息。 在这个数据结构中其中就有一个属性叫做 “状态” 操作系统内核根据状态的不同&#xff0c;决定了当前应该干什么。(不会迷茫也不会混乱) LISTEN LISTEN状态&#xff0c;表示服务…

COCO数据集理解

COCO&#xff08;Common Objects in Context&#xff09;数据集是一个用于计算机视觉研究的广泛使用的数据集&#xff0c;特别是在物体检测、分割和图像标注等任务中。COCO数据集由微软研究院开发&#xff0c;其主要特点包括&#xff1a; 丰富的标签&#xff1a;COCO数据集包含…

github仓库自动同步到gitee

Github Actions是Github推出的自动化CI/CD的功能&#xff0c;我们将使用Github Actions让Github仓库同步到Gitee 同步的原理是利用 SSH 公私钥配对的方式拉取 Github 仓库的代码并推送到 Gitee 仓库中&#xff0c;所以我们需要以下几个步骤 生成 SSH 公私钥添加公钥添加私钥配…

【六足机器人】03步态算法

温馨提示&#xff1a;此部分内容需要较强的数学能力&#xff0c;包括但不限于矩阵运算、坐标变换、数学几何。 一、数学知识 1.1 正逆运动学&#xff08;几何法&#xff09; 逆运动学解算函数 // 逆运动学-->计算出三个角度 void inverse_caculate(double x, double y, …

Netty面试内容整理-编码实战相关问题

在 Netty 面试中,编码实战相关的问题会考察你的动手能力,具体包括 Netty 框架的使用、如何设计网络协议、如何处理一些常见的实际开发问题等。以下是一些常见的编码实战相关面试问题及要点: 如何实现一个简单的 Netty Echo 服务器? 一个 Echo 服务器是 Netty 编码的经典示例…

文化央企再一次声明

央企再次声明 中传国华&#xff08;北京&#xff09;科技有限公司&#xff0c;成立于2023年5月29日&#xff0c;原法定代表人曹忠喜&#xff0c;统一社会信用代码&#xff1a;91110117MACL4B9A91&#xff0c;我司中传世纪控股&#xff08;北京&#xff09;有限公司系该司的原股…

Ubuntu实时流量检测

nethogs启动 安装nethogs sudo apt install nethogs流量检测 sudo nethogs效果如下&#xff1a; 可以看到收发流量的进程PID&#xff0c;进程目录&#xff0c;发送设备&#xff0c;以及收发速率&#xff1b;但这里有个unkown TCP进程是什么呢? 可以用ps -e 列出操作前后的…

大数据新视界 -- 大数据大厂之 Hive 临时表与视图:灵活数据处理的技巧(上)(29 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【C语言】二维数组前缀和

相信你是最棒哒&#xff01;&#xff01;&#xff01; 文章目录 问题描述 题目代码&#xff1a; 总结 问题描述 输入一个 &#x1d45b;n 行 &#x1d45a;m 列的整数矩阵&#xff0c;再输入 &#x1d45e;q 个询问&#xff0c;每个询问包含四个整数 &#x1d465;1,&#x…

使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(2)

接《使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(1)》 一、添加分析组 1.1 代码实现 #添加分析组 addanalysisgroup(); set("name", "grating_R"); set("x", 0); set("y", 2.5*um); addanalysisgrou…

车载测试技术栈

软件测试理论知识 了解软件测试的基本概念、流程和方法&#xff0c;包括测试需求分析、测试用例设计、测试执行、缺陷发现和修复等。 汽车行业知识 熟悉汽车行业的特点和规范&#xff0c;了解汽车的构造和工作原理&#xff0c;包括发动机、底盘、电气系统等。 通信协议知识 …

61 基于单片机的小车雷达避障及阈值可调

所有仿真详情导航&#xff1a; PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、主程序编程 四、资源下载 一、主要功能 基于51单片机&#xff0c;采用超声波传感器检测距离&#xff0c;通过LCD1602显示屏显示&#xff0c;三个按键&#xff0c;第一个按键是…

Linux基本命令---文件权限与用户管理

在Linux系统中&#xff0c;文件权限与用户管理是两个核心概念&#xff0c;它们共同维护着系统的安全性和稳定性。以下是如何在Linux系统中体验文件权限与用户管理的详细步骤&#xff1a; 一、用户管理 创建新用户 使用adduser命令可以创建新用户。例如&#xff0c;创建一个名为…

Ubuntu——extrepo添加部分外部软件源

extrepo 是一个用于 Ubuntu 和其他基于 Debian 的系统的工具&#xff0c;它的主要作用是简化和管理外部软件源&#xff08;repositories&#xff09;的添加和更新。通过使用 extrepo&#xff0c;用户可以方便地添加、删除和管理第三方软件源&#xff0c;而不需要手动编辑源列表…

Java集合排序技术详解

在Java编程中&#xff0c;对集合进行排序是一项常见的任务。Java提供了多种方式来对集合进行排序&#xff0c;包括使用Collections.sort()、Arrays.sort()、List接口的sort()方法以及Java 8引入的Stream API。本文将详细介绍这些排序技术&#xff0c;并探讨它们的使用场景和性能…

WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门

作为一个使用Node.js多年的开发者&#xff0c;我已经习惯于用Node.js写一些web应用来为工作服务&#xff0c;因为实现快速、部署简单、自定义强。今天我们一起来学习一个全栈工程师必备技能&#xff1a;web路由。&#xff08;观看此文的前提是默认你已经装好nonde.js了&#xf…

【机器学习算法】——逻辑回归

目录 逻辑回归理解损失函数代码练习1. 房屋价格与面积的关系2.基于学生特征的录取概率预测 逻辑回归理解 逻辑回归是用来二分类的&#xff01; 是在线性回归模型之后加了一个激活函数&#xff08;Sigmoid)将预测值归一化到【0~1】之间&#xff0c;变成概率值。 一般计算其中一…