You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

418 lines
13 KiB
C++

#include "mynetmanager.h"
#include <QUrl>
#include <QByteArray>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
#include <iostream>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QIODevice>
#include <QIODevice>
#include <QDataStream>
#include <QTimer>
#include <QDir>
using namespace std;
MyNetManager::MyNetManager(QObject *parent): QObject(parent){
m_pManager = new QNetworkAccessManager(this);
keep = nullptr;
keepNetState = NET_DISCONNECT;
keepTimer = new QTimer(this);
connect(m_pManager, &QNetworkAccessManager::finished,this,
&MyNetManager::onKeepConnectFinished);
}
MyNetManager::~MyNetManager()
{
}
void MyNetManager::SetIp(QString ip)
{
qDebug() << QString("SetIp : %1\n").arg(ip);
this->ip = ip;
}
bool MyNetManager::SetTempraturePara(uint16_t reflectiveTemperature, float emissivity, uint16_t distance)
{
char buff[1024];
qDebug() << QString("SetTempraturePara : reflectiveTemperature:%1, emissivity:%2, distance:%3\n")
.arg(reflectiveTemperature).arg(emissivity).arg(distance);
sprintf(buff, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
<PixelToPixelParam version=\"2.0\" xmlns=\"http://www.hikvision.com/ver20/XMLSchema\">\
<id>2</id>\
<maxFrameRate>400</maxFrameRate>\
<reflectiveEnable>false</reflectiveEnable>\
<reflectiveTemperature>%d</reflectiveTemperature>\
<emissivity>%f</emissivity>\
<distance>%d</distance>\
<refreshInterval>80</refreshInterval>\
<distanceUnit>centimeter</distanceUnit>\
<temperatureDataLength>4</temperatureDataLength>\
<JpegPictureWithAppendData>\
<jpegPicEnabled>true</jpegPicEnabled>\
<visiblePicEnabled>true</visiblePicEnabled>\
<rulesOverlayEnable>false</rulesOverlayEnable>\
<visiblePicResolution>800*600</visiblePicResolution>\
<thermalPicResolution>160*120</thermalPicResolution>\
</JpegPictureWithAppendData>\
</PixelToPixelParam>",
reflectiveTemperature,emissivity,distance);
QByteArray array = QByteArray(buff);
bool rtn = putWait(ip + "/ISAPI/Thermal/channels/2/thermometry/pixelToPixelParam", array);
qDebug()<< "SetTempraturePara rtn =" << rtn << endl;
return rtn;
}
bool MyNetManager::SetAlarmPara(uint16_t alert, uint16_t alarm, uint16_t alarm_time)
{
char buff[4096];
qDebug() << QString("SetAlarmPara : alarm:%1, emissivity:%2, alarm_time:%3\n")
.arg(alert).arg(alarm).arg(alarm_time);
sprintf(buff, R"(<?xml version="1.0" encoding="UTF-8"?>
<ThermometryBasicParam version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<id>2</id>
<enabled>true</enabled>
<streamOverlay>true</streamOverlay>
<pictureOverlay>false</pictureOverlay>
<temperatureRange>0~550</temperatureRange>
<temperatureUnit>degreeCentigrade</temperatureUnit>
<emissivity>0.95</emissivity>
<distanceUnit>centimeter</distanceUnit>
<specialPointThermType>centerPoint</specialPointThermType>
<distance>20</distance>
<reflectiveEnable>false</reflectiveEnable>
<alert>%d</alert>
<alarm>%d</alarm>
<showTempStripEnable>true</showTempStripEnable>
<thermalOpticalTransmittance>1.000</thermalOpticalTransmittance>
<externalOpticsWindowCorrection>20.0</externalOpticsWindowCorrection>
<AlertOutputIOPortList>
<OutputIOPort>
<portID>1</portID>
<enabled>false</enabled>
</OutputIOPort>
</AlertOutputIOPortList>
<AlarmOutputIOPortList>
<OutputIOPort>
<portID>1</portID>
<enabled>false</enabled>
</OutputIOPort>
</AlarmOutputIOPortList>
<alertFilteringTime>0</alertFilteringTime>
<alarmFilteringTime>0</alarmFilteringTime>
<displayMaxTemperatureEnabled>true</displayMaxTemperatureEnabled>
<displayMinTemperatureEnabled>false</displayMinTemperatureEnabled>
<displayAverageTemperatureEnabled>false</displayAverageTemperatureEnabled>
<thermometryInfoDisplayposition>rules_around</thermometryInfoDisplayposition>
<calibrationCoefficientEnabled>false</calibrationCoefficientEnabled>
<displayTemperatureInOpticalChannelEnabled>false</displayTemperatureInOpticalChannelEnabled>
<calibrationFileVersion>V1.0.6.0 build201231</calibrationFileVersion>
<alarmInterval>%d</alarmInterval>
<rulesOverlayMode>alarm</rulesOverlayMode>
<alarmMode>alarm_alert</alarmMode>
<NormalRulesColor>
<R>0</R>
<G>255</G>
<B>0</B>
</NormalRulesColor>
</ThermometryBasicParam>)",
alert,alarm,alarm_time);
QByteArray array = QByteArray(buff);
bool rtn = putWait(ip + "/ISAPI/Thermal/channels/2/thermometry/basicParam", array);
qDebug()<< "SetAlarmPara rtn =" << rtn << endl;
return rtn;
}
bool MyNetManager::GetPicture()
{
qDebug() << QString("GetPicture")<< endl;
QNetworkRequest request;
QUrl qurl = QUrl(ip + "/ISAPI/Streaming/channels/2/picture");
qurl.setUserName("admin");
qurl.setPassword("YN123456789");
request.setRawHeader("Connection","Keep-Alive");
request.setUrl(qurl);
QNetworkReply *reply = m_pManager->get(request);
connect(reply,&QNetworkReply::finished,this,&MyNetManager::onCapPicRelyfinished);
return true;
}
//23.8.14
bool MyNetManager::GetRealTimeTemperature()
{
qDebug() << QString("GetRealTimeTemperature")<< endl;
QNetworkRequest request;
QUrl qurl = QUrl(ip + "/ISAPI/Thermal/channels/2/thermometry/1/rulesTemperatureInfo?format=json");
qurl.setUserName("admin");
qurl.setPassword("YN123456789");
request.setRawHeader("Connection","Keep-Alive");
request.setUrl(qurl);
QNetworkReply *reply = m_pManager->get(request);
connect(reply,&QNetworkReply::finished,this,&MyNetManager::onGetTemperatureRelyfinished);
return true;
}
bool MyNetManager::KeepConnect()
{
qDebug() << QString("KeepConnect");
QNetworkRequest request;
QUrl qurl = QUrl(ip + "/ISAPI/Event/notification/alertStream");
qurl.setUserName("admin");
qurl.setPassword("YN123456789");
request.setRawHeader("Connection","Keep-Alive");
request.setUrl(qurl);
QNetworkReply* reply = m_pManager->get(request);
connect(reply,SIGNAL(readyRead()),this,SLOT(onKeepRelyfinished()));
connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError)>(&QNetworkReply::error),
[=](QNetworkReply::NetworkError e){
qDebug() << QString("onKeepConnectErr: %1\n").arg(e);
emit sigKeepBrokeAlarm();
KeepDisconnect();
});
keep = reply;
qDebug() << "keep:" << keep;
//启动倒计数15秒
disconnect(keepTimer,0,0,0);
connect(keepTimer, &QTimer::timeout, this, &MyNetManager::onKeepConnectTimeOut);
keepTimer->start(connect_over_time_seconds);
keepNetState = NET_CONNECTING;
qDebug() << "KeepConnect start...\n";
return true;
}
bool MyNetManager::KeepDisconnect()
{
qDebug() << QString("KeepDisconnect\n");
//m_pManager->clearConnectionCache();
m_pManager->clearAccessCache();
keepNetState = NET_DISCONNECT;
keepTimer->stop();
disconnect(keepTimer,0,0,0);
if(keep == nullptr){
return true;
}
//qDebug() << QString("disconnect\n");
disconnect(keep,0,0,0);
/*
if(keep->isRunning()){
qDebug()<< "keepRelayErrProcess keep->isRunning() true" << endl;
}else{
qDebug()<< "keepRelayErrProcess keep->isRunning() false" << endl;
}
qDebug() << QString("keep->close()\n");
keep->close();
qDebug() << QString("keep->abort()\n");
keep->abort();
*/
qDebug() << QString("keep->deleteLater()\n");
keep->deleteLater();
//keep = nullptr;
return true;
}
bool MyNetManager::KeepReconnect()
{
qDebug() << QString("KeepReconnect\n");
KeepDisconnect();
KeepConnect();
return true;
}
NetState MyNetManager::KeepState()
{
return keepNetState;
}
void MyNetManager::onKeepRelyfinished()
{
QNetworkReply* reply = (QNetworkReply*)sender();
if(reply->error() == QNetworkReply::NoError){
qDebug() << QString("onKeepRelyfinished\n");
keepRelayOkProcess(reply);
}else{
qDebug()<< "!!!!!! onKeepRelyfinished err:"<<reply->errorString()<<endl;
keepRelayErrProcess(reply);
}
}
void MyNetManager::onCapPicRelyfinished()
{
qDebug("onCapPicRelyfinished\n");
QDateTime dateTime;
dateTime = QDateTime::currentDateTime();
QString currentdatetime = dateTime.toString("yyyy_MM_dd hh_mm_ss");
QNetworkReply* reply = (QNetworkReply*)sender();
if(reply->error() == QNetworkReply::NoError){
qDebug() << QString("onCapPicRelyfinished")<<endl;;
capPicData = reply->readAll();
emit sigCapPicture(capPicData);
}else{
qDebug()<< "onCapPicRelyfinished err: " << reply->errorString()<<endl;
}
reply->close();
reply->deleteLater();
}
//23.8.14
//获取实时温度,解析数据方法未写
void MyNetManager::onGetTemperatureRelyfinished()
{
qDebug() << "获取到实时温度!";
QDateTime dateTime;
dateTime = QDateTime::currentDateTime();
QString currentdatetime = dateTime.toString("yyyy_MM_dd hh_mm_ss");
QNetworkReply* reply = (QNetworkReply*)sender();
if(reply->error() == QNetworkReply::NoError){
qDebug() << QString("onGetTemperatureRelyfinished")<<endl;;
responseData = reply->readAll();
emit sigGetTemperature(responseData);
}else{
qDebug()<< "onGetTemperatureRelyfinished: " << reply->errorString()<<endl;
}
reply->close();
reply->deleteLater();
}
bool MyNetManager::putWait(QString url, QByteArray &bytes)
{
QNetworkRequest request;
QUrl qurl = QUrl(url);
qurl.setUserName("admin");
qurl.setPassword("YN123456789");
request.setUrl(qurl);
request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
QNetworkReply *reply = m_pManager->put(request, bytes);
QEventLoop eventLoop;
connect(reply, &QNetworkReply ::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec();
if(reply->error()!=QNetworkReply::NoError){
//处理中的错误信息
qDebug()<<"reply error:"<<reply->errorString()<<endl;;
return false;
}
reply->deleteLater();
return true;
}
void MyNetManager::keepRelayOkProcess(QNetworkReply *reply)
{
qDebug() << "reply :" << reply << endl;
if(keepNetState == NET_CONNECTING){
keepNetState = NET_CONNECTED;
qDebug() << "keepRelayOkProcess State == NET_CONNECTING\n" << endl;
qDebug()<<"operation:"<<reply->operation();
qDebug()<<"status code:"<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
qDebug()<<"reply:"<<reply<< endl;
connect_over_time_seconds = 15000;
disconnect(keepTimer,0,0,0);
connect(keepTimer, &QTimer::timeout, this, &MyNetManager::onKeepTimerOverProcess);
keepTimer->start(11000);
qDebug() << "KeepConnect ok\n";
}else if(keepNetState == NET_CONNECTED){
qDebug() << "keepRelayOkProcess State == NET_CONNECTED\n";
qDebug()<<"reply:"<<reply<< endl;
keepTimer->start(11000);
QByteArray bytes = reply->readAll();
//qDebug() << "recv:" << bytes << endl;
QString qstr_byte = qPrintable(bytes);
if (qstr_byte.contains("Temperature Measurement Alarm"))
{
emit sigTempAlarm(1);
qDebug() << "Temperature Measurement Alarm1\n";
}else{
qDebug() << "recv heart beat!\n";
}
}
}
void MyNetManager::keepRelayErrProcess(QNetworkReply *reply)
{
Q_UNUSED(reply);
qDebug() << QString("keepRelayErrProcess\n");
//当前处于连接状态,出错,需要告警
if(keepNetState == NET_CONNECTED){
emit sigKeepBrokeAlarm();
}
KeepDisconnect();
}
void MyNetManager::onKeepTimerOverProcess()
{
qDebug() << "onKeepTimerOverProcess\n";
//连接失败, 或者连接超时未接收到任何数据,告警
emit sigKeepBrokeAlarm();
KeepDisconnect();
}
static uint32_t time_add(uint32_t t)
{
float val = t * 1.5;
return (uint32_t)val;
}
void MyNetManager::onKeepConnectTimeOut()
{
qDebug() << "onKeepConnectTimeOut\n";
connect_over_time_seconds = time_add(connect_over_time_seconds) ;
emit sigKeepBrokeAlarm();
KeepDisconnect();
}
void MyNetManager::onKeepConnectFinished(QNetworkReply *reply)
{
qDebug() << ">>onKeepConnectFinished:" << reply << endl;
}