头文件 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)
);

功能说明

  1. 客户端通过GUI界面发送连接请求到服务器。
  2. 服务器接受连接请求后,接收客户端发送的userid。
  3. 服务器根据userid查询数据库,获取设备状态信息。
  4. 服务器根据设备状态信息,生成建议并发送给客户端。
  5. 客户端接收服务器发送的建议,并显示在GUI界面上。

注意事项

  1. 服务器端代码中的服务器IP地址和端口号需要替换为实际的IP地址和端口号。
  2. 客户端代码中的用户ID需要替换为实际的用户ID。
  3. 数据库中的设备状态信息需要根据实际情况进行修改。
  4. 建议信息可以根据实际情况进行修改。

总结

本项目实现了QT C++ 与服务器TCP通信,并通过数据库交互获取设备状态信息,并给出建议。该项目可以作为智能家居状态监控系统的一个基础模块,可以进一步扩展功能,例如:

  • 增加对更多设备的支持
  • 增加对设备状态信息的实时更新
  • 增加对设备控制的支持
  • 增加对用户权限管理的支持
  • 增加对历史数据记录和查询的支持
QT C++ 智能家居状态监控系统:客户端与服务器TCP通信并实现数据库交互

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

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