以下是一个简单的示例代码,展示了如何在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();
}

注意:以上示例代码仅为演示用途,实际使用时需要根据具体情况进行修改和完善。另外,服务器端的代码中仅查询了数据并打印,需要将数据传送到客户端的代码部分需要根据实际情况进行编写

代码:linux C环境的服务器将客户端采集的SQLite智能家居状态表中的温度、湿度数据制成折线图传送Qt C++环境下的客户端客户端接收后显示在GUI上。

原文地址: http://www.cveoy.top/t/topic/ivqx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录