#ifndef CLOUDCOMM_H
#define CLOUDCOMM_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QVariantMap>
#include <QSharedPointer>
class CloudComm : public QObject
{
Q_OBJECT
public:
explicit CloudComm(QObject *parent = nullptr);
static CloudComm *getInstance();
// 请求下载升级包
void downloadUpgradePack(QString &url);
signals:
// 天气预报情况获取完毕
void weatherInfoReady(QVariantList &weatherInfoList);
// 当天气温获取完毕
void currDayTempRead(QVariantMap &vMap);
public slots:
// 请求天气预报状况
void getWeatherInfo();
// 请求天气预报状况回复
void weatherInfoOnFinished();
// 请求当天气温
void getCurrDayTemp();
// 请求当天气温回复
void currDayTempOnFinished();
private:
QSharedPointer<QNetworkAccessManager> m_netManage;
};
#endif // CLOUDCOMM_H
#include "cloudcomm.h"
#include <QSslConfiguration>
#include <QNetworkReply>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonArray>
#include <QUrlQuery>
#include <QDebug>
#include "weatherinfo.h"
#include "globalsetting.h"
#include "otaupdate.h"
CloudComm::CloudComm(QObject *parent)
: QObject{parent}
{
m_netManage = QSharedPointer<QNetworkAccessManager>(new QNetworkAccessManager);
}
CloudComm *CloudComm::getInstance()
{
static CloudComm instance;
return &instance;
}
void CloudComm::downloadUpgradePack(QString &url)
{
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setPeerVerifyMode(QSslSocket::VerifyNone);
QNetworkRequest req(url);
req.setSslConfiguration(config);
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = m_netManage->get(req);
// 下载文件
connect(reply, &QNetworkReply::readyRead, OtaUpdate::getInstance(), &OtaUpdate::writeFile);
// 下载文件结束
connect(reply, &QNetworkReply::finished, OtaUpdate::getInstance(), &OtaUpdate::downloadFinished);
}
/**********************************************************************
* 功能描述: 请求天气预报状况
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
***********************************************************************/
void CloudComm::getWeatherInfo()
{
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setPeerVerifyMode(QSslSocket::VerifyNone);
QUrl url("https://api.seniverse.com/v3/weather/daily.json");
QUrlQuery query;
query.addQueryItem("key", "SJLG53KFaC_bkFowz");
query.addQueryItem("location", "shenzhen");
query.addQueryItem("language", "en");
if (GlobalSetting::getInstance()->unit()) {
query.addQueryItem("unit", "f");
} else {
query.addQueryItem("unit", "c");
}
query.addQueryItem("start", "0");
query.addQueryItem("days", "5");
url.setQuery(query);
QNetworkRequest req(url);
req.setSslConfiguration(config);
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = m_netManage->get(req);
connect(reply, &QNetworkReply::finished, this, &CloudComm::weatherInfoOnFinished);
}
/**********************************************************************
* 功能描述: 请求当天气温
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
***********************************************************************/
void CloudComm::getCurrDayTemp()
{
QSslConfiguration config = QSslConfiguration::defaultConfiguration();
config.setPeerVerifyMode(QSslSocket::VerifyNone);
QUrl url("https://api.seniverse.com/v3/weather/now.json");
QUrlQuery query;
query.addQueryItem("key", "SJLG53KFaC_bkFowz");
query.addQueryItem("location", "shenzhen");
query.addQueryItem("language", "en");
if (GlobalSetting::getInstance()->unit()) {
query.addQueryItem("unit", "f");
} else {
query.addQueryItem("unit", "c");
}
url.setQuery(query);
QNetworkRequest req(url);
req.setSslConfiguration(config);
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QNetworkReply *reply = m_netManage->get(req);
connect(reply, &QNetworkReply::finished, this, &CloudComm::currDayTempOnFinished);
}
/**********************************************************************
* 功能描述: 请求当天气温回复
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
***********************************************************************/
void CloudComm::currDayTempOnFinished()
{
QNetworkReply *reply = static_cast<QNetworkReply*>(sender());
if (reply->error() == QNetworkReply::NoError) {
if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) {
QByteArray replyByteArray = reply->readAll();
QJsonParseError jsonError;
QJsonDocument jsonDouc = QJsonDocument::fromJson(replyByteArray, &jsonError);
if (jsonDouc.isObject()) {
QJsonObject now = jsonDouc.object().value("results").toArray().at(0).toObject().value("now").toObject();
QVariantMap vMap;
vMap.insert("temperature", now.value("temperature").toString().toInt());
vMap.insert("code", now.value("code").toString().toInt());
emit currDayTempRead(vMap);
}
}
}
reply->deleteLater();
}
/**********************************************************************
* 功能描述: 请求天气预报状况回复
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
***********************************************************************/
void CloudComm::weatherInfoOnFinished()
{
QNetworkReply *reply = static_cast<QNetworkReply*>(sender());
if (reply->error() == QNetworkReply::NoError) {
if(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 200) {
QByteArray replyByteArray = reply->readAll();
QJsonParseError jsonError;
QJsonDocument jsonDouc = QJsonDocument::fromJson(replyByteArray, &jsonError);
if (jsonDouc.isObject()) {
QJsonArray daily = jsonDouc.object().value("results").toArray().at(0).toObject().value("daily").toArray();
QVariantList weatherInfoList;
QVariantMap weatherInfo;
foreach (QJsonValue val, daily) {
QJsonObject obj = val.toObject();
QString date = obj.value("date").toString();
QStringList dateList = date.split('-');
if (dateList.size() >= 3) {
QDate d(dateList[0].toInt(), dateList[1].toInt(), dateList[2].toInt());
int dayOfWeek = d.dayOfWeek();
weatherInfo.insert("dayOfWeek", dayOfWeek);
}
int code_day = obj.value("code_day").toString().toInt();
weatherInfo.insert("code_day", code_day);
int high = obj.value("high").toString().toInt();
weatherInfo.insert("high", high);
int low = obj.value("low").toString().toInt();
weatherInfo.insert("low", low);
int precip = qRound(obj.value("precip").toString().toDouble()*100);
weatherInfo.insert("precip", precip);
int wind_speed = qRound(obj.value("wind_speed").toString().toDouble());
weatherInfo.insert("wind_speed", wind_speed);
int humidity = obj.value("humidity").toString().toInt();
weatherInfo.insert("humidity", humidity);
weatherInfoList.append(weatherInfo);
}
emit weatherInfoReady(weatherInfoList);
}
}
}
reply->deleteLater();
}