智能家居系统服务器与客户端代码示例 | 基于SQLite数据库的建议生成
智能家居系统服务器与客户端代码示例
目标: 使用 Linux C 语言编写服务器,使用 QT C++ 在 Windows 上编写客户端,实现智能家居系统中服务器与客户端之间的 TCP 通信,并通过 SQLite 数据库存储和分析设备状态,生成建议信息传递给客户端。
服务器端代码示例:
#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 MAX_BUFFER_SIZE 1024
// 数据库回调函数
int callback(void *data, int argc, char **argv, char **azColName) {
// 解析查询结果并发送建议给客户端
// 根据需要修改建议的判断逻辑和发送方式
if (argc >= 3) {
int uid = atoi(argv[0]);
char* device_name = argv[1];
char* value = argv[2];
// 发送建议给客户端
// ...
}
return 0;
}
int main() {
int serverSocket, clientSocket;
struct sockaddr_in serverAddr, clientAddr;
socklen_t addrLen = sizeof(clientAddr);
char buffer[MAX_BUFFER_SIZE];
// 创建服务器端socket
if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(12345);
serverAddr.sin_addr.s_addr = INADDR_ANY;
// 绑定服务器地址和端口
if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) {
perror("Binding failed");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(serverSocket, 5) == -1) {
perror("Listening failed");
exit(EXIT_FAILURE);
}
// 接受客户端连接
if ((clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen)) == -1) {
perror("Accepting failed");
exit(EXIT_FAILURE);
}
// 连接成功,发送连接成功信息给客户端
strcpy(buffer, "Connected to server");
send(clientSocket, buffer, strlen(buffer), 0);
// 接收userid
memset(buffer, 0, sizeof(buffer));
recv(clientSocket, buffer, sizeof(buffer), 0);
int userId = atoi(buffer);
// 连接数据库
sqlite3 *db;
if (sqlite3_open("database.db", &db) != SQLITE_OK) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
// 查询数据库获取设备信息
char query[100];
sprintf(query, "SELECT uid, device_name, value FROM Status WHERE uid=%d", userId);
if (sqlite3_exec(db, query, callback, NULL, NULL) != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
exit(EXIT_FAILURE);
}
// 关闭数据库连接
sqlite3_close(db);
// 关闭服务器端socket
close(serverSocket);
return 0;
}
客户端代码示例:
#include <QtWidgets>
#include <QTcpSocket>
class Client : public QWidget {
Q_OBJECT
public:
Client(QWidget *parent = nullptr) : QWidget(parent) {
QPushButton *connectButton = new QPushButton("Connect", this);
connect(connectButton, &QPushButton::clicked, this, &Client::connectToServer);
textEdit = new QTextEdit(this);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(connectButton);
layout->addWidget(textEdit);
setLayout(layout);
socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::connected, this, &Client::onConnected);
connect(socket, &QTcpSocket::readyRead, this, &Client::onReadyRead);
}
private slots:
void connectToServer() {
socket->connectToHost("127.0.0.1", 12345);
}
void onConnected() {
textEdit->append("Connected to server");
// 发送userid给服务器
QString userId = "123"; // 修改为实际的userid
socket->write(userId.toUtf8());
socket->waitForBytesWritten();
}
void onReadyRead() {
QByteArray data = socket->readAll();
textEdit->append(data);
// 解析建议并显示在GUI中
// ...
}
private:
QTextEdit *textEdit;
QTcpSocket *socket;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Client client;
client.show();
return app.exec();
}
#include "main.moc"
注意: 以上代码仅为示例,需要根据实际需求进行修改和完善。
数据库 schema:
-- 创建用户表
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)
);
功能实现:
- 服务器启动:监听指定端口,等待客户端连接。
- 客户端连接:连接服务器,并发送用户ID给服务器。
- 服务器接收用户ID:根据用户ID查询数据库中对应用户的设备状态信息。
- 服务器分析数据并生成建议:根据设备状态信息,生成建议,例如温度低于24摄氏度、湿度小于40%大于70%时,服务器将发送“空调温度过低,建议提高温度至26℃;加湿器湿度过高或过低,建议调整加湿器湿度”给客户端。
- 服务器发送建议给客户端:将建议信息发送给客户端。
- 客户端接收建议:接收服务器发送的建议信息,并将其显示在GUI中。
扩展:
- 可以添加更多设备类型,例如灯光、窗帘等。
- 可以实现用户对设备状态的控制功能。
- 可以使用更复杂的算法来分析设备状态信息,生成更精准的建议。
注意:
- 服务器和客户端需要在同一局域网内才能进行通信。
- 需要安装 SQLite 数据库,并创建相应的数据库文件。
- 需要根据实际需求修改数据库 schema 和建议生成逻辑。
代码示例仅供参考,实际应用中需要进行完善和优化。
原文地址: http://www.cveoy.top/t/topic/fB6O 著作权归作者所有。请勿转载和采集!