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

通过精密时间协议(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 的永久精度。

相关文章:

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

PTP 模块 - 使用教程 目录 PTP 模块 - 使用教程简介第 1 步&#xff1a;为主时钟创建一个 PTP 时钟实例第 2 步&#xff1a;添加 PTP 端口第 3 步&#xff1a;查询 PTP 时钟或 PTP 端口的状态第 4 步&#xff1a;清除 FAULTY 状态第 5 步&#xff1a;为 PTP 事件安装处理程序第…...

Docker 安装系列

Centos8 安装Docker Docker安装mysql8.0 Docker安装稳定版本nginx-1.26.2 Docker 安装最新版本 Jenkins Docker Redis Docker 安装 eclipse-mosquitto Docker mongo:5.0 Docker 安装 Redis的完全体版本RedisMod docker pull elasticsearch:8.0.0 docker 安装nacos v2.…...

使用springboot-3.4.1搭建一个netty服务并且WebSocket消息通知(适用于设备直连操作,以及回复操作)

引入最新版本 <!--websocket--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>启动类加入 //netty 协议服务端口启动 NettyTcpHandler.start()…...

4. 设计模式分类

4.1 创建型模式 这类模式提供创建对象的机制,能够提升已有代码的灵活性和可复用性。 序 号 类 型 业务场景 实现要点 1 工 厂 方 法 多种类型商品不同接口,统一发奖服 务搭建场景 定义一个创建对象的接口,让其子类自 己决定实例化哪一个工厂类,工厂模式 使其创建过程延迟…...

Hive分区值的插入

对于Hive分区表&#xff0c;在我们插入数据的时候需要指定对应的分区值&#xff0c;而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致&#xff0c;或者提供的分区值是NULL的情况&#xff0c;下面我们依次来展现下不同情况下的表现…...

【多个图片合并成PDF】

因工作安排,小编最近参加了几场学术会议,被多名业界大佬的汇报所震撼。当然也不是白来的,好东西要留存下来回来分享给科室。因此,小编变成了幻灯片专职摄影师,参会的同时对着大牛的PPT就是一顿咔咔咔。回来后,面对手机里数百张照片却犯了难,就这样一张张发到群里么?还是…...

Flutter动画(三)内建显式动画Widget

常见的内建显式动画Widget&#xff1a; ListenableBuilder&#xff1a; AnimatedBuilder AnimatedWidget AlignTransition DecoratedBoxTransition DefaultTextStyleTransition PositionedTransition RelativePositionedTransition RotationTransition ScaleTransiti…...

本地运行打包好的dist

首先输入打包命令 每个人设置不一样 一般人 是npm run build如果不知道可以去package.json里去看。 打包好文件如下 命令行输入 :npm i -g http-server 进入到dist目录下输入 命令cmd 输入 http-server 成功...

什么是Layer Normalization?

一、概念 前面的文章中&#xff0c;我们介绍了Batch Normalization。BN的目的是使得每个batch的输入数据在每个维度上的均值为0、方差为1&#xff08;batch内&#xff0c;数据维度A的所有数值均值为0、方差为1&#xff0c;维度B、C等以此类推&#xff09;&#xff0c;这是由于神…...

17. Threejs案例-Three.js创建多个立方体

17. Threejs案例-Three.js创建多个立方体 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 WebGL 场景的核心类。它负责将场景中的对象渲染到画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选…...

RK3568 Android14 打开蓝牙时默认同意

1、最近给一个项目做了一款基础功能的自动测试&#xff0c;在打开蓝牙时&#xff0c;有一个是否同意的提示框要去掉&#xff0c;即默认同意打开蓝牙。 2、路径&#xff1a; packages/apps/Settings/src/com/android/settings/bluetooth/RequestPermissionActivity.java// Sho…...

多模态视频大模型Aria在Docker部署

多模态视频大模型Aria在Docker部署 契机 ⚙ 闲逛HuggingFace的时候发现一个25.3B的多模态大模型&#xff0c;支持图片和视频。刚好我有H20的GPU所以部署来看看效果&#xff0c;因为我的宿主机是cuda-12.1所以为了防止环境污染采用docker部署&#xff0c;通过一系列的披荆斩棘…...

Ant-Design-Vue 全屏下拉日期框无法显示,能显示后小屏又位置错乱

问题1&#xff1a;在全屏后 日期选择器的下拉框无法显示。 解决&#xff1a;在Ant-Design-Vue的文档中&#xff0c;很多含下拉框的组件都有一个属性 getPopupContainer可以用来指定弹出层的挂载节点。 在该组件上加上 getPopupContainer 属性,给挂载到最外层盒子上。 <temp…...

AMR移动机器人赋能制造业仓储自动化升级

在当今制造业的激烈竞争中&#xff0c;智能化、数字化已成为企业转型升级的关键路径。一家制造业巨头&#xff0c;凭借其庞大的生产体系和多个仓库资源&#xff0c;正以前所未有的决心和行动力&#xff0c;在制造业智能化浪潮中勇立潮头&#xff0c;开启了降本增效的新篇章。这…...

【PHP项目实战】活动报名系统

目录 项目介绍 开发语言 后端 前端 项目截图&#xff08;部分&#xff09; 首页 列表 详情 个人中心 后台管理 项目演示 项目介绍 本项目是一款基于手机浏览器的活动报名系统。它提供了一个方便快捷的活动报名解决方案&#xff0c;无需下载和安装任何APP&#xff0c…...

【HarmonyOS】Component组件引入报错 does not meet UI component syntax.

【HarmonyOS】Component组件引入报错 一、问题背景 有时会碰到引入组件时&#xff0c;无法import引入组件&#xff0c;导致引入的组件报错。 或者提示does not meet UI component syntax. &#xff08;不符合UI组件语法。&#xff09; 如下图所示&#xff0c;在引入组件时&a…...

vue3项目最新eslint9+prettier+husky+stylelint+vscode配置

一、eslint9和prettier通用配置 安装必装插件 ESlint9.x pnpm add eslintlatest -DESlint配置 vue 规则 , typescript解析器 pnpm add eslint-plugin-vue typescript-eslint -DESlint配置 JavaScript 规则 pnpm add eslint/js -D配置所有全局变量 globals pnpm add globa…...

备赛蓝桥杯--算法题目(3)

1. 2的幂 231. 2 的幂 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isPowerOfTwo(int n) {return n>0&&n(n&(-n));} }; 2. 3的幂 326. 3 的幂 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool isPowerOfT…...

CSS中要注意的样式效果

1. 应用过渡效果 transition: var(--aa); 2.告诉浏览器元素可能会发生变换&#xff0c;从而优化性能。 will-change: transform; 3.使元素不响应鼠标事件。 pointer-events: none; 4.隐藏水平方向上的溢出内容 overflow-x: hidden; 5.定义一个元素的宽度和高度之间的比…...

【NIPS2024】Unique3D:从单张图像高效生成高质量的3D网格

背景&#xff08;现有方法的不足&#xff09;&#xff1a; 基于Score Distillation Sampling &#xff08;SDS&#xff09;的方法&#xff1a;从大型二维扩散模型中提取3D知识&#xff0c;生成多样化的3D结果&#xff0c;但存在每个案例长时间优化问题/不一致问题。 目前通过微…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...