onvif实现对PTZ云台控制
1.源码:
报错如下
2.源码:
报错如下:
请求当前状态,返回为空
注解:获取设备能力:
strncpy(capa->PtzXAddr, rep.Capabilities->PTZ->XAddr, sizeof(capa->PtzXAddr) - 1);
onvif实现对PTZ云台控制
1.源码:
注解:获取设备能力:
strncpy(capa->PtzXAddr, rep.Capabilities->PTZ->XAddr, sizeof(capa->PtzXAddr) - 1);
下午好🌅🌅🌅
本答案参考ChatGPT-3.5
问题1中的报错可能是由于以下原因导致的:
capa->PtzXAddr
,导致报错。解决方案:
capa->PtzXAddr
。问题2中的报错可能是由于以下原因导致的:
ONVIF_PTZContinuousMove
函数时,传入的参数ptzXAddr
或ProfileToken
可能为NULL,导致报错。解决方案:
ONVIF_PTZContinuousMove
函数时传入的参数ptzXAddr
和ProfileToken
都不为NULL。soap_call___tptz__ContinuousMove
函数时,可能出现SOAP连接或调用错误。解决方案:
soap_call___tptz__ContinuousMove
函数之前,正确创建和配置SOAP连接。continuousMove.ProfileToken
和continuousMove.Velocity
是否正确设置。问题3中的报错可能是由于以下原因导致的:
ONVIF_PTZ_GetStatus
函数时,传入的参数PtzXAddr
或ProfileToken
可能为NULL,导致报错。解决方案:
ONVIF_PTZ_GetStatus
函数时传入的参数PtzXAddr
和ProfileToken
都不为NULL。soap_call___tptz__GetStatus
函数时,可能出现SOAP连接或调用错误。解决方案:
soap_call___tptz__GetStatus
函数之前,正确创建和配置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;
}
请注意,以上代码只是一个示例,具体实现可能需要根据你的实际环境和需求进行适当修改。