gSOAP+onvif初探(三):PTZ控球
一、获取设备能力集
球机都有自己的能力集,在要对球机发送调用命令前可以先获取设备能力集:
struct _tds__GetCapabilities Capabilities;struct _tds__GetCapabilitiesResponse CapabilitiesResponse;soap_wsse_add_UsernameTokenDigest(soap, NULL, username, password);//依然记得要在这之前加上鉴权操作soap_call___tds__GetCapabilities(soap, DeviceXAddr, NULL, &Capabilities, &CapabilitiesResponse);
二、PTZ介绍
简单介绍PTZ表示的是什么:
- P:Pan水平转动角度
- T:Tilt垂直转动角度
- Z:缩放倍数
我用http的80端口传输时用的是PTZ绝对位置,范围是:P:(0,18000)T:(0,9000)z:(0-200)
。
而用onvif控球,其发送的是归一化后的绝对位置,P:(-1,1)T:(-1,1),Z:(0,1)
。在发送之前,将PTZ值先归一化即可。
三、控球命令
控球用AbsoluteMove
(绝对移动)命令
soap_call___tptz__AbsoluteMove(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _tptz__AbsoluteMove *tptz__AbsoluteMove, struct _tptz__AbsoluteMoveResponse *tptz__AbsoluteMoveResponse)
ContinuousMove
(沿某方向持续移动)命令
soap_call___tptz__ContinuousMove(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _tptz__ContinuousMove *tptz__ContinuousMove, struct _tptz__ContinuousMoveResponse *tptz__ContinuousMoveResponse);
RelativeMove
(相对移动)命令
soap_call___tptz__RelativeMove(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _tptz__RelativeMove *tptz__RelativeMove, struct _tptz__RelativeMoveResponse *tptz__RelativeMoveResponse);
四、结构体描述
绝对位置移动结构体SOAP_TYPE__tptz__AbsoluteMove
定义如下:
struct _tptz__AbsoluteMove {/** Required element 'ProfileToken' of XSD type 'tt:ReferenceToken' */char *ProfileToken;/** Required element 'Position' of XSD type 'tt:PTZVector' */struct tt__PTZVector *Position;//转动位置结构体成员/** Optional element 'Speed' of XSD type 'tt:PTZSpeed' */struct tt__PTZSpeed *Speed;//转动速度结构体成员
};
其中ProfileToken
是一个标识。可以用获取配置文件函数soap_call___trt__GetProfiles
获得,函数定义:
soap_call___trt__GetProfiles(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _trt__GetProfiles *trt__GetProfiles, struct _trt__GetProfilesResponse *trt__GetProfilesResponse)
tt__PTZVector
为转动位置结构体:
struct tt__PTZVector {/** Optional element 'tt:PanTilt' of XSD type 'tt:Vector2D' */struct tt__Vector2D *PanTilt;//2维坐标结构体/** Optional element 'tt:Zoom' of XSD type 'tt:Vector1D' */struct tt__Vector1D *Zoom;//1维坐标结构体
};
tt__PTZSpeed
为转动速度结构体
struct tt__PTZSpeed {/** Optional element 'tt:PanTilt' of XSD type 'tt:Vector2D' */struct tt__Vector2D *PanTilt;/** Optional element 'tt:Zoom' of XSD type 'tt:Vector1D' */struct tt__Vector1D *Zoom;
};
tt__Vector2D
2维坐标:
struct tt__Vector2D {/** Required attribute 'x' of XSD type 'xsd:float' */float x; //Pan/** Required attribute 'y' of XSD type 'xsd:float' */float y; //Tilt/** Optional attribute 'space' of XSD type 'xsd:anyURI' *///URI:一般填入"http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace"即可char *space;
};
tt__Vector1D
1维坐标:
struct tt__Vector1D {/** Required attribute 'x' of XSD type 'xsd:float' */float x;/** Optional attribute 'space' of XSD type 'xsd:anyURI' */char *space;
};
五、简例
1、soap结构初始化
soap_p = soap_new();
soap_set_namespaces(soap_p, namespaces);
2、鉴权(用户认证)
soap_wsse_add_UsernameTokenDigest(soap_p, NULL, "admin", "ADMIN123456");
3、配置文件获取(profiletoken)
struct _trt__GetProfiles req;
struct _trt__GetProfilesResponse rep;
soap_call___trt__GetProfiles(soap, MediaXAddr, NULL, &req, &rep);
if (rep.__sizeProfiles > 0)
{ // 分配缓存(*profiles) = (struct tagProfile *)malloc(rep.__sizeProfiles * sizeof(struct tagProfile));SOAP_ASSERT(NULL != (*profiles));memset((*profiles), 0x00, rep.__sizeProfiles * sizeof(struct tagProfile));
}
for(i = 0; i < rep.__sizeProfiles; i++){ // 提取所有配置文件信息(我们所关心的)struct tt__Profile *ttProfile = &rep.Profiles[i];struct tagProfile *plst = &(*profiles)[i];if (NULL != ttProfile->token) { // 配置文件Tokenstrncpy(plst->token, ttProfile->token, sizeof(plst->token) - 1);}}
4、为结构体分配内存并填充结构体
在发送命令之前要为结构体_tptz__AbsoluteMove
和_tptz__AbsoluteMoveResponse
申请内存空间,其成员也需要分配内存:
soap_malloc(struct soap *soap, size_t n)
......//为结构体分配内存
然后填充结构体:
soap_default__tptz__AbsoluteMove(soap_p, &AbsoluteMove);//内存清零
soap_default__tptz__AbsoluteMoveResponse(soap_p, &AbsoluteMoveResponse);AbsoluteMove.ProfileToken = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.ProfileToken, "Profile_1");//profiletokenAbsoluteMove.Position->PanTilt = (tt__Vector2D*)soap_malloc(soap_p, sizeof(struct tt__Vector2D));
AbsoluteMove.Position->PanTilt->x = -0.9798;//P这里是随便写的几个数
AbsoluteMove.Position->PanTilt->y = 0.6768;//T
AbsoluteMove.Position->PanTilt->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Position->PanTilt->xmlns, "http://www.onvif.org/ver10/schema");
AbsoluteMove.Speed->PanTilt = (tt__Vector2D*)soap_malloc(soap_p, sizeof(struct tt__Vector2D));;
AbsoluteMove.Speed->PanTilt->x = 1.0;//P方向转速
AbsoluteMove.Speed->PanTilt->y = 1.0;//T方向转速
AbsoluteMove.Speed->PanTilt->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Speed->PanTilt->xmlns, "http://www.onvif.org/ver10/schema");AbsoluteMove.Position->Zoom =(tt__Vector1D*) soap_malloc(soap_p, sizeof(struct tt__Vector1D));
AbsoluteMove.Position->Zoom->x = 0.7646;//Z
AbsoluteMove.Position->Zoom->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Position->Zoom->xmlns, "http://www.onvif.org/ver10/schema");
AbsoluteMove.Speed->Zoom = (tt__Vector1D*)soap_malloc(soap_p, sizeof(struct tt__Vector1D));;
AbsoluteMove.Speed->Zoom->x = 1.0;//Z缩放速度
AbsoluteMove.Speed->Zoom->xmlns = (char*)soap_malloc(soap_p, 128);
strcpy(AbsoluteMove.Speed->Zoom->xmlns, "http://www.onvif.org/ver10/schema");
5、发送调用命令
soap_call___tptz__AbsoluteMove(soap_p, ball_onvifserver, NULL, &AbsoluteMove, &AbsoluteMoveResponse);
6、soap结构清理
soap_destroy(soap_p);soap_end(soap_p);soap_done(soap_p);
gSOAP+onvif初探(三):PTZ控球相关推荐
- cgo+gSoap+onvif学习总结:6、进行PTZ控制
cgo+gSoap+onvif学习总结:6.进行PTZ控制 文章目录 cgo+gSoap+onvif学习总结:6.进行PTZ控制 1. 前言 2. gSoap生成c代码框架 3. 实现c代码实例并运行 ...
- 第八章 win10+gsoap+onvif+ffmpeg
第八章 win10+gsoap+onvif+ffmpeg vm下基于onvif协议的demo已经完成,在测试的时候,无法收到发送出的信息.因此,设备搜索,设备信息等功能无法测试.具体原因查了好久,未知 ...
- cgo+gSoap+onvif学习总结:5、获取profileToken、rtsp流地址、快照地址及cgo程序signal SIGSEGV: segmentation violation解决方法
cgo+gSoap+onvif学习总结:5.获取profileToken.rtsp流地址.快照地址及cgo偶发signal SIGSEGV: segmentation violation分割违例解决方 ...
- go+gSoap+onvif学习总结:7、进行镜头调焦、聚焦和预置点的增删改查
cgo+gSoap+onvif学习总结:7.进行镜头调焦.聚焦和预置点的增删改查 文章目录 cgo+gSoap+onvif学习总结:7.进行镜头调焦.聚焦和预置点的增删改查 1. 前言 2. gSoa ...
- 火箭主帅德安东尼赞哈登低位防守:他是控球中锋
资料图:哈登. 中新网北京1月28日电 北京时间1月28日,火箭103:98战胜魔术.据NBA中文网报道,火箭主帅德安东尼在赛后夸赞了球队当家核心哈登的低位防守. 本场比赛,克里斯-保罗在缺席了17场 ...
- 专访三维力控科解读实时数据库的发展
本网记者:控制工程中文网的各位网友大家好,我是控制工程中文网的编辑史虹,今天我们很荣幸地邀请到北京三维力控科技有限公司的总经理林威汉先生为我们解读实时数据库在国内外目前的技术发展和应用现状.首先简单介 ...
- 暑假训练---三棱锥内切球公式及海伦公式
题目 2326: 七月树的水题 题目描述 七月树看到了一道题."哇!水题啊!"七月树愉快地叫着,看样子她 AK 稳了. 七月树看到的题如下: 有一个如图的三棱锥,其中 AD,BD, ...
- 计算机组成原理微控器功能,(计算机组成原理)实验三微控器实验.ppt
文档介绍: 计算机组成原理课程设计 实验三.微控器实验 葛扩院廖萝丽斯节宽裔萌宛敢蜘祭癌颂导罪仍囚誓棋尹侈速爹详凑移悸董(计算机组成原理)实验三微控器实验(计算机组成原理)实验三微控器实验 实验三微控 ...
- 金百福系统一直显示连接服务器,三维力控组态软件V7.2/7.1/7.0 新版加密狗无限点全授权...
软件名称:三维力控组态软件V7.2/7.1/7.0 新版加密狗无限点全授权 三维力控组态软件,USB加密狗,送教学! [V7.2 最新版]: 无限点,全功能, 支持WEB发布,含所有扩展组件 温馨提醒 ...
- 解析json文本并使用handler完成三个控件文本内容的切换
Demo需求: 三个控件展示三个关键词,在资源文件获取文本,每隔5秒切换下一词,关键词展示到最后再重头开始 开发工具:Android studio 布局: <?xml version=" ...
最新文章
- python实现字符串中中文在前,数字在后且按从小到大排序
- 单源最短路径(spfa)
- TCP第四次挥手为什么要等待2MSL
- Python 命令行库的大乱
- javascript中正则表达式和ruby中的一点差异
- 「CJOJ2573」Snake vs Block
- STL之Deque容器
- 汉仪欧楷字体获2016中国设计红星奖银奖
- UE4虚幻引擎4多人联机基础知识和客户端服务器通信机制详解
- 简单的了解一下MySQL连接查询
- 微信小程序开发实战(网络请求设置)
- 开工大吉,开启新征程!
- C#窗体Click事件没反应
- 【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(一、编译连接前准备)
- uniapp web端 支付宝 微信使用当面付
- 你这一生还能陪妈妈几天?来看看
- 炫“库“行动—人大金仓有奖征文——金仓数据库安装教程
- 网站10大常见安全漏洞及解决方案
- 启明云端方案分享:4.3寸彩屏在料理机上的智能交互
- 关于Fielding博士论文导读
热门文章
- 牛客网——找出直系亲属
- 模仿实现百度搜索黑洞动画效果
- 51nod 1428 贪心
- 《信心——是什么?导致什么?》_司布真
- IOS成长之路-使用系统默认声音、震动
- A novel hybrid intrusion detection method integrating anomalydetection with misuse detection
- Python学习week4
- python row函数_Python extmath.row_norms方法代码示例
- 以汨罗命名的鸿蒙网,汨罗千年古镇“新市”考
- kibana的安装(elasticsearch图形化界面)