Onvif协议学习:8、设备校时


文章目录

  • Onvif协议学习:8、设备校时
    • 1、编码流程
    • 2、注意事项
    • 3、示例代码

原文链接:https://blog.csdn.net/benkaoya/article/details/72486511

1、编码流程

ONVIF标准中,有 GetSystemDateAndTime和SetSystemDateAndTime两个接口用于获取、设置IPC的系统时间。接口使用大致流程:

  • 搜索出IPC,得到IPC的「设备服务地址」。

  • 根据「设备服务地址」,调用GetSystemDateAndTime和SetSystemDateAndTime接口。

2、注意事项

使用GetSystemDateAndTime和SetSystemDateAndTime这两个接口本是简单的事情,但是有一个细节需要注意,以SetSystemDateAndTime为例,看以上截图(来源于https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl),其中两个字段:

  • TimeZone - 时区

时区字符串要符合POSIX 1003.1格式,如GMT+00:00、GMT+08:00、GMT-03:30等。

  • UTCDateTime - UTC时间

该字段要填充UTC时间,不是本地时间,不要搞错了。

IPC摄像头视频中显示的OSD时间,是本地时间,不是UTC时间,而本地时间跟「时区」息息相关。如果你设置了时间,视频OSD显示的时间又不是你预期的,就要注意这里面的关系了。

简单介绍下有关UTC的基础知识:

UTC + 时区差 = 本地时间

时区差,东正西负,北京时区是东八区,领先UTC八个小时,时区差记为+0800,所以

UTC + (+0800) = 北京时间

UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。为了简单起见,可以认为UTC与GMT含义是一样的。

3、示例代码

