码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • gptp协议


    参考:

    PTP(Precision Time Protocol)高精度时间同步协议+linuxptp代码学习_lichenxi_0528的博客-CSDN博客_ptp协议

    车载以太网之时间同步协议gPTP - 知乎

    GPTP-智能驾驶时间同步之利器_king110108的博客-CSDN博客_自动驾驶时间同步

    gptp主要用于一个局域网内的各个节点的时钟同步,涉及到一些概念。

    IEEE 802.1AS-2011

    • gptp协议

    gptp协议由三部分构成

    1. Header (对所有gPTP都一样)
    2. Body (取决于gPTP 报文类型)
    3. TLV(type length value)

    报文帧位于Mac层,mac帧的类型为Ethertype = 0x88F7。

    • Header: 固定是34个字节,结构如下

    • Body:根据gptp协议的类型决定(在Header中的Message type决定,取值范围如下)

    gptp需要实现的任务

    • BCMA:Best Master Clock Algorithm,最佳主时钟选择算法

    当系统上电后,系统所有的设备都会发一条报文来参与主时钟竞选,每一个设备都会比较自己的时钟与其他设备的时钟信息,所有节点都这样,直到选出主时钟(一个GPTP系统可以预先设定一个主时钟(比如网关等),也可以通过BCMA算法得到)

    • 频率同步:

    每个节点的时钟频率不一致,比如实际时间过了100s, 从节点A计时是过了90s,所以从节点需要和主节点的时钟频率需要匹配 

    原理:主节点过10s,从节点过 9s,那么这个偏差R = 10 / 9,然后每次从节点拿到时间就会*R ,来得到和主节点一样的时间。

    偏差公式: R = (T3 - T1) / (T4 - T2) 

    说白了R 就是两边的时间转换系数。

    • 延时测量

    为了将自己的时钟与master同步,slave必须测量出自己与master之间报文传递的延迟时间。时延测量使用到的上文中提到的PDelay_Req、PDelay_Resp和PDelay_Resp_Followup三种gPTP报文。具体的测量方式如下图所示:

    从逻辑上理解:就是要算delay的时间,当到达T4时间的时候,slave拿到了T1~T4 ,所以按理说: slave---->master: delay = T4*R -T3

          master---->slave:delay = T2 -T1*R,

    但是来回需要取平均,于是总的dealy:

    delay = [ (T4*R -T3) + (T2 -T1*R) ] /2, 把公式整理下:

    delay = [(T4 - T1)*R - (T3 - T2) ] /2

    • 时间同步

    按理算:T1到达Ta的时候,Tb = T1 + delay + (Tb-T2)*R  一定要*R,因为对于slave来说,经过了(Tb-T2)实际上转换到master的时间是 (Tb- T2) *R才行。

    R = [Ta - ( T1 + delay) ]  / (Tb - T2),  于是可以实现 Ta  = Tb 

    • 实现方式
    • 设备在PTP这块采用的传输层协议是UDP。PTP协议使用的端口号是319和320,
    1. #define EVENT_PORT        319
    2. #define GENERAL_PORT      320

    (1)319对应事件消息(EVENT),需要网口记录收发时间戳

    (2)320对应普通消息(GENERAL),无需记录收发时间戳。

    • 需要通过UDP接受发送5种报文:sync报文,Follow_Up报文,Delay_Follow_Up报文,Delay_Req报文,Delay_Resp报文。并针对master和slave端收发上述的报文做相应的逻辑处理。
    • 如何设置某个设备为主时钟?
  • 相关阅读:
    项目进展(十)-解决ADS1285在调试时出现的问题
    javaFx+google chrome测试下载视频
    学习ASP.NET Core Blazor编程系列十五——查询
    error LNK2038: mismatch detected for ‘RuntimeLibrary
    物联网开发笔记(18)- 使用Micropython开发ESP32开发板之点亮LED和操作PWM呼吸灯
    盘点自动化测试新手要避免的那些坑
    计算机网络填空题
    Redis实现分布式锁源码分析
    算法——单调队列
    微信小程序 | 游戏开发之接宝石箱子游戏
  • 原文地址:https://blog.csdn.net/m0_37844072/article/details/126226032
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号