代码:linux C环境的服务器将客户端采集的SQLite智能家居状态表中的温度、湿度数据制成折线图传送Qt C++环境下的客户端客户端接收后显示在GUI上。
以下是一个简单的示例代码,展示了如何在Linux C环境的服务器中采集SQLite智能家居状态表中的温度、湿度数据,并将其制成折线图传送到Qt C++环境下的客户端并显示在GUI上。
服务器端代码(Linux C环境):
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
// 回调函数,用于处理查询结果
int callback(void *data, int argc, char **argv, char **azColName){
int i;
for(i = 0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(){
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
// 创建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0){
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))){
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
// 绑定socket到指定地址和端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0){
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, 3) < 0){
perror("listen");
exit(EXIT_FAILURE);
}
// 接受新连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0){
perror("accept");
exit(EXIT_FAILURE);
}
// 连接SQLite数据库
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("smart_home.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}else{
fprintf(stdout, "Opened database successfully\n");
}
// 查询温度和湿度数据
char *sql = "SELECT temperature, humidity FROM smart_home_status;";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout, "Operation done successfully\n");
}
sqlite3_close(db);
close(new_socket);
return 0;
}
客户端代码(Qt C++环境):
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
QT_CHARTS_USE_NAMESPACE
int main(int argc, char *argv[])
{
// 创建Qt应用程序
QApplication app(argc, argv);
// 创建主窗口
QMainWindow window;
window.setWindowTitle("Smart Home Status");
window.resize(800, 600);
// 创建折线图
QChartView *chartView = new QChartView(&window);
QChart *chart = new QChart();
chart->setTitle("Temperature and Humidity");
chartView->setChart(chart);
chartView->setRenderHint(QPainter::Antialiasing);
// 创建温度和湿度数据系列
QLineSeries *temperatureSeries = new QLineSeries();
temperatureSeries->setName("Temperature");
QLineSeries *humiditySeries = new QLineSeries();
humiditySeries->setName("Humidity");
// 添加数据到系列
temperatureSeries->append(0, 20);
temperatureSeries->append(1, 22);
temperatureSeries->append(2, 25);
humiditySeries->append(0, 50);
humiditySeries->append(1, 55);
humiditySeries->append(2, 60);
// 将系列添加到折线图中
chart->addSeries(temperatureSeries);
chart->addSeries(humiditySeries);
// 创建X轴和Y轴
QValueAxis *axisX = new QValueAxis();
axisX->setTitleText("Time");
axisX->setLabelFormat("%i");
axisX->setTickCount(3);
chart->addAxis(axisX, Qt::AlignBottom);
temperatureSeries->attachAxis(axisX);
humiditySeries->attachAxis(axisX);
QValueAxis *axisY = new QValueAxis();
axisY->setTitleText("Value");
axisY->setLabelFormat("%i");
axisY->setTickCount(5);
chart->addAxis(axisY, Qt::AlignLeft);
temperatureSeries->attachAxis(axisY);
humiditySeries->attachAxis(axisY);
// 显示主窗口
window.setCentralWidget(chartView);
window.show();
// 运行Qt应用程序
return app.exec();
}
注意:以上示例代码仅为演示用途,实际使用时需要根据具体情况进行修改和完善。另外,服务器端的代码中仅查询了数据并打印,需要将数据传送到客户端的代码部分需要根据实际情况进行编写
原文地址: http://www.cveoy.top/t/topic/ivqx 著作权归作者所有。请勿转载和采集!