以下是一个实现上述功能的示例代码:

客户端(Qt C++):

#include <QtWidgets>
#include <QTcpSocket>

class ClientWidget : public QWidget
{
    Q_OBJECT

public:
    ClientWidget(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        temperatureLabel = new QLabel("Temperature: ", this);
        humidityLabel = new QLabel("Humidity: ", this);
        suggestionLabel = new QLabel("Suggestion: ", this);

        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(temperatureLabel);
        layout->addWidget(humidityLabel);
        layout->addWidget(suggestionLabel);

        tcpSocket = new QTcpSocket(this);
        connect(tcpSocket, &QTcpSocket::readyRead, this, &ClientWidget::readData);

        tcpSocket->connectToHost("127.0.0.1", 12345);
    }

private slots:
    void readData()
    {
        QByteArray data = tcpSocket->readAll();
        QString suggestion = QString::fromUtf8(data);
        suggestionLabel->setText("Suggestion: " + suggestion);
    }

private:
    QLabel *temperatureLabel;
    QLabel *humidityLabel;
    QLabel *suggestionLabel;
    QTcpSocket *tcpSocket;
};

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

    ClientWidget clientWidget;
    clientWidget.show();

    return a.exec();
}

服务器(Linux C):

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

#define DATABASE_NAME "smart_home.db"
#define TCP_PORT 12345

int callback(void *data, int argc, char **argv, char **azColName)
{
    int *temperature = (int *)data;
    *temperature = atoi(argv[0]);
    return 0;
}

void sendSuggestion(int clientSocket, int temperature, int humidity)
{
    char suggestion[256];
    memset(suggestion, 0, sizeof(suggestion));

    if (temperature < 24)
    {
        snprintf(suggestion, sizeof(suggestion), "Air conditioner temperature is too low, suggest increasing temperature to 26°C");
    }
    else if (humidity < 40 || humidity > 70)
    {
        snprintf(suggestion, sizeof(suggestion), "Humidifier humidity is too low or too high, suggest adjusting humidifier humidity");
    }
    else
    {
        snprintf(suggestion, sizeof(suggestion), "No suggestion");
    }

    send(clientSocket, suggestion, strlen(suggestion), 0);
}

int main()
{
    int serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    socklen_t addrLen = sizeof(struct sockaddr_in);

    serverSocket = socket(AF_INET, SOCK_STREAM, 0);

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(TCP_PORT);
    serverAddr.sin_addr.s_addr = INADDR_ANY;

    bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr));
    listen(serverSocket, 5);

    sqlite3 *db;
    char *errMsg = 0;

    if (sqlite3_open(DATABASE_NAME, &db) != SQLITE_OK)
    {
        printf("Cannot open database: %s\n", sqlite3_errmsg(db));
        return 1;
    }

    while (1)
    {
        clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen);
        printf("New client connected: %s\n", inet_ntoa(clientAddr.sin_addr));

        int temperature = 0;
        int rc = sqlite3_exec(db, "SELECT temperature FROM smart_home_status ORDER BY timestamp DESC LIMIT 1;", callback, &temperature, &errMsg);
        if (rc != SQLITE_OK)
        {
            printf("SQL error: %s\n", errMsg);
            sqlite3_free(errMsg);
        }

        int humidity = 0;
        rc = sqlite3_exec(db, "SELECT humidity FROM smart_home_status ORDER BY timestamp DESC LIMIT 1;", callback, &humidity, &errMsg);
        if (rc != SQLITE_OK)
        {
            printf("SQL error: %s\n", errMsg);
            sqlite3_free(errMsg);
        }

        sendSuggestion(clientSocket, temperature, humidity);

        close(clientSocket);
    }

    sqlite3_close(db);

    return 0;
}

请注意,以上代码仅为示例,可能需要根据实际需求进行修改和完善。另外,服务器需要预先创建一个名为"smart_home.db"的SQLite数据库,并在其中创建一个名为"smart_home_status"的表,用于存储智能家居状态信息

代码:Qt C++客户端采集的智能家居状态信息存储SQlite智能家居状态表Linux C服务器查看智能家居状态表最新的温度、湿度数据制定建议并通过TCPIP协议发送建议给客户端建议例如温度低于24摄氏度、湿度小于40大于70时服务器将发送空调温度过低建议提高温度至26℃;加湿器湿度过高或过低建议调整加湿器湿度给客户端客户端显示在GUI

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

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