IPC获取、设置系统时间的示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "onvif_comm.h"
#include "onvif_dump.h"#ifdef WIN32
#include <windows.h>
#endif/************************************************************************
**函数:ONVIF_GetSystemDateAndTime
**功能:获取设备的系统时间
**参数:[in] DeviceXAddr - 设备服务地址
**返回:0表明成功,非0表明失败
**备注:1). 对于IPC摄像头,OSD打印的时间是其LocalDateTime
************************************************************************/
int ONVIF_GetSystemDateAndTime(const char *DeviceXAddr)
{int result = 0;struct soap *soap = NULL;struct _tds__GetSystemDateAndTime         GetTm_req;struct _tds__GetSystemDateAndTimeResponse GetTm_resp;SOAP_ASSERT(NULL != DeviceXAddr);SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT)));ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);memset(&GetTm_req, 0x00, sizeof(GetTm_req));memset(&GetTm_resp, 0x00, sizeof(GetTm_resp));result = soap_call___tds__GetSystemDateAndTime(soap, DeviceXAddr, NULL, &GetTm_req, &GetTm_resp);SOAP_CHECK_ERROR(result, soap, "GetSystemDateAndTime");dump_tds__GetSystemDateAndTime(&GetTm_resp);EXIT:if (NULL != soap) {ONVIF_soap_delete(soap);}return result;
}/************************************************************************
**函数:ONVIF_GetHostTimeZone
**功能:获取主机的时区信息
**参数:[out] TZ    - 返回的时区信息[in] sizeTZ - TZ缓存大小
**返回:无
**备注:
************************************************************************/
static void ONVIF_GetHostTimeZone(char *TZ, int sizeTZ)
{char timezone[20] = {0};#ifdef WIN32TIME_ZONE_INFORMATION TZinfo;GetTimeZoneInformation(&TZinfo);sprintf(timezone, "GMT%c%02d:%02d",  (TZinfo.Bias <= 0) ? '+' : '-', labs(TZinfo.Bias) / 60, labs(TZinfo.Bias) % 60);#elseFILE *fp = NULL;char time_fmt[32] = {0};fp = popen("date +%z", "r");fread(time_fmt, sizeof(time_fmt), 1, fp);pclose(fp);if( ((time_fmt[0] == '+') || (time_fmt[0] == '-')) &&isdigit(time_fmt[1]) && isdigit(time_fmt[2]) && isdigit(time_fmt[3]) && isdigit(time_fmt[4]) ) {sprintf(timezone, "GMT%c%c%c:%c%c", time_fmt[0], time_fmt[1], time_fmt[2], time_fmt[3], time_fmt[4]);} else {strcpy(timezone, "GMT+08:00");}#endifif (sizeTZ > strlen(timezone)) {strcpy(TZ, timezone);}return;
}/************************************************************************
**函数:ONVIF_SetSystemDateAndTime
**功能:根据客户端主机当前时间,校时IPC的系统时间
**参数:[in] DeviceXAddr - 设备服务地址
**返回:0表明成功,非0表明失败
**备注:1). 对于IPC摄像头,OSD打印的时间是其本地时间(本地时间跟时区息息相关),设置时间时一定要注意时区的正确性。
************************************************************************/
int ONVIF_SetSystemDateAndTime(const char *DeviceXAddr)
{int result = 0;struct soap *soap = NULL;struct _tds__SetSystemDateAndTime           SetTm_req;struct _tds__SetSystemDateAndTimeResponse   SetTm_resp;char TZ[20];                                                                // 用于获取客户端主机的时区信息(如"GMT+08:00")time_t t;                                                                   // 用于获取客户端主机的UTC时间struct tm tm;SOAP_ASSERT(NULL != DeviceXAddr);SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT)));ONVIF_GetHostTimeZone(TZ, DIM(TZ));                                         // 获取客户端主机的时区信息t = time(NULL);                                                             // 获取客户端主机的UTC时间
#ifdef WIN32gmtime_s(&tm, &t);
#elsegmtime_r(&t, &tm);
#endifmemset(&SetTm_req, 0x00, sizeof(SetTm_req));memset(&SetTm_resp, 0x00, sizeof(SetTm_resp));SetTm_req.DateTimeType      = tt__SetDateTimeType__Manual;SetTm_req.DaylightSavings   = xsd__boolean__false_;SetTm_req.TimeZone          = (struct tt__TimeZone *)ONVIF_soap_malloc(soap, sizeof(struct tt__TimeZone));SetTm_req.UTCDateTime       = (struct tt__DateTime *)ONVIF_soap_malloc(soap, sizeof(struct tt__DateTime));SetTm_req.UTCDateTime->Date = (struct tt__Date *)ONVIF_soap_malloc(soap, sizeof(struct tt__Date));SetTm_req.UTCDateTime->Time = (struct tt__Time *)ONVIF_soap_malloc(soap, sizeof(struct tt__Time));SetTm_req.TimeZone->TZ              = TZ;                                   // 设置本地时区(IPC的OSD显示的时间就是本地时间)SetTm_req.UTCDateTime->Date->Year   = tm.tm_year + 1900;                    // 设置UTC时间(注意不是本地时间)SetTm_req.UTCDateTime->Date->Month  = tm.tm_mon + 1;SetTm_req.UTCDateTime->Date->Day    = tm.tm_mday;SetTm_req.UTCDateTime->Time->Hour   = tm.tm_hour;SetTm_req.UTCDateTime->Time->Minute = tm.tm_min;SetTm_req.UTCDateTime->Time->Second = tm.tm_sec;ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);result = soap_call___tds__SetSystemDateAndTime(soap, DeviceXAddr, NULL, &SetTm_req, &SetTm_resp);SOAP_CHECK_ERROR(result, soap, "SetSystemDateAndTime");EXIT:if (NULL != soap) {ONVIF_soap_delete(soap);}return result;
}

