欢迎光临外链购买平台,轻松为你获得外链购买的成功案例,友链相关事宜咨询:18978701720,黄经理

外链购买,专注打造匠心好平台

一个好的外链购买,可以为你轻松解决获客难题

Qt编写安防视频监控系统32-onvif信息获取

作者:jcmp      发布时间:2021-04-13      浏览量:0
一、前言 上一篇文章写的是o

一、前言

上一篇文章写的是onvif设备搜索,搜到这些设备以后,第一件事情就是要对设备信息获取一下,比如获取视频流地址,配置套件信息、码流信息、分辨率大小等,这些信息的获取根据具体的需要去获取,也没有必要全部获取,毕竟很可能大部分的信息用不到,按需编码永远都是第一原则,第二原则才是考虑拓展性和稳定性,如果基本的需求都实现不了,那就不是一个真正的软件,考虑再多的拓展性和稳定性都是白搭,说的严重一点就是:所有编程语言都是垃圾,能解决实际需求并变现才是王道!

onvif设备信息的获取需要注意的是,现在市场上绝大部分的摄像机都有密码验证的限定,先不管他默认是admin还是12345,起码有用户验证的机制摆在那,这样相对来说安全很多,不然谁也可以通过onvif协议拿到对应的信息,就没有安全性可言,记得几年前海康爆出了漏洞,导致很多监控摄像头被泄露,为此海康现在的摄像头默认onvif是关闭的,开启以后密码要求各种组合,哎,想要更安全就必须牺牲便捷性,这个也不知道谁能想出一个完美兼顾的方法。

onvif主要的功能

onvif的处理流程

二、功能特点

三、效果图

四、核心代码

OnvifDevice::DeviceInfo *OnvifDevice::getDeviceInfo(){    DeviceInfo *deviceInfo = 0;    QString file = OnvifHelper::getFile(":/send/getDeviceInfo.xml");    file = file.arg(request->getUserToken());    QByteArray dataSend = file.toUtf8();    QNetworkReply *reply = request->auth(deviceUrl, dataSend);    emit sendData(dataSend, deviceUrl);    QByteArray dataReceive;    bool ok = 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 DeviceInfo;        deviceInfo->addr = this->deviceInfo.value("addr");        deviceInfo->ip = this->deviceInfo.value("ip");        deviceInfo->name = this->deviceInfo.value("name");        deviceInfo->location = this->deviceInfo.value("location");        deviceInfo->hardware = this->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;}bool OnvifDevice::getCapabilities(){    QString file = OnvifHelper::getFile(":/send/getCapabilities.xml");    QByteArray dataSend = file.toUtf8();    QNetworkReply *reply = request->post(deviceUrl, dataSend);    emit sendData(dataSend, deviceUrl);    QByteArray dataReceive;    bool ok = checkData(reply, dataReceive, "获取能力文件");    if (ok) {        OnvifQuery query;        query.setData(dataReceive);        QString wsdl = query.getDeviceWsdl();        QString schema = query.getSchema();        QString med_path = QString("//%1:GetCapabilitiesResponse/%1:Capabilities/%2:Media/%2:XAddr").arg(wsdl).arg(schema);        QString ptz_path = QString("//%1:GetCapabilitiesResponse/%1:Capabilities/%2:PTZ/%2:XAddr").arg(wsdl).arg(schema);        mediaUrl = query.getValue(med_path);        ptzUrl = query.getValue(ptz_path);    }    return ok;}bool OnvifDevice::getServices(){    QString file = OnvifHelper::getFile(":/send/getServices.xml");    QByteArray dataSend = file.toUtf8();    QNetworkReply *reply = request->post(deviceUrl, dataSend);    emit sendData(dataSend, deviceUrl);    QByteArray dataReceive;    bool ok = checkData(reply, dataReceive, "获取服务文件");    if (ok) {        OnvifServices services;        services.setData(dataReceive);        mediaUrl = services.getMediaUrl();        ptzUrl = services.getPtzUrl();    }    return ok;}QStringList OnvifDevice::getMedia(){    QStringList tokens;    QString file = OnvifHelper::getFile(":/send/getProfiles.xml");    file = file.arg(request->getUserToken());    QByteArray dataSend = file.toUtf8();    QNetworkReply *reply = request->auth(mediaUrl, dataSend);    emit sendData(dataSend, mediaUrl);    QByteArray dataReceive;    bool ok = checkData(reply, dataReceive, "获取媒体文件");    if (ok) {        OnvifMedia onvifMedia;        onvifMedia.setData(dataReceive);        tokens = onvifMedia.getTokens();        if (tokens.count() > 0) {            profile = tokens.first();        }    }    return tokens;}QString OnvifDevice::getProfile(){    //如果为空则先执行获取一次    if (this->profile.isEmpty()) {        getMedia();    }    return this->profile;}QString OnvifDevice::getRtspUri(const QString &profileToken){    QString file = OnvifHelper::getFile(":/send/getStreamUri.xml");    file = file.arg(request->getUserToken()).arg(profileToken);    QByteArray dataSend = file.toUtf8();    QNetworkReply *reply = request->auth(mediaUrl, dataSend);    emit sendData(dataSend, mediaUrl);    QByteArray dataReceive;    bool ok = checkData(reply, dataReceive, "获取视频地址");    if (ok) {        OnvifQuery query;        query.setData(dataReceive);        rtspUrl = query.getRtspUrl();    }    return rtspUrl;}