智能家居环境监测与建议系统:基于 SQLite 数据库的服务器端和 QT 客户端
智能家居环境监测与建议系统:基于 SQLite 数据库的服务器端和 QT 客户端
概述
本文介绍了一个基于 SQLite 数据库的智能家居环境监测与建议系统,该系统通过服务器端和 QT 客户端实现,服务器端接收客户端发来的用户 ID,并根据数据库中的设备状态信息分析得出建议,并发送给客户端。
数据库设计
本系统使用 SQLite 数据库,包含以下两个表:
- users 表
CREATE TABLE IF NOT EXISTS users (
uid INTEGER PRIMARY KEY AUTOINCREMENT,
username varchar(10),
passwd varchar(10)
);
- 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 查询数据库中的设备状态信息,分析得出建议,并发送给客户端。该系统可以为用户提供更加智能化的家居环境控制服务。
未来展望
该系统可以进一步完善,例如:
- 添加更多设备类型,例如灯光、窗帘等
- 支持用户自定义设备阈值,例如温度、湿度阈值
- 支持用户自定义建议信息
- 使用图形界面展示设备状态和建议信息
原文地址: http://www.cveoy.top/t/topic/fB7f 著作权归作者所有。请勿转载和采集!