









这个工具我已经做了十几年了,从2014年就开始写。最开始只有搜索功能,后来陆续加了云台控制、预置位、图片参数调节,再后来加了OSD管理,一直不停地迭代,都是为了满足现场用户的实际需求。后面还做了安卓手机版,方便一些用户用手机做简单的调试。
这个工具发布的初衷,其实是给程序员、尤其是Qt开发者用来做二次开发的。但没想到实际用户里超过一半都不是程序员,主要是工程人员,拿来在现场调试设备用。
有人可能会问:既然有ONVIF官方的ODM(ONVIF Device Manager)这个工具,功能也挺强大,为什么还要用你这个?但实际用下来,工程人员对ODM意见挺大:它不支持跨网段搜索,不支持H.265视频显示,云台没有左上角、右下角那种控制方式,也没有OSD管理功能。相比之下,我这个工具是绿色版,双击就能用,基本覆盖了现场调试能遇到的所有情况,所以大家都觉得好用。
最近在写监控设备模拟器的时候,我在调试中发现了一个问题:收发数据的日志之前是打印在文本框里的,虽然有颜色区分、也用换行隔开了,但每个数据包内容都很大、很多,一刷屏就得拖好久的滚动条才能找到想要的数据。而现场调试对收发数据非常敏感,排查问题时经常要翻看这些原始数据。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);
}
//实例化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);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。