Qt HTTP 摘要认证(海康球机摄像机ISAPI开发)

这篇具有很好参考价值的文章主要介绍了Qt HTTP 摘要认证(海康球机摄像机ISAPI开发)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

接到一个需求是开发下海康的球机,控制云台,给到我的是一个开发手册,当然了是海康的私有协议

ISAPI开发手册https://download.csdn.net/download/qq_37059136/88547425关于开发这块读文档就可以理解了,海康使用的是摘要认证,当然了海康已经给出使用范例

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发),http,网络协议,网络

通过libcurl就可以直接连接上海康的球机了.那么是不是就这样了呢,很显然并不是,要是真的就用这种方法怎么能显示出在座的牛逼之处呢,有简单方法我不用,哎,就是玩

关于HTTP的认证方式有很多,应该是4种,basic 跟 Digest 最为常见,别的也不多说了,basic太简单了不提也罢,本文的关键是Digest (摘要)认证,至于摘要认证的发展跟原理这里不做赘述,请善用百度

关于Digest 认证,首先了解下这东西的收发流程:

1.你给服务器发送了一条命令 :get也好 put也好随便什么也好

2.服务器给你返回一个401 未认证错误 以及附带给你将要在摘要认证中需要的参数

3.你拿到服务器返回的参数,根据摘要认证规则算出认证响应值在此发送给服务器

rfc7616 规则https://datatracker.ietf.org/doc/html/rfc7616#section-3.3

4.服务器响应你的操作并返回正确

步骤可参考下图

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发),http,网络协议,网络

那么知道流程了,具体该怎么操作呢,我知道你很急但是你先别急,先来看看这四个流程具体发送了社么报文(通过wireshark抓包)

1.首先客户端发送了一条get指令获取

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发),http,网络协议,网络

2.客户端返回了一个401错误

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发),http,网络协议,网络

这张图的知识点比较多了,主要看下面两个
    WWW-Authenticate: Digest qop="auth", realm="IP Camera(AE424)", nonce="353334613a31313564353336613a06002d080ad3bdce5c80d6282269c72b", stale="FALSE"\r\n

    <!DOCTYPE html>\r\n
    <html><head><title>Document Error: Unauthorized</title></head>\r\n
    <body><h2>Access Error: 401 -- Unauthorized</h2>\r\n
    <p>Authentication Error</p>\r\n
    </body>\r\n
    </html>

首先下面的html告诉你本次get失败了,错误原因是Unauthorized(未经授权)

然后再看上面WWW-Authenticate,这段信息量很大

Digest    认证方式:摘要认证

qop="auth"   保护质量  一般为auth/auth-int或缺失

realm="IP Camera(AE424)"    领域

nonce           服务器随机数

stale   是否过期(上述摘要认证参数是否过期)

这几个参数可以在上面的rfc7616 规则里面通过ctrl+f 查找,看看具体怎么定义这几个参数的,下文中还有几个参数也需要在rfc7616规则中查找

3.计算出认证响应值后再次发送

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发),http,网络协议,网络

可以看到本次发送的消息头里面添加了上次服务器返回的摘要认证参数,以及最重要的response参数

4.认证成功,服务器应答

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发),http,网络协议,网络

好了上面的步骤跟报文都分析结束了,应该可以看出来,第三步发送的参数才是真正的关键点

下面开始讲下如何计算response 参数

首先给出三个公式

Qt HTTP 摘要认证(海康球机摄像机ISAPI开发),http,网络协议,网络

那么先来解答几个关键问题

1. 问:公式里面有算法MD5和MD5-sess,那么摘要认证应该用什么算法呢?

  答:缺省状态下是MD5,而且现在只支持MD5

2.问:怎么理解上述图表?

答:上述图表给出三个东西,分别是 A1,A2,摘要计算(response 参数)

我们要求摘要计算(response 参数),那么得出公式

response=MD5(<A1>:<nonce>:<nc>:<cnonce>:<qop>:<A2>)

已知公式response,还需要知道A1跟A2

再根据图表

A1=MD5(<user>:<realm>:<password>)

A2=MD5(<request-method>:<uri-directive-value>)

那么很显然,只要我们搞定

<user>        用户名

<realm>     领域

<password>  密码

<request-method>    请求方式(get/put/pust等之一)

<uri-directive-value>  uri跳转地址: http://192.168.1.64:80/ISAPI/PTZCtrl/channels/1/continuous 中/ISAPI/PTZCtrl/channels/1/continuous部分就是这里的<uri-directive-value>

<nonce>      服务器随机数

