基于SQLite和TCP的智能家居状态监控系统

本文介绍一个简单的智能家居状态监控系统示例,该系统使用SQLite数据库存储设备状态,并通过TCP通信在服务器和客户端之间传递数据。

一、系统架构

本系统包含服务器端和客户端两部分:

  • 服务器端(Linux C语言实现): * 监听客户端连接请求。 * 接收客户端发送的userid。 * 连接SQLite数据库,根据userid查询对应用户的设备状态信息。 * 根据预设规则分析设备状态,生成建议信息。 * 将建议信息发送给客户端。* 客户端(QT C++实现): * 提供图形界面,包含一个连接按钮和一个文本框。 * 点击连接按钮,与服务器建立TCP连接。 * 连接成功后,向服务器发送预设的userid。 * 接收服务器返回的建议信息,并显示在文本框中。

二、数据库设计

本系统使用SQLite数据库,包含以下两张表:

  • users表: 存储用户信息,包含uid和username等字段。* Status表: 存储设备状态信息,包含sid、uid、device_name、device_state、value和mode等字段,其中uid关联users表。

三、代码实现

1. 服务器端代码(Linux C语言)c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sqlite3.h>

#define DB_PATH 'database.db'

// 数据库回调函数int db_callback(void* data, int argc, char** argv, char** col_names) { // 获取设备名称和最新状态值 char* device_name = argv[0]; char* value = argv[1];

// 根据设备名称和状态值进行分析,并给出建议    if (strcmp(device_name, '空调') == 0) {        int temp = atoi(value);        if (temp < 24) {            printf('空调温度过低,建议提高温度至26℃\n');        }    } else if (strcmp(device_name, '加湿器') == 0) {        int humidity = atoi(value);        if (humidity < 40 || humidity > 70) {            printf('加湿器湿度过高或过低,建议调整加湿器湿度\n');        }    }

return 0;}

int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len;

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

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

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

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

printf('Server is running...\n');

while (1) {        // 接受客户端连接请求        client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_len);        if (client_fd == -1) {            perror('Failed to accept');            continue;        }

    printf('Client connected\n');

    // 接收客户端发送的userid        int userid;        if (recv(client_fd, &userid, sizeof(userid), 0) == -1) {            perror('Failed to receive userid');            close(client_fd);            continue;        }

    printf('Received userid: %d\n', userid);

    // 连接数据库        sqlite3* db;        if (sqlite3_open(DB_PATH, &db) != SQLITE_OK) {            fprintf(stderr, 'Failed to open database: %s\n', sqlite3_errmsg(db));            close(client_fd);            continue;        }

    // 查询数据库获取状态信息        char sql[100];        snprintf(sql, sizeof(sql), 'SELECT device_name, value FROM Status WHERE uid = %d', userid);        if (sqlite3_exec(db, sql, db_callback, NULL, NULL) != SQLITE_OK) {            fprintf(stderr, 'Failed to execute SQL statement: %s\n', sqlite3_errmsg(db));        }

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

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

    printf('Client disconnected\n');    }

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

return 0;}

2. 客户端代码(QT C++)cpp#include #include

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(this);        layout->addWidget(connectButton);        layout->addWidget(textEdit);    }

private slots: void connectToServer() { // 创建套接字 QTcpSocket* socket = new QTcpSocket(this);

    // 连接服务器        socket->connectToHost('127.0.0.1', 12345);        if (!socket->waitForConnected()) {            textEdit->setText('Connection failed');            return;        }

    textEdit->setText('Connected to server');

    // 发送userid        int userid = 123;  // 替换为实际的userid        socket->write(reinterpret_cast<const char*>(&userid), sizeof(userid));        socket->waitForBytesWritten();

    // 接收服务器返回的信息        socket->waitForReadyRead();        QByteArray data = socket->readAll();        textEdit->append(QString(data));

    // 关闭套接字        socket->close();    }

private: QTextEdit* textEdit;};

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

Client client;    client.show();

return app.exec();}

#include 'main.moc'

四、总结

本示例代码演示了如何使用SQLite数据库和TCP通信实现一个简单的智能家居状态监控系统。实际应用中,可以根据需求扩展功能,例如:

  • 添加用户登录验证功能。* 实现更复杂的设备状态分析和建议生成算法。* 使用更安全可靠的通信协议。

希望本文能够为开发者提供一些参考和帮助。

基于SQLite和TCP的智能家居状态监控系统

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

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