智能家居系统:基于QT C++和Linux C的客户端-服务器架构
智能家居系统:基于QT C++和Linux C的客户端-服务器架构
数据库设计
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)
);
系统架构
客户端是QT C++写的,服务器端是Linux C写的。客户端与服务器之间进行HTTP通信。
服务器端设计模块
void startServer():启动服务器,监听特定端口void acceptConnection():接受客户端连接void processClientData(string data):处理客户端发来的数据void sendDataToClient(string data):将数据发送给客户端void closeConnection():关闭与客户端的连接void viewData():查看客户端存储在SQlite智能家居状态表中温度和湿度数据void analyzeData():根据温度和湿度数据分析出合理建议
功能实现
- 客户端将URL打包成JSON并通过HTTP通信发送给服务器。
- 服务器解析JSON,验证是否可以和客户端进行通信,连接SQLite数据库,根据
Status表的空调温度、加湿器湿度向客户端发送建议(例如温度低于24摄氏度、湿度小于40%大于70%时,服务器将发送'空调温度过低,建议提高温度至26℃;加湿器湿度过高或过低,建议调整加湿器湿度'给客户端,客户端显示在GUI)。
客户端代码实现
头文件(client.h)
#ifndef CLIENT_H
#define CLIENT_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
class Client : public QObject
{
Q_OBJECT
public:
explicit Client(QObject *parent = nullptr);
signals:
void connected();
void disconnected();
void dataReceived(QString data);
public slots:
void connectToServer(QString serverUrl);
void disconnectFromServer();
void sendData(QString data);
private slots:
void onConnected();
void onDisconnected();
void onDataReceived(QNetworkReply *reply);
private:
QNetworkAccessManager *networkManager;
QNetworkReply *reply;
};
#endif // CLIENT_H
实现文件(client.cpp)
#include "client.h"
Client::Client(QObject *parent) : QObject(parent)
{
networkManager = new QNetworkAccessManager(this);
connect(networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onDataReceived(QNetworkReply*)));
}
void Client::connectToServer(QString serverUrl)
{
QNetworkRequest request;
request.setUrl(QUrl(serverUrl));
reply = networkManager->get(request);
connect(reply, SIGNAL(finished()), this, SLOT(onConnected()));
}
void Client::disconnectFromServer()
{
// 关闭连接的逻辑
// ...
emit disconnected();
}
void Client::sendData(QString data)
{
// 发送数据的逻辑
// ...
}
void Client::onConnected()
{
if (reply->error() == QNetworkReply::NoError) {
emit connected();
} else {
emit disconnected();
}
}
void Client::onDisconnected()
{
// 断开连接的逻辑
// ...
}
void Client::onDataReceived(QNetworkReply *reply)
{
if (reply->error() == QNetworkReply::NoError) {
QString data = reply->readAll();
emit dataReceived(data);
}
}
在主界面QWidget中使用Client类进行通信
#include "client.h"
// ...
Client *client;
// 点击连接按钮的槽函数
void MainWindow::on_connectButton_clicked()
{
QString serverUrl = ui->serverUrlLineEdit->text();
client = new Client(this);
connect(client, SIGNAL(connected()), this, SLOT(onConnected()));
connect(client, SIGNAL(disconnected()), this, SLOT(onDisconnected()));
connect(client, SIGNAL(dataReceived(QString)), this, SLOT(onDataReceived(QString)));
client->connectToServer(serverUrl);
}
// 点击断开按钮的槽函数
void MainWindow::on_disconnectButton_clicked()
{
client->disconnectFromServer();
delete client;
}
// 连接成功的槽函数
void MainWindow::onConnected()
{
ui->statusLineEdit->setText("服务器已连接");
}
// 连接断开的槽函数
void MainWindow::onDisconnected()
{
ui->statusLineEdit->setText("服务器已断开");
}
// 接收到数据的槽函数
void MainWindow::onDataReceived(QString data)
{
// 处理接收到的数据
// ...
}
请根据您的需求在代码中添加适当的逻辑和错误处理。
原文地址: https://www.cveoy.top/t/topic/fBvT 著作权归作者所有。请勿转载和采集!