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组件解析
很久没有写博客了(至少自己感觉很长时间没有写了),没办法啊,楼主也是需要生活的人啊,这段一直都在找工作什么的.(整天催我代码的人,还望多多谅解啊,我会坚持写我们的项目的,还是需要相信我的,毕竟这是一个 ...
随机推荐
- yapi 事件创建、修改等接口事件监听
使用的yapi作为接口文档平台.出于业务需求需要对接口创建.修改.删除等事件进行监听. yapi已经实现并预留了这个口子,但是没有找到实现的文档.这里进行简单描述下使用的方式. 一.yapi创建.修改 ...
- 网络IO模型与Reactor模式
一.三种网络IO模型: 分类: BIO 同步的.阻塞式 IO NIO 同步的.非阻塞式 IO AIO 异步非阻塞式 IO 阻塞和同步的概念: 阻塞:若读写未完成,调用读写的线程一直等待 非阻塞:若读写 ...
- whistle抓包-数据包分析
额,这篇忘了是来自哪位作者的了. whistle:1.14.6 这里以抓取浏览器数据包为例,分析抓取的数据. Method:Connect,对应Host:Tunnel to意思是因为网络环境受限,客户 ...
- 用Flask 实现文件服务器(包含docker版本)
最近有了公司局域网内共享axure原型的需求,所以用Flask开发了一款文件上传/查看工具,记录一下其中的问题和解决方案 这个工具参照了一位大神的uploads工具 https://zhuanlan. ...
- 解决vue项目中遇到父组件的按钮或操作控制重新挂载子组件但是子组件却无效果的情况
在vue项目中终会遇到需要父组件的按钮或操作控制重新挂载子组件的需求,我在新项目中就遇到这种需求.真实场景是父组件的早,中,晚三个按钮(代表三个时间段)来控制子组件的table表格列的动态加载. 子组 ...
- NLP与深度学习(六)BERT模型的使用
1. 预训练的BERT模型 从头开始训练一个BERT模型是一个成本非常高的工作,所以现在一般是直接去下载已经预训练好的BERT模型.结合迁移学习,实现所要完成的NLP任务.谷歌在github上已经开放 ...
- 6.堆和GC
一. 堆和GC介绍 1.java堆的特点 <深入理解java虚拟机>是怎么描述java堆的 Java堆(Java Heap)是java虚拟机所管理的内存中最大的一块 java堆被所有线程共 ...
- 干货 | 数据为王,携程国际火车票的 ShardingSphere 之路
以下文章来源于携程技术 ,作者瑞华 作者简介 瑞华,携程高级后端开发工程师,关注系统架构.分库分表.微服务.高可用等. 一.前言 随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐 ...
- 洛谷2151[SDOI2009]HH去散步(dp+矩阵乘法优化)
一道良好的矩阵乘法优化\(dp\)的题. 首先,一个比较\(naive\)的想法. 我们定义\(dp[i][j]\)表示已经走了\(i\)步,当前在点\(j\)的方案数. 由于题目中限制了不能立即走之 ...
- hdoj_Problem1.1.8_A+B for Input-Output Practice (VIII)
A+B for Input-Output Practice (VIII) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...