Qt C++ 和 Linux C 服务器 TCP/IP 数据通信 - 智能家居状态监控与建议
使用 Qt C++ 和 Linux C 服务器实现智能家居状态监控与建议
本示例展示了如何使用 Qt C++ 和 Linux C 服务器进行 TCP/IP 数据通信,实现智能家居状态监控与建议功能。客户端从服务器获取最新的空调温度、加湿器湿度数据,并根据数据分析结果收到相应的建议。
数据库设计
创建用户表
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++)
#include <QtWidgets>
#include <QTcpSocket>
class Client : public QWidget
{
Q_OBJECT
public:
Client(QWidget *parent = nullptr) : QWidget(parent)
{
ipLineEdit = new QLineEdit;
portLineEdit = new QLineEdit;
sendLineEdit = new QLineEdit;
receiveLineEdit = new QLineEdit;
adviceLineEdit = new QLineEdit;
connectButton = new QPushButton('Connect');
sendButton = new QPushButton('Send');
getAdviceButton = new QPushButton('Get Advice');
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(new QLabel('IP:'));
layout->addWidget(ipLineEdit);
layout->addWidget(new QLabel('Port:'));
layout->addWidget(portLineEdit);
layout->addWidget(new QLabel('Send Message:'));
layout->addWidget(sendLineEdit);
layout->addWidget(new QLabel('Received Message:'));
layout->addWidget(receiveLineEdit);
layout->addWidget(new QLabel('Received Advice:'));
layout->addWidget(adviceLineEdit);
layout->addWidget(connectButton);
layout->addWidget(sendButton);
layout->addWidget(getAdviceButton);
setLayout(layout);
socket = new QTcpSocket(this);
connect(connectButton, &QPushButton::clicked, this, &Client::connectToServer);
connect(sendButton, &QPushButton::clicked, this, &Client::sendMessage);
connect(getAdviceButton, &QPushButton::clicked, this, &Client::getAdvice);
connect(socket, &QTcpSocket::readyRead, this, &Client::receiveMessage);
}
private slots:
void connectToServer()
{
QString ip = ipLineEdit->text();
int port = portLineEdit->text().toInt();
socket->connectToHost(ip, port);
if (socket->waitForConnected()) {
QMessageBox::information(this, 'Success', 'Connected to server');
} else {
QMessageBox::critical(this, 'Error', 'Failed to connect to server');
}
}
void sendMessage()
{
QString message = sendLineEdit->text();
socket->write(message.toUtf8());
}
void receiveMessage()
{
QString message = socket->readAll();
receiveLineEdit->setText(message);
}
void getAdvice()
{
socket->write('GET_ADVICE');
}
private:
QLineEdit *ipLineEdit;
QLineEdit *portLineEdit;
QLineEdit *sendLineEdit;
QLineEdit *receiveLineEdit;
QLineEdit *adviceLineEdit;
QPushButton *connectButton;
QPushButton *sendButton;
QPushButton *getAdviceButton;
QTcpSocket *socket;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Client client;
client.show();
return app.exec();
}
#include "main.moc"
服务器端代码(Linux C)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAX_BUFFER_SIZE 1024
void analyzeData(const char *data, char *advice)
{
// TODO: 根据数据分析给出建议
strcpy(advice, '空调温度过低,建议提高温度至26℃;加湿器湿度过高或过低,建议调整加湿器湿度');
}
int main()
{
int serverSocket, clientSocket;
struct sockaddr_in serverAddr, clientAddr;
char buffer[MAX_BUFFER_SIZE];
char advice[MAX_BUFFER_SIZE];
// 创建服务器套接字
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1) {
perror('Failed to create socket');
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(8888);
// 绑定服务器套接字到指定地址和端口
if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
perror('Failed to bind socket');
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(serverSocket, 5) == -1) {
perror('Failed to listen');
exit(EXIT_FAILURE);
}
printf('Server started, waiting for connections...
');
while (1) {
socklen_t clientAddrLen = sizeof(clientAddr);
// 接受客户端连接请求
clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen);
if (clientSocket == -1) {
perror('Failed to accept connection');
continue;
}
printf('Client connected
');
while (1) {
// 接收客户端消息
ssize_t bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
if (bytesRead <= 0) {
// 客户端断开连接
printf('Client disconnected
');
break;
}
buffer[bytesRead] = '\0';
printf('Received message: %s\n', buffer);
if (strcmp(buffer, 'GET_ADVICE') == 0) {
// 分析数据并给出建议
analyzeData(buffer, advice);
printf('Advice: %s\n', advice);
// 发送建议给客户端
send(clientSocket, advice, strlen(advice), 0);
} else {
// 其他消息,可以根据需要进行处理
}
}
// 关闭客户端套接字
close(clientSocket);
}
// 关闭服务器套接字
close(serverSocket);
return 0;
}
注意:
- 该代码示例只是一个基本框架,实际应用中可能需要更复杂的逻辑,例如:
- 数据解析:分析从数据库获取的空调温度、加湿器湿度数据,根据设定值判断是否需要发送建议。
- 建议生成:根据数据分析结果,生成合适的建议文本。
- 多线程处理:使用多线程来处理多个客户端连接和数据分析任务,提高效率。
- 安全性:添加安全机制,例如身份验证和数据加密,保护数据安全。
- 请根据实际需求对代码进行修改和完善。
总结
本示例展示了如何使用 Qt C++ 和 Linux C 服务器实现智能家居状态监控与建议功能,通过 TCP/IP 数据通信,客户端可以实时获取服务器端分析的空调温度、加湿器湿度数据,并收到相应的建议。这只是一个简单的示例,实际应用中可能需要更复杂的数据处理和错误处理逻辑,以及更完善的用户界面设计。
原文地址: https://www.cveoy.top/t/topic/fBn9 著作权归作者所有。请勿转载和采集!