Onvif协议学习:8、设备校时相关推荐

  1. Onvif协议学习:1、Onvif与Onvif Profile协议基本概念

    Onvif协议学习:1.Onvif与Onvif Profile协议基本概念 文章目录 Onvif协议学习:1.Onvif与Onvif Profile协议基本概念 1.ONVIF 2.Onvif Pro ...

  2. Onvif协议学习:13、遮挡报警

    Onvif协议学习:13.遮挡报警 文章目录 Onvif协议学习:13.遮挡报警 1.原理简介 (1).Basic Notification (2).Pull-Point Notification 2 ...

  3. Onvif协议学习:7、鉴权认证

    Onvif协议学习:7.鉴权认证 文章目录 Onvif协议学习:7.鉴权认证 1.前言 2.ONVIF哪些接口需要认证 3.如何认证 4.安装OpenSSL 5.实现认证 6.特别注意 原文链接:ht ...

  4. Onvif协议学习:4、门外汉理解Onvif协议

    Onvif协议学习:4.门外汉理解Onvif协议 文章目录 Onvif协议学习:4.门外汉理解Onvif协议 1.ONVIF背景 2.ONVIF技术框架 3.ONVIF技术规格 4.ONVIF接口规范 ...

  5. Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习:14.球机云台控制PTZ 文章目录 Onvif协议学习:14.球机云台控制PTZ 一.介绍 二.代码实现 八个方向.放下及缩小控制 聚焦控制 原文链接:https://blog.c ...

  6. Onvif协议学习:3、了解web services

    Onvif协议学习:3.了解web services 文章目录 Onvif协议学习:3.了解web services 1.远程调用 2.远程调用原理 3.Web Services的简单理解 4.Web ...

  7. 03 SkeyeVSS国标视频汇聚云服务使用Onvif协议进行摄像机设备接入以及获取设备信息

    SkeyeVSS国标视频融合云平台基于端-边-云一体化架构,部署轻量简单.功能灵活多样,平台可支持多协议(GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等).多 ...

  8. 基于ONVIF协议的(IPC)客户端程序开发-10 设备校时

    原文链接:http://blog.csdn.net/benkaoya/article/details/72486511 1 编码流程 ONVIF标准中,有 GetSystemDateAndTime和S ...

  9. RTSP/ONVIF协议视频平台EasyNVR级联时上级平台播放视频卡顿的原因排查分析

    EasyNVR视频融合平台是基于RTSP/ONVIF协议的视频接入.处理及分发平台,可分发的视频流包括RTSP.RTMP.WS-FLV.HTTP-FLV,HLS.Webrtc等格式,能实现全终端.全平 ...

  10. C#实现海康威视设备自动批量实时校时

    1.编写类库,关键部分:登录.读设备时间.设备校时 using System; using System.Collections.Generic; using System.Linq; using S ...

最新文章

  1. 【Sql Server】DateBase-事务
  2. 西安交通大学2019计算机复试方案,西安交通大学2019年招收硕士研究生复试体检通知...
  3. 【PHP-FPM】配置,优化性能
  4. s5720找mac 华为交换机_【基础】交换机堆叠模式
  5. 吴恩达:大数据终将帮助机器拥有自主智慧
  6. 让你的ASP.NET Core应用程序更安全
  7. 领域应用 | 到底什么时候使用图数据库?
  8. 网络学习云平台 计算机基础应用,计算机应用基础网络自主学习平台使用说明.doc...
  9. 推荐模块︱apple.Turicreate个性化推荐recommender(五)
  10. koa2 引擎模版html,Koa2模板引擎Ejs使用教程
  11. HEVC(H265)播放器
  12. DS-5 Streamline
  13. 机器学习----高斯过程回归
  14. 计算机 英语简历,计算机毕业生英语简历范文
  15. 部署听云服务器监测探针
  16. python积木编程软件_积木编程软件手机版下载
  17. vue 网页滚动到指定位置显示动画效果
  18. docker内debian安装php7.2 configure: error: Cannot find OpenSSL‘s <evp.h>
  19. 网页中验证码无法正常显示
  20. RFC3920 xmpp协议

热门文章

  1. 建立矩阵 reshape函数,pascal函数,magic函数,diag函数【Matlab】
  2. 基于51单片机中文汉字LCD12864滚动显示屏仿真(源码+仿真+全套资料)
  3. java程序单词薄课程设计,Java程序设计课程设计
  4. 线代 [3]|从增广矩阵漫谈矩阵转置对向量在四个向量子空间内的“飞舞”(第三篇)
  5. 计算机flash逐渐淡入,Flash air制作淡入淡出窗体动画效果
  6. 惊!使用nw.js将vue项目打包为可在xp系统运行的桌面程序
  7. 关于联想Y400/Y500刷BIOS解锁网卡、单双650M、单双750M超频
  8. 服务器 linux raid驱动,Dell PowerEdge R710服务器安装CentOS 5.5加载Raid卡驱动 | 系统运维...
  9. Silverlight4 多页打印实现
  10. iis6xp_xp安装iis6步骤方法