#include "chttp_HK.h"
#include <QNetworkReply>
CHTTP::CHTTP(QObject *parent)
: QObject{parent},
m_req(NULL),
m_reply(NULL),
m_manager(NULL)
{
InitHTTP();
}
void CHTTP::InitHTTP()
{
// 设置网络管理器, 并关联回调函数
m_manager = new QNetworkAccessManager();
connect(m_manager,&QNetworkAccessManager::finished,this,&CHTTP::handleResponse);
// 构建HTTP请求
m_req = new QNetworkRequest();
}
void CHTTP::setUserPassward(const QString &user,const QString &Passward)
{
m_AuthInfo_.user = user;
m_AuthInfo_.passward = Passward;
}
void CHTTP::setIPPort(const QString &ip,int port)
{
m_halfurl_ = QString("http://%1:%2").arg(ip).arg(port);
}
void CHTTP::getDeviceInfo()
{
QString uri = QString("%1%2").arg(m_halfurl_).arg(ISAPI_DeviceInfo_);
m_url_ = QUrl(uri);
m_req->setUrl(m_url_);
m_AuthInfo_.uri = ISAPI_DeviceInfo_;
m_AuthInfo_.reqType = request_method::GET;
// 设置请求头的Content-Type (以xml类型为例)
//m_req->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
m_req->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/xml;charset=utf-8"));
/*
// 设置账户密码
QString userPassword = "admin:mission123456";
m_req->setRawHeader("Authorization", "Basic " + userPassword.toLocal8Bit().toBase64());*/
/****************每次都带上摘要认证,省去验证失败再次发送逻辑****************/
//计算摘要
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());
/****************每次都带上摘要认证,省去验证失败再次发送逻辑****************/
// 设置请求体 并 发送请求
m_reply = m_manager->get(*m_req);
// 开启事件监听,直到完成响应
QEventLoop loop;
connect(m_reply, &QNetworkReply::finished, &loop,&QEventLoop::quit);
loop.exec();
}
void CHTTP::getPtzCapabilities()
{
//先获取云台能力
QString uri = QString("%1%2").arg(m_halfurl_).arg(ISAPI_PtzCapabilities_);
m_url_ = QUrl(uri);
m_AuthInfo_.uri = ISAPI_PtzCapabilities_;
m_AuthInfo_.reqType = request_method::GET;
m_req->setUrl(m_url_);
// 设置请求头的Content-Type (以xml类型为例)
//m_req->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
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());
/****************每次都带上摘要认证,省去验证失败再次发送逻辑****************/
// 设置账户密码
//QString userPassword = "admin:mission123456";
//m_req->setRawHeader("Authorization", "Basic " + userPassword.toLocal8Bit().toBase64());
// 设置请求体 并 发送请求
m_reply = m_manager->get(*m_req);
// 开启事件监听,直到完成响应
QEventLoop loop;
connect(m_reply, &QNetworkReply::finished, &loop,&QEventLoop::quit);
loop.exec();
}
void CHTTP::ptzUp()
{
// 设置请求的网址 //认证 PUT /ISAPI/PTZCtrl/channels/1/continuous HTTP/1.1\r\n
QString uri = QString("%1%2").arg(m_halfurl_).arg(ISAPI_PtzControl_);
m_url_ = QUrl(uri);
m_AuthInfo_.uri = ISAPI_PtzControl_;
m_AuthInfo_.reqType = request_method::PUT;
m_ptztype_ = ptztype::Up;
m_req->setUrl(m_url_);
// 设置请求头的Content-Type (以xml类型为例)
//m_req->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
m_req->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/xml;charset=utf-8"));
// 设置账户密码
//QString userPassword = "admin:mission123456";
//m_req->setRawHeader("Authorization", "Basic " + userPassword.toLocal8Bit().toBase64());
/****************每次都带上摘要认证,省去验证失败再次发送逻辑****************/
//计算摘要
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());
/****************每次都带上摘要认证,省去验证失败再次发送逻辑****************/
// 设置请求体 并 发送请求
m_reply = m_manager->put(*m_req,ptzUp_.toStdString().c_str());
// 开启事件监听,直到完成响应
QEventLoop loop2;
connect(m_reply, &QNetworkReply::finished, &loop2,&QEventLoop::quit);
loop2.exec();
}
void CHTTP::ptzDown()
{
// 设置请求的网址 //认证 PUT /ISAPI/PTZCtrl/channels/1/continuous HTTP/1.1\r\n
QString uri = QString("%1%2").arg(m_halfurl_).arg(ISAPI_PtzControl_);
m_url_ = QUrl(uri);
m_AuthInfo_.uri = ISAPI_PtzControl_;
m_AuthInfo_.reqType = request_method::PUT;
m_ptztype_ = ptztype::Down;
m_req->setUrl(m_url_);
// 设置请求头的Content-Type (以json类型为例)
//m_req->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json;charset=utf-8"));
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());
/****************每次都带上摘要认证,省去验证失败再次发送逻辑****************/
// 设置请求体 并 发送请求
m_reply = m_manager->put(*m_req,ptzDown_.toStdString().c_str());
// 开启事件监听,直到完成响应
QEventLoop loop2;
connect(m_reply, &QNetworkReply::finished, &loop2,&QEventLoop::quit);
loop2.exec();
}
void CHTTP::ptzLeft() //云台向左
{
// 设置请求的网址 //认证 PUT /ISAPI/P