坚持古法编程有意义吗/纯手搓代码/监控Onvif调试神器

一、前言说明

这个工具我已经做了十几年了,从2014年就开始写。最开始只有搜索功能,后来陆续加了云台控制、预置位、图片参数调节,再后来加了OSD管理,一直不停地迭代,都是为了满足现场用户的实际需求。后面还做了安卓手机版,方便一些用户用手机做简单的调试。
这个工具发布的初衷,其实是给程序员、尤其是Qt开发者用来做二次开发的。但没想到实际用户里超过一半都不是程序员,主要是工程人员,拿来在现场调试设备用。

有人可能会问:既然有ONVIF官方的ODM(ONVIF Device Manager)这个工具,功能也挺强大,为什么还要用你这个?但实际用下来,工程人员对ODM意见挺大:它不支持跨网段搜索,不支持H.265视频显示,云台没有左上角、右下角那种控制方式,也没有OSD管理功能。相比之下,我这个工具是绿色版,双击就能用,基本覆盖了现场调试能遇到的所有情况,所以大家都觉得好用。

最近在写监控设备模拟器的时候,我在调试中发现了一个问题:收发数据的日志之前是打印在文本框里的,虽然有颜色区分、也用换行隔开了,但每个数据包内容都很大、很多,一刷屏就得拖好久的滚动条才能找到想要的数据。而现场调试对收发数据非常敏感,排查问题时经常要翻看这些原始数据。ONVIF基本是一问一答,发一个请求就对应一个应答。于是我就把日志改成了表格形式,用收发关键字对应展示,想看具体内容就双击那一条,会弹窗显示详细数据。这样定位数据包就非常快、非常直观了。

二、效果图

Snipaste_2026-08-09_15-46-55

三、相关地址

  1. 国内站点:https://gitee.com/feiyangqingyun
  2. 国际站点:https://github.com/feiyangqingyun
  3. 个人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 文件名:bin_video_onvif

四、功能特点

  1. 一键广播搜索设备,同时支持IPC和NVR等各种onvif设备,依次排队返回。
  2. 可选择不同的网卡搜索,支持跨网段组播搜索。
  3. 依次获取Onvif地址、Media地址、Profile文件、Rtsp地址等信息。
  4. 可对指定的Profile获取视频流Rtsp地址,比如主码流地址、子码流地址。
  5. 可对每个设备设置Onvif用户信息,用于鉴权认证获取详细信息。
  6. 可实时预览通道画面图像,支持视频录制到本地,支持硬解码显示。
  7. 支持云台控制,可上下左右和左上角等八个方位调节云台,支持绝对移动、相对移动、连续移动三种方式,支持变倍和聚焦控制。
  8. 支持获取预置位信息、调用预置位、添加预置位、删除预置位等。
  9. 支持图片参数设置,包括亮度、对比度、饱和度、锐度等。
  10. 支持各种事件订阅,包括入侵报警、越界报警、遮挡报警等。
  11. 支持onvif协议抓图,返回对应的抓拍图片。
  12. 支持获取和设置NTP校时,获取和设置时间。
  13. 支持OSD相关操作,可以增删改查OSD信息,可以调整OSD的位置以及设置颜色。
  14. 可对设备进行重启、网络参数获取和设置等操作。
  15. 支持对指定IP地址及onvif地址进行单播搜索,比如跨网段情况下非常有用。
  16. 支持指定过滤条件过滤搜索设备,比如只搜索某个网段的设备或者针对某个地址的设备。
  17. 支持搜索间隔和搜索策略设置,保证所有设备搜索回来,在大量设备现场很有用,亲测上千个摄像机现场,搜索回来的设备数量,比摄像机厂家自带搜索工具还要准确。
  18. 内置了线程实时执行Onvif指令队列,排队最大速度的执行对应的指令,执行结果信号发出。
  19. 采用的最底层的TCP+UDP通信机制,原创最底层协议解析,纯QWidget编写。
  20. 超级小巧轻量,总共约3000行代码,不依赖任何第三方的库和组件,跨平台。
  21. 封装好了通用的数据发送和接收解析的函数,可以非常方便的自行拓展其他Onvif处理。
  22. 表格形式显示收发数据,有关键字和不同颜色显示,双击显示详细数据,非常方便现场调试。
  23. 支持所有Onvif设备,亲测海康、大华、宇视、天地伟业、华为、海思等,可定制开发。。
  24. 代码结构框架非常清晰,注释详细,代码精简不繁琐,非常易于学习和移植,可以很容易拓展其他接口需求。
  25. 支持Qt4/Qt5/Qt6以及后续所有版本、所有编译器、所有开发环境。
  26. 支持windows、linux、mac、安卓、国产OS、嵌入式linux、RK3588、树莓派、香橙派等系统。

五、代码使用

  1. 第一步:拷贝onvif组件源码即core_onvif整个目录到你的项目,放到同级目录。
  2. 第二步:在项目pro文件中引入组件 include ($$PWD/../core_onvif/core_onvif.pri)。
  3. 第三步:代码文件引入头文件 #include "onvifsearch.h" #include "onvifdevice.h",其中onvifsearch用于搜索设备,onvifdevice用于获取设备的详细信息比如rtsp视频流地址。
  4. 第四步:组播或者单播搜索设备,获取到对应的onvif地址。每个设备都有一个唯一的onvif地址。
//实例化搜索对象并关联信号槽
OnvifSearch *search = new OnvifSearch(this);
connect(search, SIGNAL(receiveDevice(OnvifDeviceInfo)), this, SLOT(receiveDevice(OnvifDeviceInfo)));
//参数1是网卡地址/参数2指定地址则表示单播
search->search("192.168.0.110", "");

void frmSimple::receiveDevice(const OnvifDeviceInfo &deviceInfo)
{
    QString msg = QString("收到设备: %1").arg(deviceInfo.onvifAddr);
    ui->textEdit->append(msg);

    QListWidgetItem *item = new QListWidgetItem;
    item->setText(deviceInfo.deviceIp);
    item->setData(Qt::UserRole, deviceInfo.onvifAddr);
    ui->listWidget->addItem(item);
}
  1. 第五步:对指定的onvif地址发送http请求,获取详细信息。
//实例化onvif对象实例
OnvifDevice *device = new OnvifDevice(this);
//设置用户信息用于请求的时候认证用
device->setUserInfo("admin", "123456");
//设置请求地址
device->setOnvifAddr("http://192.168.0.64/onvif/device_service");

//先获取服务文件
device->getServices();
//可能为空需要按照另一种方式获取
if (device->getMediaUrl().isEmpty()) {
    device->getCapabilities();
}

//获取配置文件
QList<OnvifProfileInfo> profiles = device->getProfiles();
foreach (OnvifProfileInfo profile, profiles) {
    ui->cboxProfiles->addItem(profile.token);
}

//对指定的配置文件获取视频地址
QString token = ui->cboxProfiles->currentText();
QString url = device->getStreamUri(token);
ui->txtStreamUri->setText(url);
  1. 特别提示:可以在main.cpp中注释//frmMain w;打开frmSimple w;用来开启直接运行简单示例。
posted @ 2026-09-16 11:29  飞扬青云  阅读(25)  评论(0)    收藏  举报