m0_61770108 2024-04-17 15:32 采纳率: 29.4%
浏览 7
已结题

onvif实现对PTZ云台控制

onvif实现对PTZ云台控制
1.源码:

img


报错如下

img


2.源码:

img


报错如下:

img


请求当前状态,返回为空

注解:获取设备能力:
strncpy(capa->PtzXAddr, rep.Capabilities->PTZ->XAddr, sizeof(capa->PtzXAddr) - 1);

  • 写回答

5条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-17 15:33
    关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题1中的报错可能是由于以下原因导致的:

    1. 在获取设备能力时,可能没有正确赋值capa->PtzXAddr,导致报错。

    解决方案:

    • 确保在获取设备能力时,正确赋值capa->PtzXAddr

    问题2中的报错可能是由于以下原因导致的:

    1. 在调用ONVIF_PTZContinuousMove函数时,传入的参数ptzXAddrProfileToken可能为NULL,导致报错。

    解决方案:

    • 确保调用ONVIF_PTZContinuousMove函数时传入的参数ptzXAddrProfileToken都不为NULL。
    1. 在调用soap_call___tptz__ContinuousMove函数时,可能出现SOAP连接或调用错误。

    解决方案:

    • 确保在调用soap_call___tptz__ContinuousMove函数之前,正确创建和配置SOAP连接。
    • 检查SOAP连接是否正常工作,确保配置的认证信息正确。
    • 检查continuousMove.ProfileTokencontinuousMove.Velocity是否正确设置。

    问题3中的报错可能是由于以下原因导致的:

    1. 在调用ONVIF_PTZ_GetStatus函数时,传入的参数PtzXAddrProfileToken可能为NULL,导致报错。

    解决方案:

    • 确保调用ONVIF_PTZ_GetStatus函数时传入的参数PtzXAddrProfileToken都不为NULL。
    1. 在调用soap_call___tptz__GetStatus函数时,可能出现SOAP连接或调用错误。

    解决方案:

    • 确保在调用soap_call___tptz__GetStatus函数之前,正确创建和配置SOAP连接。
    • 检查SOAP连接是否正常工作,确保配置的认证信息正确。
    • 检查getStatus.ProfileToken是否正确设置。

    修改后的正确代码如下所示:

    // 获取设备能力
    struct _tds__GetCapabilities rep;
    struct _tds__GetCapabilitiesResponse repResponse;
    result = soap_call___tds__GetCapabilities(soap, endpoint, NULL, &req, &repResponse);
    if (SOAP_OK == result) {
        if (repResponse.Capabilities->PTZ != NULL) {
            strncpy(capa->PtzXAddr, repResponse.Capabilities->PTZ->XAddr, sizeof(capa->PtzXAddr) - 1);
            capa->PtzXAddr[sizeof(capa->PtzXAddr) - 1] = '\0';
        }
    }
    
    // PTZ云台控制
    int ONVIF_PTZContinuousMove(const char* ptzXAddr, const char* ProfileToken, float speed) {
        int result = 0;
        struct soap *soap = NULL;
        struct _tptz__ContinuousMove continuousMove;
        struct _tptz__ContinuousMoveResponse continuousMoveResponse;
    
        SOAP_ASSERT(NULL != ptzXAddr);
        SOAP_ASSERT(NULL != ProfileToken);
    
        soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT);
        ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);
    
        soap_default__tptz__ContinuousMove(soap, &continuousMove);
        continuousMove.ProfileToken = ProfileToken;
        
        struct tt__PTZSpeed* velocity = soap_new_tt__PTZSpeed(soap, -1);
        continuousMove.Velocity = velocity;
        
        struct tt__Vector2D* panTilt = soap_new_tt__Vector2D(soap, -1);
        continuousMove.Velocity->PanTilt = panTilt;
        continuousMove.Velocity->PanTilt->space = "http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace";
        continuousMove.Velocity->PanTilt->x = -speed;
        continuousMove.Velocity->PanTilt->y = 0;
    
        result = soap_call___tptz__ContinuousMove(soap, ptzXAddr, NULL, &continuousMove, &continuousMoveResponse);
        SOAP_CHECK_ERROR(result, soap, "soap_call___tptz__ContinuousMove");
    
        printf("soap_call___tptz__ContinuousMove result: %d\n", result);
    
        EXIT:
        if (NULL != soap) {
            ONVIF_soap_delete(soap);
        }
        return result;
    }
    
    // 获取当前PTZ的位置以及状态
    static int ONVIF_PTZ_GetStatus(const char* PtzXAddr, const char* ProfileToken) {
        int result = 0;
        struct soap* soap = NULL;
        struct _tptz__GetStatus getStatus;
        struct _tptz__GetStatusResponse getStatusResponse;
    
        SOAP_ASSERT(NULL != PtzXAddr);
        SOAP_ASSERT(NULL != ProfileToken);
    
        soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT);
        ONVIF_SetAuthInfo(soap, USERNAME, PASSWORD);
    
        getStatus.ProfileToken = ProfileToken;
    
        result = soap_call___tptz__GetStatus(soap, PtzXAddr, NULL, &getStatus, &getStatusResponse);
        if (SOAP_OK == result) {
            SOAP_CHECK_ERROR(result, soap, "ONVIF_PTZ_GetStatus");
    
            printf("当前状态:SOAP_OK\n");
    
            if (getStatusResponse.PTZStatus->MoveStatus->PanTilt == tt__MoveStatus__IDLE) {
                printf("空闲\n");
            }
            else if (getStatusResponse.PTZStatus->MoveStatus->PanTilt == tt__MoveStatus__MOVING) {
                printf("移动中\n");
            }
            else if (getStatusResponse.PTZStatus->MoveStatus->PanTilt == tt__MoveStatus__UNKNOWN) {
                printf("未知\n");
            }
        }
    
        EXIT:
        if (NULL != soap) {
            ONVIF_soap_delete(soap);
        }
    
        return result;
    }
    

    请注意,以上代码只是一个示例,具体实现可能需要根据你的实际环境和需求进行适当修改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月17日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 哪个tomcat中startup一直一闪而过 找不出问题
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码