ONVIF PTZ云台控制--RelativeMove
上周弄了一周都没有弄出来,今天又去研究了下ONVIF Device Test Tool。终于有所发现了。
首先肯定是soap,关于鉴权的soap就不展开说了。
然后是获取能力。这里我是获取了所有能力。
接着是GetProfiles,为了得到在控制PTZ时的token。
代码已经调试通了某华和某康的IPC。
一开始我们用的是某华,在GetProfiles是的地址是PTZ的。但是在兼容某康时,变成了为实现可选项。通过上面说到的工具发现。用的token是Media的。但是控制的时候的地址是PTZ的。
下面上代码。实现的是相对位移的接口。
int onvif_OptPTZ(char* strIp, int port, char* user, char* password, ptz_common commond, float move_step)
{
int result = 0;
struct SOAP_ENV__Header Header;
struct soap *soap = NULL;
char *strOptPtz = NULL;
char *strGetToken = NULL;
//鉴权信息
USERINFO stUserInfo;
USERINFO *pAuth = NULL;
memset(&stUserInfo, 0x0, sizeof(stUserInfo));
if(user == NULL || password == NULL)
{
pAuth = NULL;
}
else
{
snprintf(stUserInfo.username, 64, "%s", user);
snprintf(stUserInfo.password, 32, "%s", password);
pAuth = &stUserInfo;
}
//创建一个带鉴权的soap
soap = ONVIF_Initsoap(&Header, NULL, NULL, 5, pAuth);
if(NULL == soap)
{
printf("FUNCTION:(%s) ---- Init soap error!\n", __FUNCTION__);
return -1;
}
char soap_endpoint[128];
snprintf(soap_endpoint, 128, "http://%s:%d/onvif/device_service", strIp, port);
_tds__GetCapabilities abi_req;
_tds__GetCapabilitiesResponse abi_resp;
memset(&abi_req, 0x0, sizeof(abi_req));
memset(&abi_resp, 0x0, sizeof(abi_resp));
abi_req.__sizeCategory = 1;
abi_req.Category = (enum tt__CapabilityCategory *)soap_malloc(soap, sizeof(int));
*(abi_req.Category) = tt__CapabilityCategory__All;
soap->header = &Header;
result = soap_call___tds__GetCapabilities(soap, soap_endpoint, NULL, &abi_req, &abi_resp);
if(result != SOAP_OK || abi_resp.Capabilities == NULL)
{
printf("soap error: %d--%d, %s, %s\n", __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
goto onvif_OptPTZ_end;
}
if(abi_resp.Capabilities->Media)
{
// printf("Media: XAddr: (%s)\n", abi_resp.Capabilities->Media->XAddr);
strGetToken = abi_resp.Capabilities->Media->XAddr;
strOptPtz = abi_resp.Capabilities->PTZ->XAddr;
}
_trt__GetProfiles request_pro;
_trt__GetProfilesResponse reponse_pro;
memset(&request_pro,0,sizeof(request_pro));
memset(&reponse_pro,0,sizeof(reponse_pro));
soap->header = &Header;
result = soap_call___trt__GetProfiles(soap, strGetToken, NULL, &request_pro, &reponse_pro);
if(SOAP_OK != result)
{
printf("soap error: %d--%d, %s, %s\n", __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
goto onvif_OptPTZ_end;
}
_tptz__RelativeMove ptz_req;
_tptz__RelativeMoveResponse ptz_resp;
memset(&ptz_req, 0x0, sizeof(ptz_req));
memset(&ptz_resp, 0x0, sizeof(ptz_resp));
// printf("__sizeProfiles: %d\n", reponse_pro.__sizeProfiles);
// printf("token: %s\n", reponse_pro.Profiles->token);
ptz_req.ProfileToken = reponse_pro.Profiles->token;
ptz_req.Translation = (struct tt__PTZVector *)soap_malloc(soap, sizeof(tt__PTZVector));
memset(ptz_req.Translation, 0x0, sizeof(tt__PTZVector));
ptz_req.Translation->PanTilt = (struct tt__Vector2D *)soap_malloc(soap, sizeof(tt__Vector2D));
memset(ptz_req.Translation->PanTilt, 0x0, sizeof(tt__Vector2D));
ptz_req.Translation->Zoom = (struct tt__Vector1D *)soap_malloc(soap, sizeof(tt__Vector1D));
memset(ptz_req.Translation->Zoom, 0x0, sizeof(tt__Vector1D));
if(move_step >= 1)
{
move_step = 0.99999;
}
switch(commond)
{
case PTZ_LEFT:
ptz_req.Translation->PanTilt->x = move_step;
break;
case PTZ_RIGHT:
ptz_req.Translation->PanTilt->x = -move_step;
break;
case PTZ_UP:
ptz_req.Translation->PanTilt->y = -move_step;
break;
case PTZ_DOWN:
ptz_req.Translation->PanTilt->y = move_step;
break;
case PTZ_LEFTUP:
ptz_req.Translation->PanTilt->x = move_step;
ptz_req.Translation->PanTilt->y = -move_step;
break;
case PTZ_LEFTDOWN:
ptz_req.Translation->PanTilt->x = move_step;
ptz_req.Translation->PanTilt->y = move_step;
break;
case PTZ_RIGHTUP:
ptz_req.Translation->PanTilt->x = -move_step;
ptz_req.Translation->PanTilt->y = -move_step;
break;
case PTZ_RIGHTDOWN:
ptz_req.Translation->PanTilt->x = -move_step;
ptz_req.Translation->PanTilt->y = move_step;
break;
case PTZ_ZOOMIN:
ptz_req.Translation->Zoom->x = move_step;
break;
case PTZ_ZOOMOUT:
ptz_req.Translation->Zoom->x = -move_step;
break;
default:
goto onvif_OptPTZ_end;
break;
}
soap->header = &Header;
result = soap_call___tptz__RelativeMove(soap, strOptPtz, NULL, &ptz_req, &ptz_resp);
if(SOAP_OK == result)
{
printf("RelativeMove----OK\n");
}
else
{
printf("RelativeMove----faild\n");
printf("soap error: %d--%d, %s, %s\n", __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
}
onvif_OptPTZ_end:
soap_destroy(soap);
soap_end(soap);
soap_free(soap);
return result;
}
ONVIF PTZ云台控制--RelativeMove相关推荐
- JAVA实现onvif的ptz控制_使用Onvif协议进行设备PTZ云台控制
接上一篇 使用Onvif协议最重要的应用就是对设备进行PTZ云台控制,PTZ控制包含转动.变焦等,这里我们主要讨论常用的转动和变焦(也就是放大缩小) 流程 要进行设备PTZ控制,我们首先需要获取到设备 ...
- SkeyeVSS国标视频汇聚云服务使用Onvif、GB28181协议对监控摄像机设备进行PTZ云台控制
SkeyeVSS平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚.整合.集中管理,实现视频资源的鉴权管理.按需调阅.全网分发.智能分析等.平台可支持多协议.多类型设备接入,包括国标GB281 ...
- RTSP/Onvif安防网络摄像头无插件直播流媒体服务EasyNVR如何实现网络摄像机Onvif/RTSP接入直播与云台控制
什么是Onvif协议 ONVIF规范描述了网络视频的模型.接口.数据类型以及数据交互的模式.并复用了一些现有的标准,如WS系列标准等.ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产的 ...
- ONVIF协议开发之网络摄像头云台控制(C版)
在之前的文章中(<python-onvif实现客户端控制相机云台>),介绍过用python实现基于onvif协议的相机云台控制,考虑到嵌入式端的执行效率问题,还是需要实现C/C++版本的接 ...
- 传统安防监控摄像头Onvif云台控制直播流如何转换成GB/T28181对接到国标视频平台公安内网
传统安防监控摄像头Onvif云台控制如何转换成GB/T28181 1.应用背景 2.部署流媒体服务 2.1.Onvif探测添加 2.1.1.通道编辑 2.2.视频广场播放 2.3.云台操作 3.GB/ ...
- 【疑难解决】RTSP协议视频流媒体平台EasyNVR调用云台控制接口返回400报错的问题处理
网络摄像头RTSP协议视频直播平台是TSINGSEE青犀视频全线产品中最先支持ONVIF协议的平台,可以通过ONVIF进行云台控制. 在用户使用EasyNVR调用云台控制的接口时,发现会返回400的报 ...
- Onvif协议学习:14、球机云台控制PTZ
Onvif协议学习:14.球机云台控制PTZ 文章目录 Onvif协议学习:14.球机云台控制PTZ 一.介绍 二.代码实现 八个方向.放下及缩小控制 聚焦控制 原文链接:https://blog.c ...
- ONVIF PTZ控制海康云台相机
之前帮一个算法朋友弄的 ONVIF PTZ控制海康云台相机代码在无人车上的应用. 主要是鉴权没弄过,折腾onvif的人肯定会碰到,所以特别记录一下. 开始本来是在X64的WIN32或ubuntu工控机 ...
- Go语言实现Onvif客户端:8、摄像头PTZ控制(云台控制)
Go语言实现Onvif客户端:8.摄像头PTZ控制(云台控制) 文章目录 Go语言实现Onvif客户端:8.摄像头PTZ控制(云台控制) 1.PTZ简单再介绍 2.代码 3.结果 1.PTZ简单再介绍 ...
最新文章
- 对 android apk 进行重新签名操作
- 基于PyQt5的快速开发框架QFramer
- 疫情影响海外净利润?海尔智家的回答出人意料
- python里面的pip是什么意思_Python-pip和conda有什么区别?
- 温州大学《机器学习》课程课件和视频(四)朴素贝叶斯
- 快速幂(Fast_Power)
- 慎用url重写(转)
- 百老汇原版音乐剧《摇滚学校》2月开启中国巡演
- Python中字符串的startswith()和endswith()方法
- 各j2ee web层框架比较(转)
- 在 Mac 中 使用 Safari 常出现「此网页正使用大量内存...」如何修复?
- TOGAF9.2企业架构师考试小记
- DM8与Oracle关于模式、用户等概念的分析
- 割平面法 matlab,割平面法matlab
- java POI excel导出自定义分页问题
- mybatis-plus关联查询,一对一、一对多。
- matlab信息隐藏图片,信息隐藏 实验二 BMP 图像信息隐藏
- UE4 简单记录EQS的使用方法
- 企业数据备份,需要多少容量和性能满足?
- WordPress 文章点赞