自学内容网 自学内容网

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C++库。
先发现相机。

配置

lib目录
在这里插入图片描述包含
在这里插入图片描述在这里插入图片描述编译提示缺的文件,到libonvif里面拷贝过来。

在这里插入图片描述在这里插入图片描述在这里插入图片描述改UDP端口
在这里插入图片描述

代码

使用msvc 2022的向导生成空项目,从项目的main示例拷贝过来。

CameraOnvif.h

#pragma once

#include <QObject>
#include <QUrl>

#include "Response.h"
#include "SoapHelper.h"
#include "OnvifDevice.h"
#include "OnvifDiscovery.h"

class CameraOnvif : public QObject
{
QOBJECT_H

public:
CameraOnvif(QObject* parent = nullptr);
~CameraOnvif();

QObject* _parent;

};

CameraOnvif.cpp

#include "CameraOnvif.h"

CameraOnvif::CameraOnvif(QObject* parent)
{
_parent = parent;

auto cb = SoapCtx::Builder();
cb.SetSendTimeout(1000);
cb.SetReceiveTimeout(2000);
auto discovery = new OnvifDiscoveryClient(QUrl("soap.udp://239.255.255.250:3702"), cb.Build(), _parent);
ProbeTypeRequest request;
request.Types = (char*)"tds:Device";
auto uuidOne = QString("uuid:%1").arg(SoapHelper::GenerateUuid());
auto probeResponseTwo = discovery->Probe(request, uuidOne);
request.Types = (char*)"tdn:NetworkVideoTransmitter";
auto uuidTwo = QString("uuid:%1").arg(SoapHelper::GenerateUuid());
auto probeResponseOne = discovery->Probe(request, uuidTwo);

if (probeResponseOne && probeResponseTwo) {
auto foundMatches = 0;
auto matchResp = discovery->ReceiveProbeMatches();

if (matchResp && matchResp.GetResultObject()) {
auto relatesTo = matchResp.GetSoapHeaderRelatesTo();
if (!relatesTo.isNull() && (uuidOne.compare(relatesTo) == 0 || uuidTwo.compare(relatesTo) == 0)) {
if (auto matchs = matchResp.GetResultObject()) {
if (matchs->wsdd__ProbeMatches) {
for (auto i = 0; i < matchs->wsdd__ProbeMatches->__sizeProbeMatch; ++i) {
wsdd__ProbeMatchesType match = matchs->wsdd__ProbeMatches[i];
for (auto ii = 0; ii < match.__sizeProbeMatch; ++ii) {
foundMatches++;
auto probe = match.ProbeMatch[ii];
qDebug() << "Found match:" << "    Type:" << probe.Types << " Endpoint:" << probe.XAddrs;
if (probe.wsa5__EndpointReference.Address) {
qDebug() << "     Reference:" << probe.wsa5__EndpointReference.Address;
}
if (probe.Scopes) {
auto scopeList = QString::fromLocal8Bit(probe.Scopes->__item).split(' ');
auto matchBy = QString::fromLocal8Bit(probe.Scopes->MatchBy);
if (!matchBy.isEmpty()) {
qDebug() << "    Match:" << matchBy;
}
qDebug() << "    Scope:";
for (auto scope : scopeList) {
if (!scope.isEmpty()) qDebug() << "        " << scope;
}
}
}
}
}
}
}
else {
qDebug() << "Skipping non related message with id:" << relatesTo;
}
}
}
else {
qCritical() << "nothing";
}
}

CameraOnvif::~CameraOnvif()
{
}

调用类。

#include "camera_onvif.h"

camera_onvif::camera_onvif(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    auto camera = new CameraOnvif(this);
}

camera_onvif::~camera_onvif()
{}

结果

Found match: Type: “http://www.onvif.org/ver10/network/wsdl”:NetworkVideoTransmitter tds:Device Endpoint: http://192.168.1.109/onvif/device_service
Reference: uuid:42164801-9662-9563-32ba-33e24ea19662
Scope:
“onvif://www.onvif.org/location/country/china”
“onvif://www.onvif.org/name/Dahua”
“onvif://www.onvif.org/hardware/DH-IPC-HFW3237M-I2”
“onvif://www.onvif.org/Profile/Streaming”
“onvif://www.onvif.org/type/Network_Video_Transmitter”
“onvif://www.onvif.org/extension/unique_identifier/0”
“onvif://www.onvif.org/Profile/T”


原文地址:https://blog.csdn.net/fengyu09/article/details/145284656

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!