以下是一个示例代码,展示了如何在Linux C环境的服务器中将SQLite智能家居状态表中的温度、湿度数据制成直线图,并传送到Qt C++环境下的客户端,客户端接收后显示在GUI上。

服务器端(Linux C环境):

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

#define DB_PATH "/path/to/database.db"
#define PORT 5000

typedef struct {
    double temperature;
    double humidity;
} SensorData;

void send_data(int client_socket, SensorData data) {
    char buffer[256];
    sprintf(buffer, "%f,%f", data.temperature, data.humidity);
    send(client_socket, buffer, strlen(buffer), 0);
}

static int callback(void *data, int argc, char **argv, char **az_col_name){
    SensorData *sensor_data = (SensorData *)data;
    sensor_data->temperature = atof(argv[0]);
    sensor_data->humidity = atof(argv[1]);
    return 0;
}

int main() {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    char *sql;
    SensorData sensor_data;

    // Open database
    rc = sqlite3_open(DB_PATH, &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return rc;
    }

    // Create server socket
    int server_socket, client_socket;
    struct sockaddr_in server_address, client_address;
    int address_length = sizeof(server_address);

    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket == -1) {
        perror("Socket creation failed");
        return -1;
    }

    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(PORT);
    server_address.sin_addr.s_addr = INADDR_ANY;

    // Bind the socket to the specified IP and port
    if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
        perror("Bind failed");
        return -1;
    }

    // Listen for incoming connections
    if (listen(server_socket, 1) < 0) {
        perror("Listen failed");
        return -1;
    }

    printf("Server listening on port %d...\n", PORT);

    // Accept the connection from the client
    client_socket = accept(server_socket, (struct sockaddr *)&client_address, (socklen_t *)&address_length);
    if (client_socket < 0) {
        perror("Accept failed");
        return -1;
    }

    // Query the database for sensor data and send it to the client
    while (1) {
        sql = "SELECT temperature, humidity FROM sensor_data ORDER BY timestamp DESC LIMIT 1";
        rc = sqlite3_exec(db, sql, callback, (void *)&sensor_data, &zErrMsg);
        if (rc != SQLITE_OK) {
            fprintf(stderr, "SQL error: %s\n", zErrMsg);
            sqlite3_free(zErrMsg);
        }

        send_data(client_socket, sensor_data);
        sleep(1); // Delay for 1 second before sending the next data
    }

    // Close the socket and database connection
    close(client_socket);
    close(server_socket);
    sqlite3_close(db);

    return 0;
}

客户端(Qt C++环境):

#include <QtWidgets>
#include <QtNetwork>

class Client : public QWidget {
    Q_OBJECT

public:
    Client(QWidget *parent = nullptr) : QWidget(parent) {
        setWindowTitle("Smart Home Data");

        lineEditTemperature = new QLineEdit(this);
        lineEditHumidity = new QLineEdit(this);
        QPushButton *buttonConnect = new QPushButton("Connect", this);

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(new QLabel("Temperature:", this));
        layout->addWidget(lineEditTemperature);
        layout->addWidget(new QLabel("Humidity:", this));
        layout->addWidget(lineEditHumidity);
        layout->addWidget(buttonConnect);
        setLayout(layout);

        connect(buttonConnect, &QPushButton::clicked, this, &Client::connectToServer);
    }

private slots:
    void connectToServer() {
        socket = new QTcpSocket(this);

        connect(socket, &QTcpSocket::connected, this, &Client::onConnected);
        connect(socket, &QTcpSocket::disconnected, this, &Client::onDisconnected);
        connect(socket, &QTcpSocket::readyRead, this, &Client::onReadyRead);

        socket->connectToHost("localhost", 5000);
    }

    void onConnected() {
        qDebug() << "Connected to server";
    }

    void onDisconnected() {
        qDebug() << "Disconnected from server";
    }

    void onReadyRead() {
        QByteArray data = socket->readAll();
        QString strData = QString::fromUtf8(data);

        QStringList sensorData = strData.split(",");

        if (sensorData.length() == 2) {
            lineEditTemperature->setText(sensorData[0]);
            lineEditHumidity->setText(sensorData[1]);
        }
    }

private:
    QLineEdit *lineEditTemperature;
    QLineEdit *lineEditHumidity;
    QTcpSocket *socket;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    Client client;
    client.show();

    return app.exec();
}

#include "main.moc"

请确保正确设置数据库路径(#define DB_PATH "/path/to/database.db")和服务器的端口号(#define PORT 5000)。

此示例代码中,服务器端使用sqlite3库查询数据库中最新的温度和湿度数据,然后将其发送给客户端。客户端使用Qt网络库连接到服务器,并接收服务器发送的数据,然后在GUI上显示温度和湿度数据。

请注意,此示例代码仅提供参考,实际应用中可能需要根据具体需求进行修改和优化

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

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

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