ONVIF协议客户端
前几天跟大家聊了一些关于ONVIF的一些基础知识,它的工作原理以及优势。今天安徽思蔷信息科技为带大家了解一下simpleonvif
百度云盘下载地址:链接:https://pan.baidu.com/s/1xMkeXRZjrVCyiTbivedCxA
提取码:8hx3
1.SimpleOnvif的功能
提供支持Windows、Linux、arm、Android、iOS等各种平台的SDK库,方便集成,二次开发。
2.onvif的搜索实现
std::map<std::string, std::string> OnvifService::GetDiscoveryDevices()
{
std::map<std::string, std::string> devs;
SimpleMutex lock(&mutex_);
std::map<std::string, ONVIF_DEVICE*>::iterator it = OnvifDeviceMap_.begin();
while (it != OnvifDeviceMap_.end())
{
ONVIF_DEVICE* dev = it->second;
char url[256] = {0};
snprintf(url, 255, "%s://%s:%d%s", dev->binfo.XAddr.https ? "https" : "http", dev->binfo.XAddr.host, dev->binfo.XAddr.port, dev->binfo.XAddr.url);
devs.insert(std::make_pair(dev->binfo.XAddr.host, url));
it++;
}
return devs;
}
3.onvif ptz实现
bool OnvifService::StartPtz(SimplePTZCMDType command, unsigned int speed, const std::string& host, const std::string& username, const std::string& password, const std::string& deviceUrl)
{
ONVIF_DEVICE manualDevice;
ONVIF_DEVICE* device = getDevice(&manualDevice, host, username, password, deviceUrl);
BOOL ret = false;
if (!device)
{
printf("==%s==Line:%d >> Get device Fail continue to find Device!!!\n", __FUNCTION__,__LINE__);
//return false;
}
else
{
onvif_SetAuthInfo(device, username.c_str(), password.c_str());
}
ContinuousMove_REQ req;
memset(&req, 0, sizeof(req));
#ifdef Simple_ONVIF_SPEED
float onvif_speed = 0.0;
if ((speed > 100) || (speed < 0))
{
printf("==%s==Line:%d >> Speed=%d,out of the range\n", __FUNCTION__, __LINE__, speed);
return false;
}
onvif_speed = float(speed / 100.0);
#endif
switch (command)
{
case Simple_PTZ_CMD_TYPE_LEFT:
req.Velocity.PanTiltFlag = 1;
#ifdef Simple_ONVIF_SPEED
req.Velocity.PanTilt.x = -(onvif_speed);
#else
req.Velocity.PanTilt.x = -1;
#endif // Simple_ONVIF_SPEED
req.Velocity.PanTilt.y = 0;
break;
case Simple_PTZ_CMD_TYPE_RIGHT:
req.Velocity.PanTiltFlag = 1;
#ifdef Simple_ONVIF_SPEED
req.Velocity.PanTilt.x = onvif_speed;
#else
req.Velocity.PanTilt.x = 1;
#endif
req.Velocity.PanTilt.y = 0;
break;
case Simple_PTZ_CMD_TYPE_UP:
req.Velocity.PanTiltFlag = 1;
req.Velocity.PanTilt.x = 0;
#ifdef Simple_ONVIF_SPEED
req.Velocity.PanTilt.y = onvif_speed;
#else
req.Velocity.PanTilt.y = 1;
#endif
break;
case Simple_PTZ_CMD_TYPE_DOWN:
req.Velocity.PanTiltFlag = 1;
req.Velocity.PanTilt.x = 0;
#ifdef Simple_ONVIF_SPEED
req.Velocity.PanTilt.y = -(onvif_speed);
#else
req.Velocity.PanTilt.y = -1;
#endif
break;
case Simple_PTZ_CMD_TYPE_ZOOMIN:
req.Velocity.ZoomFlag = 1;
#ifdef Simple_ONVIF_SPEED
req.Velocity.Zoom.x = -(onvif_speed);
#else
req.Velocity.Zoom.x = -1;
#endif
break;
case Simple_PTZ_CMD_TYPE_ZOOMOUT:
req.Velocity.ZoomFlag = 1;
#ifdef Simple_ONVIF_SPEED
req.Velocity.Zoom.x = onvif_speed;
#else
req.Velocity.Zoom.x = 1;
#endif
break;
default:
if(manualDevice.local_ip != 0)
{
onvif_free_device(device);
device = NULL;
}
return false;
}
// printf("==%s==Line:%d >>:PTZ info: Speed=[%d],PanTiltFlag=[%d],PanTilt.x=[%f],PanTilt.y=[%f],onvif_speed=[%f]\n", __FUNCTION__,__LINE__, speed, req.Velocity.PanTiltFlag, req.Velocity.PanTilt.x, req.Velocity.PanTilt.y,onvif_speed);
if (device && device->profiles && strlen(device->profiles->token) > 0)
{
strcpy(req.ProfileToken, device->profiles->token);
printf("==%s==Line%d >>:Start to Move device token=%s,name:%s\n", __FUNCTION__,__LINE__, device->profiles->token, device->profiles->name);
ret = onvif_ContinuousMove(device, &req, NULL);
printf("==%s==Line%d >>:Move device End ret=[%d].token:[%s],name:[%s].\n", __FUNCTION__, __LINE__, ret, device->profiles->token, device->profiles->name);
}
else
{
ONVIF_DEVICE* device_find = NULL;
if (OnvifDeviceMap_.find(host) != OnvifDeviceMap_.end())
{
SimpleMutex lock(&mutex_);
device_find = OnvifDeviceMap_[host];
}
if (!device_find)
{
printf("==%s==Line:%d>> Find device Failed PTZ start Failed End!!!!\n", __FUNCTION__,__LINE__);
return false;
}
onvif_SetAuthInfo(device_find, username.c_str(), password.c_str());
BOOL getCapabilities = false;
getCapabilities = GetCapabilities(device_find);
printf("==%s==:Line:%d >> dev ip:[%s] getCapabilities = %d\n", __FUNCTION__, __LINE__, device_find->binfo.XAddr.host, getCapabilities);
if (!getCapabilities)
{
getCapabilities = GetServices(device_find);
printf("==%s==:Line:%d >> dev ip:[%s] GetServices = %d\n", __FUNCTION__, __LINE__, device_find->binfo.XAddr.host, getCapabilities);
}
if (getCapabilities && GetProfiles(device_find) )
{
printf("==%s==:Line:%d >> dev ip:[%s] GetProfiles Success\n", __FUNCTION__, __LINE__, device_find->binfo.XAddr.host);
if (device_find->profiles && strlen(device_find->profiles->token) > 0)
{
strcpy(req.ProfileToken, device_find->profiles->token);
printf("==%s==Line%d >>:Start to Move find_device token:[%s],name:[%s]\n", __FUNCTION__, __LINE__, device_find->profiles->token, device_find->profiles->name);
ret = onvif_ContinuousMove(device_find, &req, NULL);
printf("==%s==Line%d >>:Move device End ret=[%d].token:[%s],name:[%s].\n", __FUNCTION__, __LINE__, ret,device_find->profiles->token, device_find->profiles->name);
}
}
else
{
ret = false;
printf("%s:Line:%d dev ip:[%s] GetProfiles Failed, Failed to Move\n", __FUNCTION__, __LINE__, device_find->binfo.XAddr.host);
}
}
if (manualDevice.local_ip != 0)
{
onvif_free_device(device);
}
return ret;
}
ONVIF协议客户端的更多相关文章
- C#实现视频监控客户端onvif协议一
前言 最近做的项目是监控方面的,需要对接各种摄像头,之前的方案是把各个厂家的SDK都集成到系统中,然后让用户进行切换,后来知道了Onvif (自行百度具体概念)这个东西.原来早就有人一统江湖了. on ...
- ONVIF协议学习笔记
一.理解 1.1 技术理解 ONVIF = 服务端 + 客户端 =(Web Services + RTSP)+ 客户端 = ((WSDL + SOAP) + RTSP) + 客户端 WSDL是服务端用 ...
- 基于ONVIF协议的摄像头开发总结
<什么是ONVIF协议> 2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共同成立一个国际开放型网络视频产品标准网络接口开发论坛,取名为 ...
- onvif 协议
1.ONVIF 协议解读 https://www.onvif.org 一.什么是ONVIF? 1.1形成 2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共 ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案-Onvif(一)使用Onvif协议进行设备发现以及指定设备信息探测
背景分析 众所周知,EasyNVR不拘泥.不受限于摄像机的品牌厂商及其配套平台,只要是网络监控摄像机IPC.硬盘录像机NVR.且设备支持标准的RTSP/Onvif协议,都可以接入实时视频流进入Easy ...
- Onvif协议及其在Android下的实现
好久没有写博客,今天将前段时间做的Onvif协议在Android上的实现分享给大家. 首先,我们先来了解一下什么是Onvif协议:ONVIF 协议是由Open Network Video Interf ...
- Atitit onvif协议获取rtsp地址播放java语言 attilx总结
Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...
- Atitit onvif 协议截图 getSnapshotUri 使用java
Atitit onvif 协议截图 getSnapshotUri 使用java 1.1. ONVIF Device Test Tool1 1.2. 源码2 1.3. 直接浏览器访问http://192 ...
- 开源的C#实现WebSocket协议客户端和服务器websocket-sharp组件解析
很久没有写博客了(至少自己感觉很长时间没有写了),没办法啊,楼主也是需要生活的人啊,这段一直都在找工作什么的.(整天催我代码的人,还望多多谅解啊,我会坚持写我们的项目的,还是需要相信我的,毕竟这是一个 ...
随机推荐
- ☕【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了!
JPA的介绍分析 Java持久化API (JPA) 显著简化了Java Bean的持久性并提供了一个对象关系映射方法,该方法使您可以采用声明方式定义如何通过一种标准的可移植方式,将Java 对象映射到 ...
- spring入门3-jdbcTemplate简单使用和声明式事务
1.JdbcTemplate简单使用 1.1.引入相关依赖包 <dependency> <groupId>mysql</groupId> <artifactI ...
- 常用的word技巧
自动生成标题 自动生成目录 显示导航列 修订 查看最终版本
- 『GoLang』包
可见性规则 在Go语言中,标识符必须以一个大写字母开头,这样才可以被外部包的代码所使用,这被称为导出.标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的.但是包名不管 ...
- P3214-[HNOI2011]卡农【dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3214 题目大意 一个由\(1\sim n\)的所有整数构成的集合\(S\),求出它的\(m\)个不同非空子集满足 ...
- python测试开发工具库汇总(转载)
Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...
- 如何通过 Serverless 轻松识别验证码?
作者 | 江昱 来源 | Serverless 公众号 前言 Serverless 概念自被提出就倍受关注,尤其是近些年来 Serverless 焕发出了前所未有的活力,各领域的工程师都在试图将 Se ...
- 这几种Java异常处理方法,你会吗?
摘要:我们在软件开发的过程中,任何语言的开发过程中都离不开异常处理. 本文分享自华为云社区<Java异常处理学习总结>,作者: zekelove . 我们在软件开发的过程中,任何语言的开发 ...
- Servlet和Servlet容器
Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容, Servlet是平台独立的Java类,编写一个S ...
- Redis大集群扩容性能优化实践
一.背景 在现网环境,一些使用Redis集群的业务随着业务量的上涨,往往需要进行节点扩容操作. 之前有了解到运维同学对一些节点数比较大的Redis集群进行扩容操作后,业务侧反映集群性能下降,具体表现在 ...