门户
书籍
教程
论坛
问答
下载
签到
个人空间
帐号
自动登录
找回密码
密码
登录
立即注册
账号
自动登录
找回密码
密码
登录
立即注册
请绘制轨迹完成人机验证
由vaptcha提供技术支持
登录
注册
搜索
搜索
搜索
热搜
qml
quick
串口
输入中文
数据库
arm
百度地图
qt聊天
QT安装
安装
多窗口
中文乱码
聊天
局域网
鼠标
QT
图片
乱码
rs485通讯
多线程
android
多文档编辑器
本版
用户
本版
用户
【HUX】问题互助平台
博客
动态
好友
帖子
收藏
道具
勋章
任务
淘帖
动态
日志
相册
分享
记录
留言板
群组
门户
导读
排行榜
设置
我的收藏
退出
Qt开源社区
›
开放区(网友自由发帖区)
›
项目作品
›
Qt音视频开发28-Onvif信息获取
发布主题
返回列表
Qt音视频开发28-Onvif信息获取
0
回复
5836
查看
[复制链接]
liudianwu
当前离线
积分
2616
liudianwu
累计签到:7 天
连续签到:1 天
来源:
2020-10-6 09:56:13
显示全部楼层
|
阅读模式
## 一、前言
严格意义上来说,Onvif处理这块算不上音视频开发的内容,为何重新整理放在音视频开发这个类别,主要是为了方便统一管理,而且在视频监控处理这块,通过onvif来拿到音视频流这是必经的阶段,也算是搭边的东西。上一篇文章写的是onvif设备搜索,搜到这些设备以后,第一件事情就是要对设备信息获取一下,比如获取视频流地址,配置套件信息、码流信息、分辨率大小等,这些信息的获取根据具体的需要去获取,也没有必要全部获取,毕竟很可能大部分的信息用不到,按需编码永远都是第一原则,第二原则才是考虑拓展性和稳定性,如果基本的需求都实现不了,那就不是一个真正的软件,考虑再多的拓展性和稳定性都是白搭,说的严重一点就是:所有编程语言都是垃圾,能解决实际需求并变现才是王道!
onvif设备信息的获取需要注意的是,现在市场上绝大部分的摄像机都有密码验证的限定,先不管他默认是admin还是12345,起码有用户验证的机制摆在那,这样相对来说安全很多,不然谁也可以通过onvif协议拿到对应的信息,就没有安全性可言,记得几年前海康爆出了漏洞,导致很多监控摄像头被泄露,为此海康现在的摄像头默认onvif是关闭的,开启以后密码要求各种组合,哎,想要更安全就必须牺牲便捷性,这个也不知道谁能想出一个完美兼顾的方法。
onvif主要的功能:
1. 搜索设备,获取设备的信息比如厂家、型号等。
2. 获取设备的多个配置文件信息profile。
3. 获取对应配置文件的视频流地址rtsp,以及分辨率等参数。
4. 云台控制,上下左右移动,焦距放大缩小,相对和绝对移动。
5. 获取预置位信息,触发预置位。
6. 订阅事件,接收设备的各种消息尤其是报警事件比如IO口的报警。
7. 抓图,获取设备当前的图片。
8. 获取、创建、删除用户信息。
9. 获取和设备网络配置信息比如IP地址等。
10. 获取和设置NTP时间同步以及设置设备时间。
11. 获取和设置视频参数和图片参数(亮度、色彩、饱和度)。
12. 重启设备。
onvif的处理流程:
1. 绑定组播IP(239.255.255.250)和端口(3702),发送固定的xml格式的数据搜索设备。
2. 接收到的xml格式的数据解析,得到设备的Onvif地址。
3. 对Onvif地址发送对应的数据,收到数据取出对应的节点数据。
4. 请求Onvif地址获取Media地址和Ptz地址,Media地址用来获取详细的配置文件,Ptz地址用来云台控制。
5. ptz控制是对Ptz地址发送对应的数据即可。
6. 设置了用户认证的需要组织用户token信息一块发送,每次都需要作鉴权处理。
7. 接收到的数据不是标准的xml数据,没法按照正常的节点解析来处理,只能用QXmlQuery来做。
8. 每个厂家设备返回的数据未必完全一致,基本上都不一致,需要进行模糊查找节点值。
9. 特意采用底层协议解析,因为soap太臃肿函数名称太另类,特意做的轻量级的。
10. 两个必备工具,Onvif Device Manager 和 Onvif Device Test Tool。
## 二、功能特点
1. 广播搜索设备,支持IPC和NVR,依次返回,可选择不同的网卡IP。
2. 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。
3. 可对指定的Profile获取视频流Rtsp地址,比如主码流子码流地址。
4. 可对每个设备设置Onvif用户信息,用于认证获取详细信息。
5. 可实时预览摄像机图像。
6. 支持云台控制,可上下左右调节云台,支持绝对移动和相对移动,可放到和缩小图像远近。
7. 支持Qt4和Qt5任意Qt版本,亲测Qt4.7.0到Qt5.14.2。
8. 支持任意编译器,亲测mingw、msvc、gcc、clang。
9. 支持任意操作系统,亲测xp、win7、win10、android、linux、嵌入式linux、树莓派全志H3等。
10. 支持任意Onvif摄像机和NVR,亲测海康、大华、宇视、华为、海思芯片内核等,可定制开发。
11. 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。
12. 支持指定过滤条件过滤搜索设备。
13. 支持搜索间隔设置,保证所有设备搜索回来,在大量设备现场很有用。
14. 可对图片参数(亮度、色彩度、饱和度)进行设置。
15. 支持NTP校时和时间同步设置。
16. 纯Qt编写,超级小巧轻量,总共约2000行代码,不依赖任何第三方的库和组件,跨平台。
17. 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。
18. 工具上提供了收发数据文本框,显示收发的数据,方便查看和分析。
19. 支持所有Onvif设备,代码工整,接口友好,直接引入pri即可使用。
## 三、效果图
## 四、相关站点
1. 国内站点:[
https://gitee.com/feiyangqingyun/QWidgetDemo
](
https://gitee.com/feiyangqingyun/QWidgetDemo
)
2. 国际站点:[
https://github.com/feiyangqingyun/QWidgetDemo
](
https://github.com/feiyangqingyun/QWidgetDemo
)
3. 个人主页:[
https://blog.csdn.net/feiyangqingyun
](
https://blog.csdn.net/feiyangqingyun
)
4. 知乎主页:[
https://www.zhihu.com/people/feiyangqingyun/
](
https://www.zhihu.com/people/feiyangqingyun/
)
5. 体验地址:[
https://blog.csdn.net/feiyangqingyun/article/details/97565652
](
https://blog.csdn.net/feiyangqingyun/article/details/97565652
)
## 五、核心代码
```cpp
OnvifDevice:
eviceInfo *OnvifBase::getDeviceInfo()
{
if (device->deviceUrl.isEmpty()) {
return 0;
}
QString file = device->request->getSendData("GetDeviceInformation");
QByteArray dataSend = file.toUtf8();
QNetworkReply *reply = device->request->auth(device->deviceUrl, dataSend);
emit sendData(dataSend, device->deviceUrl);
OnvifDevice:
eviceInfo *deviceInfo = 0;
QByteArray dataReceive;
bool ok = device->checkData(reply, dataReceive, "获取设备信息");
if (ok) {
OnvifQuery query;
query.setData(dataReceive);
QString wsdl = query.getDeviceWsdl();
QString name_path = QString("//%1:GetDeviceInformationResponse/%1:Manufacturer").arg(wsdl);
QString mod_path = QString("//%1:GetDeviceInformationResponse/%1:Model").arg(wsdl);
QString ver_path = QString("//%1:GetDeviceInformationResponse/%1:FirmwareVersion").arg(wsdl);
QString ser_path = QString("//%1:GetDeviceInformationResponse/%1:SerialNumber").arg(wsdl);
QString hard_path = QString("//%1:GetDeviceInformationResponse/%1:HardwareId").arg(wsdl);
//先将广播搜索到的设备信息一起打包
deviceInfo = new OnvifDevice:
eviceInfo;
deviceInfo->addr = device->deviceInfo.value("addr");
deviceInfo->ip = device->deviceInfo.value("ip");
deviceInfo->name = device->deviceInfo.value("name");
deviceInfo->location = device->deviceInfo.value("location");
deviceInfo->hardware = device->deviceInfo.value("hardware");
deviceInfo->manufacturer = query.getValue(name_path);
deviceInfo->model = query.getValue(mod_path);
deviceInfo->firmwareVersion = query.getValue(ver_path);
deviceInfo->serialNumber = query.getValue(ser_path);
deviceInfo->hardwareId = query.getValue(hard_path);
}
return deviceInfo;
}
```
```xml
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken>%1</wsse:UsernameToken>
</wsse:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl"/>
</s:Body>
</s:Envelope>
```
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
x
回复
使用道具
举报
返回列表
发表新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满)
我知道了