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++
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;
|
|
}
|
|
|