QT C++ 智能家居状态监控系统:客户端与服务器TCP通信并实现数据库交互
头文件 widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void connected();
void disconnected();
void readyRead();
private:
Ui::Widget *ui;
QTcpSocket *socket;
};
#endif // WIDGET_H
.cpp 文件 widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
socket = new QTcpSocket(this);
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
ui->textEdit->clear();
ui->textEdit->append('正在连接中...');
socket->connectToHost('服务器IP地址', 1234); // 替换为实际的服务器IP地址和端口号
}
void Widget::connected()
{
ui->textEdit->append('连接成功');
QString userId = '用户ID'; // 替换为实际的用户ID
socket->write(userId.toUtf8());
}
void Widget::disconnected()
{
ui->textEdit->append('连接失败');
}
void Widget::readyRead()
{
QString suggestion = socket->readAll();
ui->textEdit->append(suggestion);
}
服务器端代码
import socket
import sqlite3
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP地址和端口号
server_socket.bind(('服务器IP地址', 1234)) # 替换为实际的服务器IP地址和端口号
# 监听连接
server_socket.listen(1)
# 连接数据库
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
while True:
# 接受客户端连接
client_socket, addr = server_socket.accept()
print('连接地址:', addr)
# 接收客户端发送的userid
userId = client_socket.recv(1024).decode('utf-8')
# 查询数据库获取设备状态和建议
cursor.execute('SELECT device_name, value FROM Status WHERE uid=?', (userId,))
rows = cursor.fetchall()
suggestion = ''
for row in rows:
device_name = row[0]
value = row[1]
if device_name == '空调' and int(value) < 24:
suggestion += '空调温度过低,建议提高温度至26℃;'
elif device_name == '加湿器' and (int(value) < 40 or int(value) > 70):
suggestion += '加湿器湿度过高或过低,建议调整加湿器湿度;'
# 发送建议给客户端
client_socket.sendall(suggestion.encode('utf-8'))
# 关闭连接
client_socket.close()
# 关闭数据库连接
conn.close()
数据库设计
database.db
-- 创建用户表
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)
);
功能说明
- 客户端通过GUI界面发送连接请求到服务器。
- 服务器接受连接请求后,接收客户端发送的userid。
- 服务器根据userid查询数据库,获取设备状态信息。
- 服务器根据设备状态信息,生成建议并发送给客户端。
- 客户端接收服务器发送的建议,并显示在GUI界面上。
注意事项
- 服务器端代码中的服务器IP地址和端口号需要替换为实际的IP地址和端口号。
- 客户端代码中的用户ID需要替换为实际的用户ID。
- 数据库中的设备状态信息需要根据实际情况进行修改。
- 建议信息可以根据实际情况进行修改。
总结
本项目实现了QT C++ 与服务器TCP通信,并通过数据库交互获取设备状态信息,并给出建议。该项目可以作为智能家居状态监控系统的一个基础模块,可以进一步扩展功能,例如:
- 增加对更多设备的支持
- 增加对设备状态信息的实时更新
- 增加对设备控制的支持
- 增加对用户权限管理的支持
- 增加对历史数据记录和查询的支持
原文地址: http://www.cveoy.top/t/topic/fCam 著作权归作者所有。请勿转载和采集!