智能家居系统服务器与客户端代码示例

目标: 使用 Linux C 语言编写服务器,使用 QT C++ 在 Windows 上编写客户端,实现智能家居系统中服务器与客户端之间的 TCP 通信,并通过 SQLite 数据库存储和分析设备状态,生成建议信息传递给客户端。

服务器端代码示例:

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

#define MAX_BUFFER_SIZE 1024

// 数据库回调函数
int callback(void *data, int argc, char **argv, char **azColName) {
    // 解析查询结果并发送建议给客户端
    // 根据需要修改建议的判断逻辑和发送方式
    if (argc >= 3) {
        int uid = atoi(argv[0]);
        char* device_name = argv[1];
        char* value = argv[2];

        // 发送建议给客户端
        // ...
    }
    return 0;
}

int main() {
    int serverSocket, clientSocket;
    struct sockaddr_in serverAddr, clientAddr;
    socklen_t addrLen = sizeof(clientAddr);
    char buffer[MAX_BUFFER_SIZE];

    // 创建服务器端socket
    if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

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

    // 绑定服务器地址和端口
    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
        perror("Binding failed");
        exit(EXIT_FAILURE);
    }

    // 监听连接请求
    if (listen(serverSocket, 5) == -1) {
        perror("Listening failed");
        exit(EXIT_FAILURE);
    }

    // 接受客户端连接
    if ((clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen)) == -1) {
        perror("Accepting failed");
        exit(EXIT_FAILURE);
    }

    // 连接成功,发送连接成功信息给客户端
    strcpy(buffer, "Connected to server");
    send(clientSocket, buffer, strlen(buffer), 0);

    // 接收userid
    memset(buffer, 0, sizeof(buffer));
    recv(clientSocket, buffer, sizeof(buffer), 0);
    int userId = atoi(buffer);

    // 连接数据库
    sqlite3 *db;
    if (sqlite3_open("database.db", &db) != SQLITE_OK) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        exit(EXIT_FAILURE);
    }

    // 查询数据库获取设备信息
    char query[100];
    sprintf(query, "SELECT uid, device_name, value FROM Status WHERE uid=%d", userId);
    if (sqlite3_exec(db, query, callback, NULL, NULL) != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
        exit(EXIT_FAILURE);
    }

    // 关闭数据库连接
    sqlite3_close(db);

    // 关闭服务器端socket
    close(serverSocket);

    return 0;
}

客户端代码示例:

#include <QtWidgets>
#include <QTcpSocket>

class Client : public QWidget {
    Q_OBJECT

public:
    Client(QWidget *parent = nullptr) : QWidget(parent) {
        QPushButton *connectButton = new QPushButton("Connect", this);
        connect(connectButton, &QPushButton::clicked, this, &Client::connectToServer);

        textEdit = new QTextEdit(this);

        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(connectButton);
        layout->addWidget(textEdit);
        setLayout(layout);

        socket = new QTcpSocket(this);
        connect(socket, &QTcpSocket::connected, this, &Client::onConnected);
        connect(socket, &QTcpSocket::readyRead, this, &Client::onReadyRead);
    }

private slots:
    void connectToServer() {
        socket->connectToHost("127.0.0.1", 12345);
    }

    void onConnected() {
        textEdit->append("Connected to server");
        // 发送userid给服务器
        QString userId = "123";  // 修改为实际的userid
        socket->write(userId.toUtf8());
        socket->waitForBytesWritten();
    }

    void onReadyRead() {
        QByteArray data = socket->readAll();
        textEdit->append(data);
        // 解析建议并显示在GUI中
        // ...
    }

private:
    QTextEdit *textEdit;
    QTcpSocket *socket;
};

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

    Client client;
    client.show();

    return app.exec();
}

#include "main.moc"

注意: 以上代码仅为示例,需要根据实际需求进行修改和完善。

数据库 schema:

-- 创建用户表
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)
);

功能实现:

  1. 服务器启动:监听指定端口,等待客户端连接。
  2. 客户端连接:连接服务器,并发送用户ID给服务器。
  3. 服务器接收用户ID:根据用户ID查询数据库中对应用户的设备状态信息。
  4. 服务器分析数据并生成建议:根据设备状态信息,生成建议,例如温度低于24摄氏度、湿度小于40%大于70%时,服务器将发送“空调温度过低,建议提高温度至26℃;加湿器湿度过高或过低,建议调整加湿器湿度”给客户端。
  5. 服务器发送建议给客户端:将建议信息发送给客户端。
  6. 客户端接收建议:接收服务器发送的建议信息,并将其显示在GUI中。

扩展:

  1. 可以添加更多设备类型,例如灯光、窗帘等。
  2. 可以实现用户对设备状态的控制功能。
  3. 可以使用更复杂的算法来分析设备状态信息,生成更精准的建议。

注意:

  1. 服务器和客户端需要在同一局域网内才能进行通信。
  2. 需要安装 SQLite 数据库,并创建相应的数据库文件。
  3. 需要根据实际需求修改数据库 schema 和建议生成逻辑。

代码示例仅供参考,实际应用中需要进行完善和优化。

智能家居系统服务器与客户端代码示例 |  基于SQLite数据库的建议生成

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

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