千家信息网

通过Onvif协议停止调用云台接口为pending状态该如何处理

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,通过Onvif协议停止调用云台接口为pending状态该如何处理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在摄像头设备支持云台的
千家信息网最后更新 2024年11月17日通过Onvif协议停止调用云台接口为pending状态该如何处理

通过Onvif协议停止调用云台接口为pending状态该如何处理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在摄像头设备支持云台的情况下,视频结构化安防智能平台EasyNVR是支持通过onvif协议来调用摄像头的云台控制,但是在调用过程中,如果用户名和密码错误,调用停止云台控制接口会一直处于pending状态。

通过浏览器调试界面可以看到该接口的pending状态,一直没有返回内容。

分析后端接口,发现具体到StopPTZ方法里面逻辑有问题,目前采用的逻辑如下:

func StopPTZ(host, username, password, deviceUrl string) (err error) {   if dll == nil {      err = fmt.Errorf("onvif dll not init")      return   }   ptz := fmt.Sprintf("stop ptz host[%s] username[%s] password[%s] deviceUrl[%s]", host, username, password, deviceUrl)   global.OperationLogger.Info(ptz)   _host := uintptr(unsafe.Pointer(syscall.StringBytePtr(host)))   _username := uintptr(unsafe.Pointer(syscall.StringBytePtr(username)))   _password := uintptr(unsafe.Pointer(syscall.StringBytePtr(password)))   _deviceUrl := uintptr(unsafe.Pointer(syscall.StringBytePtr(deviceUrl)))    i := 1   for i <= 500 {      r1, _, _ := procStopPtz.Call(_host, _username, _password, _deviceUrl)      if r1 == 0 {         break      }      if i == 500 {         log.Printf("EasyOnvifClient_StopPtz failed, ret[%d], retryed 5s", r1)         err = fmt.Errorf("EasyOnvifClient_StopPtz failed, ret[%d]", r1)      }      time.Sleep(10 * time.Millisecond)   }    return}

我们将其中的i := 1逻辑进行修改,且time.Sleep处为1而非为10,即可解决问题。修改后的逻辑代码参考如下:

func StopPTZ(host, username, password, deviceUrl string) (err error) {   if dll == nil {  err = fmt.Errorf("onvif dll not init")  return   }   ptz := fmt.Sprintf("stop ptz host[%s] username[%s] password[%s] deviceUrl[%s]", host, username, password, deviceUrl)   global.OperationLogger.Info(ptz)   _host := uintptr(unsafe.Pointer(syscall.StringBytePtr(host)))   _username := uintptr(unsafe.Pointer(syscall.StringBytePtr(username)))   _password := uintptr(unsafe.Pointer(syscall.StringBytePtr(password)))   _deviceUrl := uintptr(unsafe.Pointer(syscall.StringBytePtr(deviceUrl)))    for i := 0; i <= 500; i += 100 {  r1, _, _ := procStopPtz.Call(_host, _username, _password, _deviceUrl)  if r1 == 0 { return  }  if i == 500 { log.Printf("EasyOnvifClient_StopPtz failed, ret[%d], retryed 5s", r1) err = fmt.Errorf("EasyOnvifClient_StopPtz failed, ret[%d], timeout 5s", r1)  }  time.Sleep(1 * time.Millisecond)   }    return}

重新运行并调用接口检查,可以看到以上的报错内容消失,问题已解决:

func StopPTZ(host, username, password, deviceUrl string) (err error) {   if dll == nil {      err = fmt.Errorf("onvif dll not init")      return   }   ptz := fmt.Sprintf("stop ptz host[%s] username[%s] password[%s] deviceUrl[%s]", host, username, password, deviceUrl)   global.OperationLogger.Info(ptz)   _host := uintptr(unsafe.Pointer(syscall.StringBytePtr(host)))   _username := uintptr(unsafe.Pointer(syscall.StringBytePtr(username)))   _password := uintptr(unsafe.Pointer(syscall.StringBytePtr(password)))   _deviceUrl := uintptr(unsafe.Pointer(syscall.StringBytePtr(deviceUrl)))    for i := 0; i <= 500; i += 100 {      r1, _, _ := procStopPtz.Call(_host, _username, _password, _deviceUrl)      if r1 == 0 {         return      }      if i == 500 {         log.Printf("EasyOnvifClient_StopPtz failed, ret[%d], retryed 5s", r1)         err = fmt.Errorf("EasyOnvifClient_StopPtz failed, ret[%d], timeout 5s", r1)      }      time.Sleep(1 * time.Millisecond)   }    return}

重新运行并调用接口检查,可以看到以上的报错内容消失,问题已解决:

关于通过Onvif协议停止调用云台接口为pending状态该如何处理问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0