精华内容
下载资源
问答
  • Qt实现NTP时钟同步

    千次阅读 2014-03-18 14:12:11
    QT 写的从网络NTP 服务器获得网络时间的方法(4) #include "tttt.h" #include "ui_tttt.h" #include #include #include //#include tttt::tttt(QWidget *parent) :  QMainWindow(parent),  ui(new Ui
    

    QT 写的从网络NTP 服务器获得网络时间的方法(4)

    #include "tttt.h"
    #include "ui_tttt.h"
    #include <QHostInfo>
    #include <QDateTime>
    #include <QAudioFormat>
    //#include <winsock2.h>

    tttt::tttt(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::tttt)
    {
        ui->setupUi(this);
        connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushbutton_clicked()));

    }

    tttt::~tttt()
    {
        delete ui;
    }

    void tttt::changeEvent(QEvent *e)
    {
        QMainWindow::changeEvent(e);
        switch (e->type()) {
        case QEvent::LanguageChange:
            ui->retranslateUi(this);
            break;
        default:
            break;
        }
    }
    void tttt::on_pushbutton_clicked()
    {
        QHostInfo info=QHostInfo::fromName("time.windows.com");
        QString ipAddress=info.addresses().first().toString();
        udpsocket=new QUdpSocket(this);
        connect(udpsocket,SIGNAL(connected()),this,SLOT(connectsucess()));
        connect(udpsocket,SIGNAL(readyRead()),this,SLOT(readingDataGrams()));
        udpsocket->connectToHost("time.windows.com",123);
    }
    void tttt::connectsucess()
    {
        ui->pushButton->setEnabled(false);
        qint8 LI=0;  //无预告
        qint8 VN=3;  //版本号
        qint8 MODE=3; //客户端几
        qint8 STRATUM=0;//表示本地时钟层次水平
        qint8 POLL=4; //测试间隔
        qint8 PREC=-6; //表示本地时钟精度
        QDateTime Epoch(QDate(1900, 1, 1));
        qint32 second=quint32(Epoch.secsTo(QDateTime::currentDateTime()));
        ui->label->setText("Connected");
        qint32 temp=0;
        QByteArray timeRequest(48, 0);
        timeRequest[0]=(LI <<6) | (VN <<3) | (MODE);
        timeRequest[1]=STRATUM;
        timeRequest[2]=POLL;
        timeRequest[3]=PREC & 0xff;
        timeRequest[5]=1;
        timeRequest[9]=1;

    //40到43字节保存原始时间戳,即客户端发送的时间
        timeRequest[40]=(temp=(second&0xff000000)>>24);
        temp=0;
        timeRequest[41]=(temp=(second&0x00ff0000)>>16);
        temp=0;
        timeRequest[42]=(temp=(second&0x0000ff00)>>8);
        temp=0;
        timeRequest[43]=((second&0x000000ff));
        udpsocket->flush();
        udpsocket->write(timeRequest);
        udpsocket->flush();
    }
    void tttt::readingDataGrams()
    {

        ui->label->setText("Reading...");
        QByteArray newTime;
        QDateTime Epoch(QDate(1900, 1, 1));
        QDateTime unixStart(QDate(1970, 1, 1));
        do
        {
            newTime.resize(udpsocket->pendingDatagramSize());
            udpsocket->read(newTime.data(), newTime.size());
        }while(udpsocket->hasPendingDatagrams());

        QByteArray TransmitTimeStamp ;
        TransmitTimeStamp=newTime.right(8);
        quint32 seconds=TransmitTimeStamp[0];
        quint8 temp=0;
        for(int j=1;j<=3;j++)
        {
            seconds=seconds<<8;
            temp=TransmitTimeStamp[j];
            seconds=seconds+temp;
        }
        QDateTime time;
        time.setTime_t(seconds-Epoch.secsTo(unixStart));
        ui->textEdit->append(time.toString());
        this->udpsocket->disconnectFromHost();
        this->udpsocket->close();
        ui->pushButton->setEnabled(true);

    }

    展开全文
  • Qt自动同步时间

    2021-02-06 15:27:17
    Qt自动同步时间需要使用网络时间协议(Network Time Protoco, NTP)。 首先需要include一个NTP的库 #include <QUdpSocket> 然后在头文件声明 signals: void connected(); void readyRead(); public slots: ...

    Qt自动同步时间

    Qt自动同步时间需要使用网络时间协议(Network Time Protoco, NTP)。

    首先需要include一个UDP库

    #include <QUdpSocket>
    

    然后在头文件声明

    signals:
        void connected();
        void readyRead();
    
    public slots:
        void setNtp();
        void connectsucess();
        void readingDataGrams();
    
    

    接着在.cpp中实现

    void TimeSetting::setNtp()
    {
        ntpIP = "time.windows.com";    //windows NTP服务器地址
    
        udpSocket = new QUdpSocket(this);
        connect(udpSocket,SIGNAL(connected()),this,SLOT(connectsucess()));
        connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readingDataGrams()));
        udpSocket->connectToHost(ntpIP,123);
    }
    
    void TimeSetting::connectsucess()
    {
        qint8 LI=0;  //无预告
        qint8 VN=3;  //版本号
        qint8 MODE=3; //客户端几
        qint8 STRATUM=0;//表示本地时钟层次水平
        qint8 POLL=4; //测试间隔
        qint8 PREC=-6; //表示本地时钟精度
        QDateTime Epoch(QDate(1900, 1, 1));
        qint32 second=quint32(Epoch.secsTo(QDateTime::currentDateTime()));
    
        qint32 temp=0;
        QByteArray timeRequest(48, 0);
        timeRequest[0]=(LI <<6) | (VN <<3) | (MODE);
        timeRequest[1]=STRATUM;
        timeRequest[2]=POLL;
        timeRequest[3]=PREC & 0xff;
        timeRequest[5]=1;
        timeRequest[9]=1;
    
        //40到43字节保存原始时间戳,即客户端发送的时间
        timeRequest[40]=(temp=(second&0xff000000)>>24);
        temp=0;
        timeRequest[41]=(temp=(second&0x00ff0000)>>16);
        temp=0;
        timeRequest[42]=(temp=(second&0x0000ff00)>>8);
        temp=0;
        timeRequest[43]=((second&0x000000ff));
        udpSocket -> flush();
        udpSocket -> write(timeRequest);
        udpSocket -> flush();
    }
    
    void TimeSetting::readingDataGrams()
    {
        QByteArray newTime;
        QDateTime Epoch(QDate(1900, 1, 1));
        QDateTime unixStart(QDate(1970, 1, 1));
        do
        {
            newTime.resize(udpSocket->pendingDatagramSize());
            udpSocket->read(newTime.data(), newTime.size());
        }while(udpSocket->hasPendingDatagrams());
    
        QByteArray TransmitTimeStamp ;
        TransmitTimeStamp=newTime.right(8);
        quint32 seconds=TransmitTimeStamp[0];
        quint8 temp=0;
        for(int j=1;j<=3;j++)
        {
            seconds=seconds<<8;
            temp=TransmitTimeStamp[j];
            seconds=seconds+temp;
        }
        QDateTime time;
        time.setTime_t(seconds-Epoch.secsTo(unixStart));
    
        this->udpSocket->disconnectFromHost();
        this->udpSocket->close();
    }
    

    接下来大概分析一下上述代码。

    ntpIP = "time.windows.com";这句指定一个NTP服务器,NTP协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。提供NTP对时的服务器有很多,比如微软的NTP对时服务器,利用NTP服务器提供的对时功能,可以使我们的设备时钟系统能够正确运行。123端口是系统的时间服务,udpSocket->connectToHost(ntpIP,123);将套接字连接到服务器。

    为保证传输速度,NTP服务默认使用UDP协议,因此存在有丢包的可能。可根据实际使用地点选择NTP服务器,保证使用的可靠性。

    两个槽函数connectsucess()readingDataGrams()分别负责向NTP服务器发送报文和接收报文。

    发送报文的具体形式及其含义在connectsucess()中的注释解释了,接着通过udpSocket -> write(timeRequest);发送到NTP服务器。

    接收到的报文通过一定的字符解析方法,通过判断出传送时延,解析到正确的网络时间。上述代码中的QDateTime time就是最终解析到的网络时间,它的形式如下:

    Sat Feb 6 11:11:11 2021

    最后解析上述字符串就可以得到所需的信息。

    解析字符串方法可参考:Qt QString类及常用函数功能详解

    展开全文
  • 1.没有真的加上时差 QDateTime QDateTime::addMSecs(qint64 msecs) const Returns... 这个函数不会改变调用这个函数的QDateTime,必须用一个返回值去接收 2.linux下执行命令的时间为几十ms,消耗的时间太长了,需要校准

    1.没有真的加上时差

    QDateTime QDateTime::addMSecs(qint64 msecs) const
    Returns a QDateTime object containing a datetime msecs miliseconds later than the datetime of this object (or earlier if msecs is negative).
    If this datetime is invalid, an invalid datetime will be returned.

    这个函数不会改变调用这个函数的QDateTime,必须用一个返回值去接收

    2.linux下执行命令的时间为几十ms,消耗的时间太长了,需要校准

    展开全文
  • Qt:利用ntp服务器获取网络时间

    热门讨论 2011-10-17 17:14:20
    利用ntp服务器格式获取网络时间 下面是ntp数据包的格式 NTP packet = NTP header + Four TimeStamps = 48byte NTP header : 16byte +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- |LI | VN |...
  • 基于 QtNTP Client 实现

    千次阅读 2018-11-01 04:05:04
    NTP client 简单来说,就是以网络上某个节点上的时间为基准,校正本机时间NTP server 即提供本机时间戳给 client 校准的服务器。 NTP 协议是基于 UDP 的。 原理 NTP 的实现是 C/S 结构的,client 向 server ...

    NTP 协议简介

    NTP,Network timestamp protocol,网络时间协议。
    NTP client 简单来说,就是以网络上某个节点上的时间为基准,校正本机时间。
    NTP server 即提供本机时间戳给 client 校准的服务器。
    NTP 协议是基于 UDP 的。

    原理

    NTP 的实现是 C/S 结构的,client 向 server 发送时间校准请求,server 返回校准后时间。
    既然是网络访问,那必然会有网络延时问题,这就必然导致 server 返回的时间戳不准。
    如何解决呢?
    我们来分别看一下 client 和 server 的时间线:

    server --------------------------------------------  ts
                           t2          t3
    
                    t1                        t4
    client --------------------------------------------  tc
    

    如上图,定义:

    • ts 为 server 的时间戳
    • tc 为 client 的时间戳
    • ts、tc 在 NTP 协商之前互不干扰,设 ts、tc 之间的误差 设为 T
    • t1 为 client 向 server 发起 NTP 请求的时间戳,这个时间戳在 tc 上
    • t2 为 server 收到 client 的 NTP 请求的时间戳,这个时间戳在 ts 上
    • t3 为 server 向 client 发起 NTP 响应的时间戳,这个时间戳在 ts 上
    • t4 为 client 收到 server 的 NTP 响应的时间戳,这个时间戳在 tc 上
    • d 为 client 与 server 之间的网络延时

    下面,我们来计算 T。
    根据以上的变量,我们可得出如下方程组:

    1. t2 = t1 + d + T。 即,t2 的数值,是 t1 加上网络延时 d、再加上 ts 、tc之间的误差 T
    2. t4 = t3 +d + (-T)。即,t4 的数值,是 t3 加上网络延时 d、再加上 tc、ts 之间的误差 -T

    其中, t1、t2、t3、t4 都是确定的数值,即可解出方程租:

    t2 - t4 = t1 + T - t3 - (-T) 
    

    变换后可得如下算式:

    T = ((t2 - t1) + (t3 - t4) ) /2
    

    这样,有了 ts 和 tc 之间的时间戳误差,client 就可以调整了:

    new tc = old tc + T
    

    协议内容

    在这里插入图片描述

    NTP报文格式如上图所示,它的字段含义参考如下:

    1. LI 闰秒标识器,占用2个bit。0 即可。
    2. VN 版本号,占用3个bits,表示NTP的版本号,现在为3
    3. Mode 模式,占用3个bits,表示模式。 3 表示 client, 2 表示 server
    4. stratum(层),占用8个bits。不清楚怎么用
    5. Poll 测试间隔,占用8个bits,表示连续信息之间的最大间隔。不清楚怎么用
    6. Precision 精度,占用8个bits,,表示本地时钟精度。 不清楚怎么用
    7. Root Delay根时延,占用8个bits,表示在主参考源之间往返的总共时延。 不清楚怎么用
    8. Root Dispersion根离散,占用8个bits,表示在主参考源有关的名义错误。 不清楚怎么用
    9. Reference Identifier参考时钟标识符,占用8个bits,用来标识特殊的参考源。不同的 NTP server 改字段不一样
    10. 参考时间戳,64bits时间戳,本地时钟被修改的最新时间。一般由 server 端填写,表示 server 上次同步时间戳的时间点
    11. 原始时间戳,客户端发送的时间,64bits。即公式中的 t1 。client 请求时必须填写,server 端响应时、回写请求包里的该字段
    12. 接受时间戳,服务端接受到的时间,64bits。即公式中的 t2 。server 端填写
    13. 传送时间戳,服务端送出应答的时间,64bits。即公式中的 t3。server 端填写
    14. 认证符(可选项)

    注意:t4 为client 收到响应的时间戳,只有收到了才会产生,因此 t4 不体现在协议报文里。

    实现

    网络延时 d,计算时假定了请求和响应的延时相等,但真实网络环境非常复杂,UDP 本身可靠度也不够高,可能请求包很快就到服务器、而响应包在网络上饶了一大圈才到,这就会产生误差。
    这种误差很难彻底消除,但还是有一些手段可以减少误差。
    以前做物理实验,测量物体的长度、重量等,一般要求测量多次,最后取平均值。
    本实现里思路也是发起多次 ntp 请求,最后取平均误差。
    但考虑到计算机的计算环境,略有优化:

    1. 取 10 个不同地域的共有 NTP server,分别获取时间戳误差
    2. NTP 请求成功数少于 3 个 认为 失败
    3. NTP 请求成功数大于等于 3 个 且 小于 8 个,则求和计算平均误差
    4. NTP 请求成功数等于 8 个时,按位计算平均误差
    5. NTP 请求成功数等于 9 个时,去掉一个最大值后,按位计算平均误差
    6. NTP 请求成功数等于 10 个时,去掉一个最大值、去掉一个最小值后,按位计算平均误差

    代码

    https://github.com/JustJJImmy/ntp_for_qt.git

    展开全文
  • NTP报文的格式如下: LI 闰秒标识器,占用2个bit。0 即可。 VN 版本号,占用3个bits,表示NTP的版本号,现在为3 Mode 模式,占用3个bits,表示模式。 3 表示 client, 2 表示 server stratum(层),占用8个bits...
  • ntp同步时间.rar

    2021-09-26 17:13:34
    使用qt写的根据ntp协议同步时间的小程序,通过udp发报文进行获取,根据网上下载的进行了修改,我改了很多,现在这个可以计算时差和延迟,可以更精准的校准时间,精确到毫秒,利用T2+offset进行校准,这里没有写,...
  • //40到43字节保存原始时间戳,即客户端发送的时间 timeRequest[40]=(temp=(second&0xff000000)>>24); temp=0; timeRequest[41]=(temp=(second&0x00ff0000)>>16); temp=0; timeRequest[42]=(temp=(second&0x0000ff00)...
  • Qt开源作品29-NTP服务器时间同步

    千次阅读 2020-06-07 10:11:54
    很多软件都有时间同步的功能,尤其是Qt在嵌入式设备上的,有时候还有很多是没有UI界面的程序,而硬件上有个时钟,时间久了难免没有电,需要从服务器来同步时间来保证本地的时间是正确的,不然本地记录的一些日志的...
  • 要求使用QT4.7.4 环境准备: 在vmware环境中安装了麒麟v3和麒麟v6两个系统。 在麒麟v3系统中安装gcc g++ yum install gcc yum install gcc-c++ 下载QT4.7.4源码  qt4需要添加-fontconfig,否则无法显示中文 ...
  •   我们的产品有个功能是同步播放,即要求多台设备在相同的时刻播放相同的内容,考虑到应用场景和精准度,我们需要实现QT for Android的局域网Ntp同步。 设置时区与时间 windows是可以搭建简单的Ntp服务器的,详见...
  • 公司ad服务器总是时间不准确,每次手动设置过一段时间又要重新设置,然后就自己写了个时间校对的服务,从网络获取北京时间http://www.time.ac.cn/timeflash.asp,
  • SNTP NTP服务器客户端

    2017-09-14 10:17:50
    可以作为 SNTP NTP服务器 客户端,小巧 占用资源小 可以作为 SNTP NTP服务器 客户端,小巧 占用资源小 可以作为 SNTP NTP服务器 客户端,小巧 占用资源小
  • ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步4屏带中文显示 老规矩,上图: 第一屏幕: 第二屏: 第三屏: 第四屏: #include <Arduino.h> #include <ESP8266WiFi.h> #include <ESP8266...
  • Qt | 获取网络时间

    2019-09-20 21:20:10
    使用qt函数获取网络时间 现在Qt Project Setting中的Qt Modules勾选NetWork,再导入头文件我也忘了叫什么了 1 QStringList net_time; 2 QTcpSocket *socket = new QTcpSocket(); 3 socket->...
  • NTP网络时间同步 摘 要:首先对时间同步进行了背景介绍,然后讨论了不同的时间同步网络技术,最后指出了建立全球或区域时间同步网存在的问题。  一、概 述  在通信领域,“同步”概念是指频率的同步,即网络各个...
  • 1588时间同步协议

    千次阅读 2016-03-31 10:51:12
    在1995年将数据传输速度从10Mb/s提高到100Mb/s的过程中,计算机和网络业界也在致力于解决以太网的定时同步能力不足的问题,开发出一种软件方式的网络时间协议(NTP),提高各网络设备之间的定时同步能力。...
  • 对设备设置时间很有必要,这个是必备的功能,毕竟大部分的前端设备比如摄像机本身不带BIOS电池的,所以没法存储时间,要么设置了NTP地址来同步时间,要么其他设备主动对他进行设置时间,如果时间不正确了,意味着...
  • ntp 同步系统时间

    2010-09-26 18:10:00
    一句代码搞定 ntpdate asia.pool.ntp.org &gt;&gt; /var/log/ntpdate.log 不过要先安装 yum install ntp 然后就行了
  • 作为QT的忠实粉,昨天才学习解决用qt的date设置系统的时间,可谓是映象深刻啊。刚开始在网上查找了很久,网上也有很多的方法,但是都不太适用于我目前的情况,于是经过不断的努力和不断的往前人得膀上爬,终于寻得一...
  • 网上有些是本地时间T=T3+Offset,然后将T设置为系统时间,也有是T=系统当前时间+Offset,还有些不是用T3,也就是tranmittime去加,而是系统当前时间,请问到底应该怎样计算呢
  • 获取和设置NTP时间同步以及设置设备时间。 获取和设置视频参数和图片参数(亮度、色彩、饱和度)。 重启设备。 onvif的处理流程: 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备...
  • NTP验证

    千次阅读 2012-08-17 14:47:53
    NTP协议是让网络上的不同设备用来同步时间的协议,NTP工作在UDP,并且协议数据包的源端口和目标端口都是123。 Cisco的NTP支持验证功能,确保NTP更新报文是来自可靠的时钟源。其身份验证使用MD5加密算 法以确保NTP在2...
  • 用的很少,绝大部分用户都还是习惯直接通过摄像机的web页面进去配置,其实修改网络配置的功能在大部分的NVR中都是具备的,网络的参数主要包括IP地址、子网掩码、网关地址、DNS解析地址、NTP地址、网卡信息、网络协议...
  • Qt音视频开发27-Onvif设备搜索

    千次阅读 2020-10-04 16:49:49
    最近业余时间主要研究音视频开发这块,前面的文章写了好多种视频监控内核,一旦将这些内核搞定以后,视频监控的相关功能水到渠成。做视频监控系统,绕不过onvif这玩意,这玩意主要就是为了统一一个大概的标准,能够...
  • 接收摄像机的报警信息一般有两种处理方式,一种是订阅,订阅以后摄像机会在请求后一直阻塞等待,如果有新的报警信息则立即返回,否则需要到超时时间才会断开连接请求;还有一种是定时器主动轮询,不断的去询问是否有...
  • Qt音视频开发28-Onvif信息获取

    千次阅读 2020-10-06 09:49:20
    获取和设置NTP时间同步以及设置设备时间。 获取和设置视频参数和图片参数(亮度、色彩、饱和度)。 重启设备。 onvif的处理流程: 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备...
  • 联网校时 获取网络时间

    热门讨论 2014-06-21 15:36:12
    联网校时 获取网络时间

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 443
精华内容 177
关键字:

qtntp时间同步

友情链接: 无线温度.rar