-
Notifications
You must be signed in to change notification settings - Fork 0
/
syncdata.cpp
132 lines (116 loc) · 4.26 KB
/
syncdata.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/**
* @file syncdata.cpp
* @author Myth
* @version 1.0
* @date 2021.10.23
*/
#include <QByteArray>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include "syncdata.h"
//数据源链接,数据由其他程序生成
#define DATA_URL "http://node.akashic.cc/data.json"
//每 100ms 更新一次数据
#define UPDATE_INTERVAL 100
SyncData::SyncData(QObject *parent) : QObject(parent)
{
data_manager = new QNetworkAccessManager(this);
//每次请求返回结果后调用槽函数 dataReplyFinished
connect(data_manager, SIGNAL(finished(QNetworkReply *)),
this, SLOT(dataReplyFinished(QNetworkReply *)));
timer = new QTimer(this);
//定时器触发后调用槽函数 updateNodeData
connect(timer, SIGNAL(timeout()),
this, SLOT(updateNodeData()));
timer->start(UPDATE_INTERVAL);
}
/**
* @brief 槽函数:请求新的数据
*/
void SyncData::updateNodeData(void)
{
data_manager->get(QNetworkRequest(QUrl(DATA_URL)));
}
/**
* @brief 槽函数:处理收到的数据
*/
void SyncData::dataReplyFinished(QNetworkReply *reply)
{
QNetworkReply::NetworkError networkerror = reply->error();
if (networkerror == QNetworkReply::NoError)
{
// JSON 解析
QByteArray databuff = reply->readAll();
QString result = QString::fromStdString(databuff.toStdString()).toUtf8();
QJsonDocument document;
QJsonParseError parseerror;
document = QJsonDocument::fromJson(result.toUtf8(), &parseerror);
QString time;
double humi;
double temp;
double light;
if (!document.isNull() && parseerror.error == QJsonParseError::NoError)
{
if (document.isObject())
{
QJsonObject Object = document.object();
if (!Object.isEmpty())
{
if (Object.contains("time"))
{
QJsonValue time_val = Object.value("time");
if (time_val.isString())
{
time = time_val.toString();
emit timeUpdated(time); //信号:时间更新
}
}
//遍历 2 ~ 5 节点数据
for (int seq = 2; seq <= 5; seq++)
{
if (Object.contains("node" + QString::number(seq)))
{
QJsonValue dataObj = Object.value("node" + QString::number(seq));
if (dataObj.isObject())
{
QJsonObject ObjectData = dataObj.toObject();
if (ObjectData.contains("humi"))
{
QJsonValue humi_val = ObjectData.value("humi");
if (humi_val.isDouble())
{
humi = humi_val.toDouble();
}
}
if (ObjectData.contains("temp"))
{
QJsonValue temp_val = ObjectData.value("temp");
if (temp_val.isDouble())
{
temp = temp_val.toDouble();
}
}
if (ObjectData.contains("light"))
{
QJsonValue light_val = ObjectData.value("light");
if (light_val.isDouble())
{
light = light_val.toDouble();
}
}
emit nodeDataUpdated(seq, humi, temp, light); //信号:数据更新
}
}
}
}
}
}
}
}
SyncData::~SyncData()
{
delete data_manager;
delete timer;
}