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组件解析
很久没有写博客了(至少自己感觉很长时间没有写了),没办法啊,楼主也是需要生活的人啊,这段一直都在找工作什么的.(整天催我代码的人,还望多多谅解啊,我会坚持写我们的项目的,还是需要相信我的,毕竟这是一个 ...
随机推荐
- 浏览器+css基础+选择器+权重+匹配规则
浏览器的组成: shell+内核 shell:用户能看得到的界面就叫shell 内核:渲染rendering引擎和js引擎 现在主流拥有自己开发内核的浏览器:opera现在属于360和昆仑万维 CSS ...
- Spring Cloud Gateway 没有链路信息,我 TM 人傻了(中)
本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...
- pycharm向GitHub提交代码
设置为自动add commit代码 push代码 查看github,看到提交记录
- Css3 3D 旋转动画效果
需求: 1.一个列表滑动效果为360 旋转 准备: 1.css 基础 2.Css 动画基础animation 3.transform-style概念 4 transform 概念 5 JavaScri ...
- pytest环境准备与入门
前言pytest 是 python2 默认自带的,python3 的版本 pytest 框架独立出来了,需用 pip 安装.以下为 python3.7版本为例 pytest是python的一种单元测试 ...
- 2017第二届广东省强网杯线上赛:WEB phone number (SQL注入)
目录 解题思路 总结 解题思路 拿到题目的时候,只有一个登录界面 拿到登录界面,而且还伴随着有注册界面,联想到SQL的二次注入漏洞 尝试注册admin'#,并使用admin登录,发现登录失败,说明可能 ...
- vue+element实现省区市三级联动以及详细地址的输入
Vue+elementui实现省区市三级联动+详细地址的输入 详细需求,需要手动更改用户所在的地址. 安装依赖项 npm install element-china-area-data -S 在组建中 ...
- 数值计算:四阶龙格-库塔法 for 二阶微分方程
引言 考虑存在以下二阶偏微分方程 \[\begin{align} f_2 \cdot \ddot{X(t)}+f_1 \cdot \dot{X(t)} +f_0 \cdot {X(t)} =F(t) ...
- spoj2 prime1 (区间筛)
给定t组询问,每组询问包括一个l和r,要求\([l,r]\)的素数有哪些 其中\(t \le 10,1 \le l \le r \le 1000000000 , r-l \le 100000\) Qw ...
- 2020.5.16-ICPC Central Europe Regional Contest 2019
A. ABB #include <bits/stdc++.h> using namespace std; #define PB push_back #define ZERO (1e-10) ...