{"title":"C语言智能家居服务器代码示例:基于Linux Ubuntu实现用户认证、状态更新和数据库交互","description":"本示例代码演示了如何使用C语言在Linux Ubuntu系统上构建一个简单的智能家居服务器,通过TCP/IP协议接收客户端请求,实现用户认证、智能家居状态更新等功能,并使用SQLite数据库进行数据存储。","keywords":"C语言, 服务器, 智能家居, Linux, Ubuntu, TCP/IP, SQLite, 数据库, 用户认证, 状态更新","content":"#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdbool.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n#include <arpa/inet.h>\n#include <sqlite3.h>\n\n#define MAX_BUFFER_SIZE 1024\n\n// 数据库文件路径\n#define DATABASE_PATH "home_automation.db"\n\n// 服务器监听地址和端口\n#define SERVER_IP "127.0.0.1"\n#define SERVER_PORT 8888\n\n// 命令类型\nenum CommandType {\n Login,\n Register,\n LightSwitch,\n LightIntensity,\n ACState,\n HumidifierState,\n CurtainState,\n CurtainHeight,\n Mode\n};\n\n// 命令结构体\ntypedef struct {\n enum CommandType type;\n char username[64];\n char password[64];\n bool state;\n int value;\n} Command;\n\n// 连接数据库\nsqlite3 *connectDatabase() {\n sqlite3 *db;\n int rc;\n\n rc = sqlite3_open(DATABASE_PATH, &db);\n\n if (rc != SQLITE_OK) {\n fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));\n return NULL;\n }\n\n return db;\n}\n\n// 关闭数据库连接\nvoid closeDatabase(sqlite3 *db) {\n sqlite3_close(db);\n}\n\n// 验证用户登录\nbool verifyLogin(const char *username, const char *password) {\n sqlite3 *db = connectDatabase();\n bool result = false;\n\n if (db == NULL) {\n return result;\n }\n\n sqlite3_stmt *stmt;\n const char *query = "SELECT * FROM users WHERE username = ? AND password = ?";\n int rc = sqlite3_prepare_v2(db, query, -1, &stmt, NULL);\n\n if (rc != SQLITE_OK) {\n fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db));\n closeDatabase(db);\n return result;\n }\n\n sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);\n sqlite3_bind_text(stmt, 2, password, -1, SQLITE_STATIC);\n\n rc = sqlite3_step(stmt);\n\n if (rc == SQLITE_ROW) {\n result = true;\n }\n\n sqlite3_finalize(stmt);\n closeDatabase(db);\n return result;\n}\n\n// 注册新用户\nbool registerUser(const char *username, const char *password) {\n sqlite3 *db = connectDatabase();\n bool result = false;\n\n if (db == NULL) {\n return result;\n }\n\n sqlite3_stmt *stmt;\n const char *query = "INSERT INTO users (username, password) VALUES (?, ?)";\n int rc = sqlite3_prepare_v2(db, query, -1, &stmt, NULL);\n\n if (rc != SQLITE_OK) {\n fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db));\n closeDatabase(db);\n return result;\n }\n\n sqlite3_bind_text(stmt, 1, username, -1, SQLITE_STATIC);\n sqlite3_bind_text(stmt, 2, password, -1, SQLITE_STATIC);\n\n rc = sqlite3_step(stmt);\n\n if (rc == SQLITE_DONE) {\n result = true;\n }\n\n sqlite3_finalize(stmt);\n closeDatabase(db);\n return result;\n}\n\n// 更新智能家居状态\nbool updateHomeAutomationState(const char *username, const Command *command) {\n sqlite3 db = connectDatabase();\n bool result = false;\n\n if (db == NULL) {\n return result;\n }\n\n sqlite3_stmt stmt;\n int rc;\n\n switch (command->type) {\n case LightSwitch:\n rc = sqlite3_prepare_v2(db, "UPDATE home_status SET light_state = ? WHERE username = ?", -1, &stmt, NULL);\n sqlite3_bind_int(stmt, 1, command->state);\n sqlite3_bind_text(stmt, 2, username, -1, SQLITE_STATIC);\n break;\n case LightIntensity:\n rc = sqlite3_prepare_v2(db, "UPDATE home_status SET light_intensity = ? WHERE username = ?", -1, &stmt, NULL);\n sqlite3_bind_int(stmt, 1, command->value);\n sqlite3_bind_text(stmt, 2, username, -1, SQLITE_STATIC);\n break;\n case ACState:\n rc = sqlite3_prepare_v2(db, "UPDATE home_status SET ac_state = ? WHERE username = ?", -1, &stmt, NULL);\n sqlite3_bind_int(stmt, 1, command->state);\n sqlite3_bind_text(stmt, 2, username, -1, SQLITE_STATIC);\n break;\n case HumidifierState:\n rc = sqlite3_prepare_v2(db, "UPDATE home_status SET humidifier_state = ? WHERE username = ?", -1, &stmt, NULL);\n sqlite3_bind_int(stmt, 1, command->state);\n sqlite3_bind_text(stmt, 2, username, -1, SQLITE_STATIC);\n break;\n case CurtainState:\n rc = sqlite3_prepare_v2(db, "UPDATE home_status SET curtain_state = ? WHERE username = ?", -1, &stmt, NULL);\n sqlite3_bind_int(stmt, 1, command->state);\n sqlite3_bind_text(stmt, 2, username, -1, SQLITE_STATIC);\n break;\n case CurtainHeight:\n rc = sqlite3_prepare_v2(db, "UPDATE home_status SET curtain_height = ? WHERE username = ?", -1, &stmt, NULL);\n sqlite3_bind_int(stmt, 1, command->value);\n sqlite3_bind_text(stmt, 2, username, -1, SQLITE_STATIC);\n break;\n case Mode:\n rc = sqlite3_prepare_v2(db, "UPDATE home_status SET mode = ? WHERE username = ?", -1, &stmt, NULL);\n sqlite3_bind_int(stmt, 1, command->value);\n sqlite3_bind_text(stmt, 2, username, -1, SQLITE_STATIC);\n break;\n }\n\n if (rc != SQLITE_OK) {\n fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db));\n closeDatabase(db);\n return result;\n }\n\n rc = sqlite3_step(stmt);\n\n if (rc == SQLITE_DONE) {\n result = true;\n }\n\n sqlite3_finalize(stmt);\n closeDatabase(db);\n return result;\n}\n\n// 处理客户端请求\nvoid handleClientRequest(int clientSocket) {\n char buffer[MAX_BUFFER_SIZE];\n memset(buffer, 0, MAX_BUFFER_SIZE);\n\n // 接收命令\n ssize_t bytesRead = recv(clientSocket, buffer, MAX_BUFFER_SIZE - 1, 0);\n\n if (bytesRead < 0) {\n perror("Failed to receive data");\n return;\n }\n\n Command command;\n memcpy(&command, buffer, sizeof(Command));\n\n // 处理命令\n bool success = false;\n\n switch (command.type) {\n case Login:\n success = verifyLogin(command.username, command.password);\n break;\n case Register:\n success = registerUser(command.username, command.password);\n break;\n case LightSwitch:\n case LightIntensity:\n case ACState:\n case HumidifierState:\n case CurtainState:\n case CurtainHeight:\n case Mode:\n success = updateHomeAutomationState(command.username, &command);\n break;\n }\n\n // 发送处理结果\n ssize_t bytesSent = send(clientSocket, &success, sizeof(bool), 0);\n\n if (bytesSent < 0) {\n perror("Failed to send data");\n }\n}\n\nint main() {\n int serverSocket;\n struct sockaddr_in serverAddress;\n\n // 创建服务器套接字\n serverSocket = socket(AF_INET, SOCK_STREAM, 0);\n if (serverSocket < 0) {\n perror("Failed to create socket");\n exit(EXIT_FAILURE);\n }\n\n // 设置服务器地址和端口\n memset(&serverAddress, 0, sizeof(serverAddress));\n serverAddress.sin_family = AF_INET;\n serverAddress.sin_port = htons(SERVER_PORT);\n if (inet_pton(AF_INET, SERVER_IP, &(serverAddress.sin_addr)) <= 0) {\n perror("Invalid address or address not supported");\n exit(EXIT_FAILURE);\n }\n\n // 绑定套接字到地址和端口\n if (bind(serverSocket, (struct sockaddr)&serverAddress, sizeof(serverAddress)) < 0) {\n perror("Failed to bind socket");\n exit(EXIT_FAILURE);\n }\n\n // 监听连接\n if (listen(serverSocket, 5) < 0) {\n perror("Failed to listen on socket");\n exit(EXIT_FAILURE);\n }\n\n printf("Server is running on %s:%d\n", SERVER_IP, SERVER_PORT);\n\n while (true) {\n int clientSocket;\n struct sockaddr_in clientAddress;\n socklen_t clientAddressLength;\n\n // 接受客户端连接\n clientSocket = accept(serverSocket, (struct sockaddr)&clientAddress, &clientAddressLength);\n if (clientSocket < 0) {\n perror("Failed to accept client connection");\n continue;\n }\n\n // 处理客户端请求\n handleClientRequest(clientSocket);\n\n // 关闭客户端套接字\n close(clientSocket);\n }\n\n // 关闭服务器套接字\n close(serverSocket);\n\n return 0;\n}\n"}

C语言智能家居服务器代码示例:基于Linux Ubuntu实现用户认证、状态更新和数据库交互

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

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