智能家居环境监测与建议系统:基于 SQLite 数据库的服务器端和 QT 客户端

概述

本文介绍了一个基于 SQLite 数据库的智能家居环境监测与建议系统,该系统通过服务器端和 QT 客户端实现,服务器端接收客户端发来的用户 ID,并根据数据库中的设备状态信息分析得出建议,并发送给客户端。

数据库设计

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

  1. users 表
CREATE TABLE IF NOT EXISTS users (
    uid INTEGER PRIMARY KEY AUTOINCREMENT,
    username varchar(10), 
    passwd varchar(10)
);
  1. Status 表
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)
);

服务器端代码

服务器端使用 Linux C 语言编写,负责接收客户端发送的用户信息,并根据数据库中的设备状态信息分析得出建议,并发送给客户端。

#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 PORT 8080

// 数据库回调函数
int callback(void *data, int argc, char **argv, char **azColName) {
    // 处理数据库查询结果
    // 根据userid查询数据库中的设备状态信息并进行分析得出建议
    // 将建议发送给客户端
    return 0;
}

int main() {
    int sockfd, new_sockfd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len;
    int bytes_received, bytes_sent;
    char buffer[1024];

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

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

    // 绑定套接字
    if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
        perror("Socket bind failed");
        exit(EXIT_FAILURE);
    }

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

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

    while (1) {
        // 接受连接请求
        addr_len = sizeof(client_addr);
        new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_len);
        if (new_sockfd == -1) {
            perror("Accept failed");
            exit(EXIT_FAILURE);
        }

        printf("Client connected: %s
", inet_ntoa(client_addr.sin_addr));

        // 接收userid
        bytes_received = recv(new_sockfd, buffer, sizeof(buffer), 0);
        if (bytes_received == -1) {
            perror("Receive failed");
            exit(EXIT_FAILURE);
        }

        // 打开数据库
        sqlite3 *db;
        int rc = sqlite3_open("database.db", &db);
        if (rc != SQLITE_OK) {
            fprintf(stderr, "Cannot open database: %s
", sqlite3_errmsg(db));
            exit(EXIT_FAILURE);
        }

        // 查询数据库
        char sql[100];
        sprintf(sql, "SELECT device_name, value FROM Status WHERE uid = %s ORDER BY sid DESC LIMIT 1", buffer);
        rc = sqlite3_exec(db, sql, callback, NULL, NULL);
        if (rc != SQLITE_OK) {
            fprintf(stderr, "SQL error: %s
", sqlite3_errmsg(db));
            exit(EXIT_FAILURE);
        }

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

        // 发送建议给客户端
        char suggestion[100] = "空调温度过低,建议提高温度至26℃;加湿器湿度过高或过低,建议调整加湿器湿度";
        bytes_sent = send(new_sockfd, suggestion, strlen(suggestion), 0);
        if (bytes_sent == -1) {
            perror("Send failed");
            exit(EXIT_FAILURE);
        }

        // 关闭连接
        close(new_sockfd);
    }

    // 关闭套接字
    close(sockfd);

    return 0;
}

客户端代码

客户端使用 QT C++ 编写,包含头文件 client.h 和源文件 client.cpp。

client.h

// client.h

#ifndef CLIENT_H
#define CLIENT_H

#include <QObject>
#include <QTcpSocket>

class Client : public QObject
{
    Q_OBJECT
public:
    explicit Client(QObject *parent = nullptr);

signals:
    void connectionFailed();
    void suggestionReceived(QString suggestion);

public slots:
    void connectToServer();
    void readData();

private:
    QTcpSocket *socket;
};

#endif // CLIENT_H

client.cpp

// client.cpp

#include "client.h"

Client::Client(QObject *parent) : QObject(parent)
{
    socket = new QTcpSocket(this);

    connect(socket, SIGNAL(connected()), this, SLOT(readData()));
    connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
    connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
}

void Client::connectToServer()
{
    socket->connectToHost("127.0.0.1", 8080);
    if (!socket->waitForConnected(5000)) {
        emit connectionFailed();
    }
}

void Client::readData()
{
    QString suggestion = socket->readAll();
    emit suggestionReceived(suggestion);
}

客户端界面设计

在客户端的界面中,需要添加一个 QPushButton 按键,并将该按键的 clicked 信号连接到 Client 的 connectToServer 槽函数。同时,需要添加一个 TextEdit 用于显示服务器返回的建议信息,并将 Client 的 suggestionReceived 信号连接到 TextEdit 的 setText 槽函数,用于更新界面显示建议。

总结

本文介绍了一个基于 SQLite 数据库的智能家居环境监测与建议系统,该系统通过服务器端和 QT 客户端实现,可以根据用户 ID 查询数据库中的设备状态信息,分析得出建议,并发送给客户端。该系统可以为用户提供更加智能化的家居环境控制服务。

未来展望

该系统可以进一步完善,例如:

  • 添加更多设备类型,例如灯光、窗帘等
  • 支持用户自定义设备阈值,例如温度、湿度阈值
  • 支持用户自定义建议信息
  • 使用图形界面展示设备状态和建议信息
智能家居环境监测与建议系统:基于 SQLite 数据库的服务器端和 QT 客户端

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

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