Onvif协议客户端开发(10)--摄像头时间同步

摄像头时间同步

一、介绍

Onvif对前端设备进行校时是使用时区字符串的格式进行的,在时间设置的同时需要注意是否开启夏令时,因为夏令时比正常的时间快一个小时
对于Onvif内部时间设置的时区字符串的设置参见:时区字符串、时区缩写

二、代码实现

struct soap *stSoapNew = soap_new();
if (stSoapNew == nullptr)
{
	return ;
}
soap_set_namespaces(stSoapNew, namespaces);                                 // 设置soap的namespaces
stSoapNew->recv_timeout = 5;                                           					 // 设置超时5秒(超过指定时间没有数据就退出)
stSoapNew->send_timeout = 5;
stSoapNew->connect_timeout = 5;
soap_set_mode(stSoapNew, SOAP_C_UTFSTRING);                          // 设置为UTF-8编码,否则叠加中文		OSD会乱码
if (stSoapNew == nullptr)
{
	printf( "Onvif New Soap error!");			
	return;
}

// 如果服务要求鉴权,则以下接口就需要加上用户名密码进行鉴权
soap_wsse_add_UsernameTokenDigest(stSoapNew, NULL, pUserName, pPassWord);//对用户名密码进行加密

//Unix时间转为本地时间
stOnvifTimeInfo stLocalTimeInfo;
struct tm  stTmLocalTime = *localtime(&tmUnixTime);
stLocalTime.nYear = stTmLocalTime.tm_year + 1900;
stLocalTime.nMonth = stTmLocalTime.tm_mon + 1;
stLocalTime.nDay = stTmLocalTime.tm_mday;
stLocalTime.nHour = stTmLocalTime.tm_hour;
stLocalTime.nMinute = stTmLocalTime.tm_min;
stLocalTime.nSecond = stTmLocalTime.tm_sec;

// 构建时间同步的入参和出参
_tds__SetSystemDateAndTime stSetSysTimeReq;
_tds__SetSystemDateAndTimeResponse stSetSysTimeRes;

memset(&stSetSysTimeReq, 0x00, sizeof(stSetSysTimeReq));
memset(&stSetSysTimeRes, 0x00, sizeof(stSetSysTimeRes));

stSetSysTimeReq.DaylightSavings = xsd__boolean__false_;// 没有夏令时
stSetSysTimeReq.DateTimeType = tt__SetDateTimeType__Manual;//手动校时

tt__TimeZone *stTimeZoneInfo = soap_new_tt__TimeZone(stSoapNew, -1);
stTimeZoneInfo->TZ = "CCT0CCT,M3.2.0/2,M11.1.0/2";// CCT:中国时区,0:偏移时间 ,M3.2.0:夏令时开始的时间:3月第二周周天零点开始 M11.1.0:夏令时结束的时间
stSetSysTimeReq.TimeZone = stTimeZoneInfo; 

tt__Date *stDataInfo = soap_new_tt__Date(stSoapNew, -1);
stDataInfo->Year = stLocalTimeInfo.nYear;
stDataInfo->Month = stLocalTimeInfo.nMonth;
stDataInfo->Day = stLocalTimeInfo.nDay;
tt__Time *stTimeInfo = soap_new_tt__Time(stSoapNew, -1);
stTimeInfo->Hour = stLocalTimeInfo.nHour;
stTimeInfo->Minute = stLocalTimeInfo.nMinute;
stTimeInfo->Second = stLocalTimeInfo.nSecond;

tt__DateTime * stDateTimeInfo = soap_new_tt__DateTime(stSoapNew, -1);
stDateTimeInfo->Date = stDataInfo;
stDateTimeInfo->Time = stTimeInfo;

stSetSysTimeReq.UTCDateTime = stDateTimeInfo;
// pProfilesAddr 是soap_call___tds__GetCapabilities接口获取到的device地址,具体实现参见:[获取设备能力](https://blog.csdn.net/u013566528/article/details/102070372)
nRet = soap_call___tds__SetSystemDateAndTime_(stSoapNew, pProfilesAddr, nullptr, &stSetSysTimeReq, &stSetSysTimeRes);
if (nRet != SOAP_OK || stSoapInfo->error != SOAP_OK)
{
	printf("Dev ip is %s, Gsoap return is %d labbuf is %s", m_pIpInfo, nRet, stSoapInfo->labbuf);
	return;
}

你可能感兴趣的:(Onvif协议)