IPC摄像头显示时间错误的问题

项目中使用了大华、汉邦高科、天地伟业、海康威视、景阳等国产品牌的IPC设备,都出现了显示时间错误的问题,并且不同品牌的设备时间都不一样,经分析是时区的问题。

现象:

IPC设备设置格林威治时间 (GMT),以及北京时区(GMT+8:00:00)后,大华摄像头时间正常,汉邦的时间比正常时间少8小时;

<?xml version="1.0" encoding="utf-8"?>

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
  <s:Header>
    <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
      <UsernameToken>
        <Username>admin</Username>
        <Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">wd/TdI3Vx+CQJv34o3jhSKc90nY=</Password>
        <Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">LTE4NzgwMDkzNjU=</Nonce>
        <Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2017-11-22T08:00:43Z</Created>
      </UsernameToken>
    </Security>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SetSystemDateAndTime xmlns="http://www.onvif.org/ver10/device/wsdl">
      <DateTimeType>Manual</DateTimeType>
      <DaylightSavings>false</DaylightSavings>
      <TimeZone>
        <TZ xmlns="http://www.onvif.org/ver10/schema">GMT+8:00</TZ>
      </TimeZone>
      <UTCDateTime>
        <Time xmlns="http://www.onvif.org/ver10/schema">
          <Hour>8</Hour>
          <Minute>0</Minute>
          <Second>43</Second>
        </Time>
        <Date xmlns="http://www.onvif.org/ver10/schema">
          <Year>2017</Year>
          <Month>11</Month>
          <Day>22</Day>
        </Date>
      </UTCDateTime>
    </SetSystemDateAndTime>
  </s:Body>
</s:Envelope>
HTTP/1.1 200 OK
Server: gSOAP/2.8
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/SetSystemDateAndTime"
Content-Length: 2269
Connection: close

大华显示2017.11.22 16:00:43,汉邦显示2017.11.22 08:00:43

分别对GMT+8:00:00、GMT-8:00:00、CCT+8:00:00、CCT-8:00:00时区作了测试,结果如下:

时区汉邦大华
GMT+8:00:00-8h+8h
GMT-8:00:00+8h-8h
CCT+8:00:00-8h-8h
CCT-8:00:00+8h+8h
解决方案:

设置格林威治时间 (GMT),时区统一为CCT-8:00:00。

int OnvifSetTime(char *deviceAddr, char *user, char *password, int timeOut)
{
    int retval = 0;
    struct SOAP_ENV__Header header;
    struct soap *soap;
    
    if ((soap = Initsoap(&header, NULL, NULL, timeOut)) == NULL)
    {
        DPRINT(ONVIF_ERR, "Initsoap error!\n");    
        return RETURN_FAIL;
    }
    
    DPRINT(ONVIF_INFO, "\n-------------------OnvifSetTime--------------\n\n");

    soap_wsse_add_UsernameTokenDigest_ex(soap, "user", user, password);

    time_t now;   
    struct tm *timenow;      
      
    time(&now);   
    timenow = gmtime(&now);  
    
    DPRINT(ONVIF_INFO, "year:%d month:%d day:%d hour:%d min:%d sec:%d \r\n", timenow->tm_year, timenow->tm_mon, timenow->tm_mday, timenow->tm_hour, timenow->tm_min, timenow->tm_sec);

    struct _tds__SetSystemDateAndTime setReq;
    struct _tds__SetSystemDateAndTimeResponse setResponse;

    soap_default__tds__SetSystemDateAndTime(soap, &setReq);

    setReq.DateTimeType = 0;
    setReq.DaylightSavings = 0;

    char *timez = "CCT-8:00:00";
    struct tt__TimeZone timeZTmp;
    timeZTmp.TZ = timez;
    setReq.TimeZone = &timeZTmp;
    struct tt__DateTime datatimeTmp;
    struct tt__Date dataTmp;
    struct tt__Time timeTmp;
    dataTmp.Year = timenow->tm_year + 1900;
    dataTmp.Month = timenow->tm_mon + 1;
    dataTmp.Day = timenow->tm_mday;

    timeTmp.Hour = timenow->tm_hour;
    timeTmp.Minute = timenow->tm_min;
    timeTmp.Second = timenow->tm_sec;

    datatimeTmp.Date = &dataTmp;
    datatimeTmp.Time = &timeTmp;
    setReq.UTCDateTime = &datatimeTmp;

    soap_call___tds__SetSystemDateAndTime(soap, deviceAddr, NULL, &setReq, &setResponse);

    if (soap->error) {
        DPRINT(ONVIF_ERR, "[%s][%d]--->>> soap error: %d, %s, %s\n", __func__, __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
        retval = RETURN_FAIL;
    }
    else{
        retval = RETURN_SUCCESS;         
    }

    Deletesoap(soap);
    return retval;
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值