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组件解析
很久没有写博客了(至少自己感觉很长时间没有写了),没办法啊,楼主也是需要生活的人啊,这段一直都在找工作什么的.(整天催我代码的人,还望多多谅解啊,我会坚持写我们的项目的,还是需要相信我的,毕竟这是一个 ...
随机推荐
- Python - 生成requirement.text 文件
前言 该篇操作笔记摘自小菠萝 Python项目中,一般都会有一个 requirements.txt 文件 这个文件主要是用于记录当前项目下的所有依赖包及其精确的版本号,以方便在一个新环境下更快的进行部 ...
- docker挂载目录问题:touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
docker 运行后, 执行docker logs -f myjenkins时报错:touch: cannot touch '/var/jenkins_home/copy_reference_file ...
- node ***.js或npm run scripts的脚本命令出现Cannot find module 'react-dev-utils/getPublicUrlOrPath'报错的解决办法
出现类似Cannot find module 'react-dev-utils/getPublicUrlOrPath'一般是项目中没有下载报错中提到的模块(可以在项目中package.json文件de ...
- iOS Swift逻辑运算符
运算符 运算符分类 从操作数角度看:运算符包括一元.二元.三元.这里的一二三指操作数的数量,操作数指的是被操作的数值. 从运算符位置看:运算符分为前缀.中缀.后缀.例如:!b, b + c, c! 赋 ...
- Java-多态(下)
多态 一种类型的多种状态 还有一个小汽车的例子再理解下 汽车接口(相当于父类) package com.oop.demo10; public interface Car { String getNam ...
- UDP接收端和发送端_Socket编程
UDP接收端 接收端启动文件 1 import java.net.DatagramSocket; 2 import java.net.SocketException; 3 4 public class ...
- python的参数传递是值传递还是引用传递?都不是!
[写在前面] 参考文章: https://www.cnblogs.com/spring-haru/p/9320493.html[偏理论,对值传递和引用传递作了总结] https://www.cnblo ...
- 初始HTML03
**------------恢复内容开始------------** HTML 页面标签组成 一个完整的页面仅有一个html元素,在这个元素之下,包含head和body元素,前者负责说明页面结构,后者 ...
- 5个步骤,教你瞬间明白线程和线程安全.md
记得刚来杭州面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆. 他又接着问:那你再来说说什么是线程安全?--然后我就GG了 ...
- 机器学习:KNN
KNN:K-nearst neighbors 简介: k-近邻算法采用测量不同特征值之间的距离来进行分类,简而言之为:人以类聚,物以群分 KNN既可以应用于分类中,也可用于回归中:在分类的预测是,一般 ...