基于SQLite和TCP的智能家居状态监控系统
基于SQLite和TCP的智能家居状态监控系统
本文介绍一个简单的智能家居状态监控系统示例,该系统使用SQLite数据库存储设备状态,并通过TCP通信在服务器和客户端之间传递数据。
一、系统架构
本系统包含服务器端和客户端两部分:
- 服务器端(Linux C语言实现): * 监听客户端连接请求。 * 接收客户端发送的userid。 * 连接SQLite数据库,根据userid查询对应用户的设备状态信息。 * 根据预设规则分析设备状态,生成建议信息。 * 将建议信息发送给客户端。* 客户端(QT C++实现): * 提供图形界面,包含一个连接按钮和一个文本框。 * 点击连接按钮,与服务器建立TCP连接。 * 连接成功后,向服务器发送预设的userid。 * 接收服务器返回的建议信息,并显示在文本框中。
二、数据库设计
本系统使用SQLite数据库,包含以下两张表:
- users表: 存储用户信息,包含uid和username等字段。* Status表: 存储设备状态信息,包含sid、uid、device_name、device_state、value和mode等字段,其中uid关联users表。
三、代码实现
1. 服务器端代码(Linux C语言)c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sqlite3.h>
#define DB_PATH 'database.db'
// 数据库回调函数int db_callback(void* data, int argc, char** argv, char** col_names) { // 获取设备名称和最新状态值 char* device_name = argv[0]; char* value = argv[1];
// 根据设备名称和状态值进行分析,并给出建议 if (strcmp(device_name, '空调') == 0) { int temp = atoi(value); if (temp < 24) { printf('空调温度过低,建议提高温度至26℃\n'); } } else if (strcmp(device_name, '加湿器') == 0) { int humidity = atoi(value); if (humidity < 40 || humidity > 70) { printf('加湿器湿度过高或过低,建议调整加湿器湿度\n'); } }
return 0;}
int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_addr_len;
// 创建服务器套接字 server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { perror('Failed to create socket'); exit(EXIT_FAILURE); }
// 设置服务器地址和端口 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(12345);
// 绑定服务器套接字到指定地址和端口 if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror('Failed to bind'); exit(EXIT_FAILURE); }
// 监听连接请求 if (listen(server_fd, 5) == -1) { perror('Failed to listen'); exit(EXIT_FAILURE); }
printf('Server is running...\n');
while (1) { // 接受客户端连接请求 client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_len); if (client_fd == -1) { perror('Failed to accept'); continue; }
printf('Client connected\n');
// 接收客户端发送的userid int userid; if (recv(client_fd, &userid, sizeof(userid), 0) == -1) { perror('Failed to receive userid'); close(client_fd); continue; }
printf('Received userid: %d\n', userid);
// 连接数据库 sqlite3* db; if (sqlite3_open(DB_PATH, &db) != SQLITE_OK) { fprintf(stderr, 'Failed to open database: %s\n', sqlite3_errmsg(db)); close(client_fd); continue; }
// 查询数据库获取状态信息 char sql[100]; snprintf(sql, sizeof(sql), 'SELECT device_name, value FROM Status WHERE uid = %d', userid); if (sqlite3_exec(db, sql, db_callback, NULL, NULL) != SQLITE_OK) { fprintf(stderr, 'Failed to execute SQL statement: %s\n', sqlite3_errmsg(db)); }
// 关闭数据库连接 sqlite3_close(db);
// 关闭客户端套接字 close(client_fd);
printf('Client disconnected\n'); }
// 关闭服务器套接字 close(server_fd);
return 0;}
2. 客户端代码(QT C++)cpp#include #include
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(this); layout->addWidget(connectButton); layout->addWidget(textEdit); }
private slots: void connectToServer() { // 创建套接字 QTcpSocket* socket = new QTcpSocket(this);
// 连接服务器 socket->connectToHost('127.0.0.1', 12345); if (!socket->waitForConnected()) { textEdit->setText('Connection failed'); return; }
textEdit->setText('Connected to server');
// 发送userid int userid = 123; // 替换为实际的userid socket->write(reinterpret_cast<const char*>(&userid), sizeof(userid)); socket->waitForBytesWritten();
// 接收服务器返回的信息 socket->waitForReadyRead(); QByteArray data = socket->readAll(); textEdit->append(QString(data));
// 关闭套接字 socket->close(); }
private: QTextEdit* textEdit;};
int main(int argc, char** argv) { QApplication app(argc, argv);
Client client; client.show();
return app.exec();}
#include 'main.moc'
四、总结
本示例代码演示了如何使用SQLite数据库和TCP通信实现一个简单的智能家居状态监控系统。实际应用中,可以根据需求扩展功能,例如:
- 添加用户登录验证功能。* 实现更复杂的设备状态分析和建议生成算法。* 使用更安全可靠的通信协议。
希望本文能够为开发者提供一些参考和帮助。
原文地址: http://www.cveoy.top/t/topic/fB67 著作权归作者所有。请勿转载和采集!