使用 Qt C++ 和 Linux C 服务器实现智能家居状态监控与建议

本示例展示了如何使用 Qt C++ 和 Linux C 服务器进行 TCP/IP 数据通信,实现智能家居状态监控与建议功能。客户端从服务器获取最新的空调温度、加湿器湿度数据,并根据数据分析结果收到相应的建议。

数据库设计

创建用户表

CREATE TABLE IF NOT EXISTS users (
    uid INTEGER PRIMARY KEY AUTOINCREMENT,
    username varchar(10), 
    passwd varchar(10)
);

创建智能家居状态表

CREATE TABLE IF NOT EXISTS Status (
    sid INTEGER PRIMARY KEY AUTOINCREMENT,
    uid INTEGER ,
    device_name varchar(10),
    device_state varchar(10),
    value varchar(10),
    mode varchar(10),
    FOREIGN KEY (uid) REFERENCES users (uid)
);

客户端代码(Qt C++)

#include <QtWidgets>
#include <QTcpSocket>

class Client : public QWidget
{
    Q_OBJECT

public:
    Client(QWidget *parent = nullptr) : QWidget(parent)
    {
        ipLineEdit = new QLineEdit;
        portLineEdit = new QLineEdit;
        sendLineEdit = new QLineEdit;
        receiveLineEdit = new QLineEdit;
        adviceLineEdit = new QLineEdit;

        connectButton = new QPushButton('Connect');
        sendButton = new QPushButton('Send');
        getAdviceButton = new QPushButton('Get Advice');

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(new QLabel('IP:'));
        layout->addWidget(ipLineEdit);
        layout->addWidget(new QLabel('Port:'));
        layout->addWidget(portLineEdit);
        layout->addWidget(new QLabel('Send Message:'));
        layout->addWidget(sendLineEdit);
        layout->addWidget(new QLabel('Received Message:'));
        layout->addWidget(receiveLineEdit);
        layout->addWidget(new QLabel('Received Advice:'));
        layout->addWidget(adviceLineEdit);
        layout->addWidget(connectButton);
        layout->addWidget(sendButton);
        layout->addWidget(getAdviceButton);

        setLayout(layout);

        socket = new QTcpSocket(this);

        connect(connectButton, &QPushButton::clicked, this, &Client::connectToServer);
        connect(sendButton, &QPushButton::clicked, this, &Client::sendMessage);
        connect(getAdviceButton, &QPushButton::clicked, this, &Client::getAdvice);
        connect(socket, &QTcpSocket::readyRead, this, &Client::receiveMessage);
    }

private slots:
    void connectToServer()
    {
        QString ip = ipLineEdit->text();
        int port = portLineEdit->text().toInt();

        socket->connectToHost(ip, port);

        if (socket->waitForConnected()) {
            QMessageBox::information(this, 'Success', 'Connected to server');
        } else {
            QMessageBox::critical(this, 'Error', 'Failed to connect to server');
        }
    }

    void sendMessage()
    {
        QString message = sendLineEdit->text();
        socket->write(message.toUtf8());
    }

    void receiveMessage()
    {
        QString message = socket->readAll();
        receiveLineEdit->setText(message);
    }

    void getAdvice()
    {
        socket->write('GET_ADVICE');
    }

private:
    QLineEdit *ipLineEdit;
    QLineEdit *portLineEdit;
    QLineEdit *sendLineEdit;
    QLineEdit *receiveLineEdit;
    QLineEdit *adviceLineEdit;
    QPushButton *connectButton;
    QPushButton *sendButton;
    QPushButton *getAdviceButton;
    QTcpSocket *socket;
};

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

    Client client;
    client.show();

    return app.exec();
}

#include "main.moc"

服务器端代码(Linux C)

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

#define MAX_BUFFER_SIZE 1024

void analyzeData(const char *data, char *advice)
{
    // TODO: 根据数据分析给出建议
    strcpy(advice, '空调温度过低,建议提高温度至26℃;加湿器湿度过高或过低,建议调整加湿器湿度');
}

int main()
{
    int serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    char buffer[MAX_BUFFER_SIZE];
    char advice[MAX_BUFFER_SIZE];

    // 创建服务器套接字
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == -1) {
        perror('Failed to create socket');
        exit(EXIT_FAILURE);
    }

    // 设置服务器地址和端口
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(8888);

    // 绑定服务器套接字到指定地址和端口
    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
        perror('Failed to bind socket');
        exit(EXIT_FAILURE);
    }

    // 监听连接请求
    if (listen(serverSocket, 5) == -1) {
        perror('Failed to listen');
        exit(EXIT_FAILURE);
    }

    printf('Server started, waiting for connections...
');

    while (1) {
        socklen_t clientAddrLen = sizeof(clientAddr);

        // 接受客户端连接请求
        clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen);
        if (clientSocket == -1) {
            perror('Failed to accept connection');
            continue;
        }

        printf('Client connected
');

        while (1) {
            // 接收客户端消息
            ssize_t bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
            if (bytesRead <= 0) {
                // 客户端断开连接
                printf('Client disconnected
');
                break;
            }

            buffer[bytesRead] = '\0';
            printf('Received message: %s\n', buffer);

            if (strcmp(buffer, 'GET_ADVICE') == 0) {
                // 分析数据并给出建议
                analyzeData(buffer, advice);
                printf('Advice: %s\n', advice);

                // 发送建议给客户端
                send(clientSocket, advice, strlen(advice), 0);
            } else {
                // 其他消息,可以根据需要进行处理
            }
        }

        // 关闭客户端套接字
        close(clientSocket);
    }

    // 关闭服务器套接字
    close(serverSocket);

    return 0;
}

注意:

  • 该代码示例只是一个基本框架,实际应用中可能需要更复杂的逻辑,例如:
    • 数据解析:分析从数据库获取的空调温度、加湿器湿度数据,根据设定值判断是否需要发送建议。
    • 建议生成:根据数据分析结果,生成合适的建议文本。
    • 多线程处理:使用多线程来处理多个客户端连接和数据分析任务,提高效率。
    • 安全性:添加安全机制,例如身份验证和数据加密,保护数据安全。
  • 请根据实际需求对代码进行修改和完善。

总结

本示例展示了如何使用 Qt C++ 和 Linux C 服务器实现智能家居状态监控与建议功能,通过 TCP/IP 数据通信,客户端可以实时获取服务器端分析的空调温度、加湿器湿度数据,并收到相应的建议。这只是一个简单的示例,实际应用中可能需要更复杂的数据处理和错误处理逻辑,以及更完善的用户界面设计。

Qt C++ 和 Linux C 服务器 TCP/IP 数据通信 - 智能家居状态监控与建议

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

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