<nc>     客户端计数器 一般为1   十六进制00000001

<cnonce>   客户端随机数

<qop>    保护质量  一般为auth/auth-int或缺失

这几个参数就可以了,当然了还需搞定MD5算法(上述几个参数务必在rfc7616 规则里自行查看含义)

这几个参数中尚未可知的只有 <nc>  <cnonce>

nc 一般就是1 ,cnonce 是随机数,需要客户端生成的

这块的计算代码如下

//计算摘要
QString CHTTP::GetDigestResponse()
{
    //计算A1        A1=MD5(<user>:<realm>:<password>)
    QString StrA1 = QString("%1:%2:%3").arg(m_AuthInfo_.user).arg(m_AuthInfo_.realm).arg(m_AuthInfo_.passward);
    QString MD5_A1 = MD5_hash32(*this,StrA1);
    qDebug() << MD5_A1;

    //计算A2        A2=MD5(<request-method>:<uri-directive-value>)
    QString StrA2 = QString("%1:%2").arg(m_AuthInfo_.requestMethod()).arg(m_AuthInfo_.uri);
    QString MD5_A2 = MD5_hash32(*this,StrA2);
    qDebug() << MD5_A2;

    //计算response  response=MD5(<A1>:<nonce>:<nc>:<cnonce>:<qop>:<A2>)
    char hex[32] = {0};
    snprintf(hex,sizeof(hex),"%08x",m_AuthInfo_.nc);
    QString response = QString("%1:%2:%3:%4:%5:%6").arg(MD5_A1).arg(m_AuthInfo_.nonce).arg(hex).arg(m_AuthInfo_.cnonce).arg(m_AuthInfo_.qop).arg(MD5_A2);
    QString MD5_response = MD5_hash32(*this,response);
    qDebug() << MD5_response;
    return MD5_response;
}

现在有了response ,就可以去发报文了

报文发送如下:

void CHTTP::IdentityAuthentication()   //身份认证
{
    // 设置请求的网址      //认证
    m_req->setUrl(m_url_);
    // 设置请求头的Content-Type (以xml类型为例)
    m_req->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/xml;charset=utf-8"));

    //计算摘要
    QString response = GetDigestResponse();
    //设置通讯头
    char hex[32] = {0};
    snprintf(hex,sizeof(hex),"%08x",m_AuthInfo_.nc);
    QString headstr = QString("username=\"%1\", realm=\"%2\", nonce=\"%3\", uri=\"%4\",response=\"%5\", qop=%6, nc=%7, cnonce=\"%8\"")
                          .arg(m_AuthInfo_.user).arg(m_AuthInfo_.realm).arg(m_AuthInfo_.nonce).arg(m_AuthInfo_.uri)
                          .arg(response).arg(m_AuthInfo_.qop).arg(hex).arg(m_AuthInfo_.cnonce);
    m_req->setRawHeader("Authorization", "Digest " + headstr.toLatin1());

    // 设置请求体 并 发送请求
    if(m_AuthInfo_.reqType == request_method::GET)
        m_reply = m_manager->get(*m_req);
    else if(m_AuthInfo_.reqType == request_method::PUT)
    {
        if(m_ptztype_ == ptztype::Up)
        {
            m_reply = m_manager->put(*m_req,ptzUp_.toStdString().c_str());
        }
        else if(m_ptztype_ == ptztype::Down)
        {
            m_reply = m_manager->put(*m_req,ptzDown_.toStdString().c_str());
        }
        else if(m_ptztype_ == ptztype::Stop)
        {
            m_reply = m_manager->put(*m_req,ptzStop_.toStdString().c_str());
        }
    }
    // 开启事件监听,直到完成响应
    QEventLoop loop;
    connect(m_reply, &QNetworkReply::finished, &loop,&QEventLoop::quit);

    loop.exec();
}

完整项目代码文章来源地址https://www.toymoban.com/news/detail-757208.html

到了这里,关于Qt HTTP 摘要认证(海康球机摄像机ISAPI开发)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python调用海康SDK对接摄像机

    以前做过的项目都是通过 ffmpeg c++ 来捕获摄像机的 RSTP 视频流来处理视频帧,抽空看了一下海康的SDK说明,使用 python ctypes方式实现了对海康SDK DLL的调用, 可以对视频预览、抓图、抽帧、云台控制、布防等任务,SDK使用C++库,速度也很快。如果不要求对视频帧进行实时智能算

    2024年01月16日
    浏览(54)
  • 海康大华监控摄像机接入SkeyeVSS视频融合平台配置详细步骤

    监控摄像机接入SkeyeVSS视频融合平台配置 监控接入准备 一台笔记本电脑 安装海康摄像机调试工具 安装大华摄像机调试工具 硬件调试工具(自备) 监控接入步骤 海康网络摄像机接入步骤: 打开设备网络搜索工具(SADPTool.exe),打开界面如下图所示: 正常情况下,网线接上

    2024年02月15日
    浏览(215)
  • 海康监控摄像机接入NTV GBS GB28181平台实现远程调取监控视频

    海康威视各种型号监控摄像头或硬盘录像机(NVR/HVR)接入NTV GBS GB28181平台配置过程都非常简单明了,但有些细节需要注意,避免走弯路踩泥坑。 1)网络要求 总体来说,只要监控设备和GB28181平台的网络是连通的,设备可以主动访问到平台,就可以顺畅的接入。 由于是设备主动连

    2024年02月08日
    浏览(53)
  • vue对接海康摄像头,使用hk3.3(硬盘录像机)开发摄像头分屏翻页操作。

    默认展示4*4规格,分屏之后自己写翻页方法,对摄像头一一展示(1x1, 2x2, 3x3, 4x4),有俩个场景。 1、刚开始默认展示的时候进行分页。 2、点击分屏操作之后进行分页。 思路: 1、拿到所有的通道号,比如有[1, 2, 3…, 100]; 2、 点击分屏之后就会把这个数组变为 1*1[[1], [

    2024年02月13日
    浏览(71)
  • 海康、大华、tplink监控摄像头和硬盘录像机接入GB28181平台配置细节

    海康、大华、tplink等各种型号监控摄像头或硬盘录像机(NVR/HVR)接入GB28181平台,配置过程都非常简单明了,但有些细节需要注意,避免走弯路踩泥坑。 首先要说明一点的是,只要监控设备和GB28181平台的网络是连通的,都可以顺畅的接入,不需要为监控设备配置外网地址,更不

    2024年02月07日
    浏览(69)
  • vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)

    ffmpeg下载 https://ffmpeg.org/download.html 找ffmpeg-release-essentials.zip点击下载,下载完解压 ffmpeg.exe 程序运行 添加成功后验证是否生效任意地方打开cmd窗口输入 ffmpeg 打印如下表示成功 新建一个app.js文件,同级目录下npm安装 node-rtsp-stream 我是直接写在项目里了,你们可以单独写在外

    2024年04月25日
    浏览(55)
  • 基于海康Ehome/ISUP接入到LiveNVR实现海康摄像头、录像机视频统一汇聚,做到物联网无插件直播回放和控制

    LiveNVR基础配置 海康 ISUP 接入配置 ,填写相关信息 服务 IP (设备可以访问到的IP) 服务端口 接入密码 (ISUP接入时要填此密码) 填写上 1、海康 ISUP 接入配置 中配置的相关信息,设备ID( 自定义不要重复 ) 填写上 1、海康 ISUP 接入配置 中配置的相关信息,设备ID( 自定义

    2024年02月08日
    浏览(76)
  • HTTP和RTSP和RTMP网络摄像机的区别

    共同点: 1:RTSP RTMP HTTP都是在应用应用层。 2: 理论上RTSP RTMPHTTP都可以做直播和点播,但一般做直播用RTSP RTMP,做点播用HTTP。做视频会议的时候原来用SIP协议,现在基本上被RTMP协议取代了。 区别: 1:HTTP: 即超文本传送协议(ftp即文件传输协议)。 HTTP:(Real Time Streaming Prot

    2024年02月09日
    浏览(42)
  • 海康网络摄像机与电脑交互,有网络和无网络两种方式读取URL视频流,以及无网络情况下配置IP地址

    目录 (1)准备工具: (2)通过WiFi的接口连接 (3)无网络情况下进行交互 (4)海康官方软件 (5)RTSP视频流 a)RTSP: b)视频流:  c)rtsp流地址 电脑(台式或笔记本) 网线(普通网线即可) POE海康网络摄像机(不需要电源线) 非POE海康网络摄像机(需要电源线) POE名

    2024年02月04日
    浏览(262)
  • LiveGBS流媒体平台GB/T28181功能-海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

    询问厂家是否要设置定向IP,自带物联网卡的设备,网络需要定向IP 海康部分设备萤石云和GB28181不能同时开启,关闭设备的萤石云注册,单独启用GB28181注册。 系统自身的防火墙是否开启,开启后可以尝试关闭试试。如果服务器外面还有物理防火墙,系统本身的防火墙可以关

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包