智能家居系统服务器与客户端TCP通信示例代码
以下是一个简单的示例代码,演示了如何使用Linux C语言编写服务器,并使用QT C++编写客户端进行TCP通信。
服务器端代码(server.c):
#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>
#include <json-c/json.h>
#define PORT 8080
#define DATABASE 'database.db'
// 回调函数,用于处理查询结果
int callback(void *data, int argc, char **argv, char **azColName) {
// 解析查询结果
int uid = atoi(argv[0]);
char *device_name = argv[1];
char *device_state = argv[2];
char *value = argv[3];
// 进行分析得出建议
char suggestion[100];
if (strcmp(device_name, '空调') == 0 && atoi(value) < 24) {
strcpy(suggestion, '空调温度过低,建议提高温度至26℃');
} else if (strcmp(device_name, '加湿器') == 0 && (atoi(value) < 40 || atoi(value) > 70)) {
strcpy(suggestion, '加湿器湿度过高或过低,建议调整加湿器湿度');
} else {
strcpy(suggestion, '无建议');
}
// 将建议发送给客户端
int client_sock = *(int *)data;
char response[100];
sprintf(response, '{\"suggestion\":\"%s\" }', suggestion);
send(client_sock, response, strlen(response), 0);
return 0;
}
int main() {
int server_sock, client_sock, recv_len;
struct sockaddr_in server_addr, client_addr;
char buffer[1024];
// 创建服务器套接字
server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock < 0) {
perror('Failed to create socket');
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// 绑定套接字到服务器地址
if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror('Failed to bind socket');
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_sock, 5) < 0) {
perror('Failed to listen');
exit(EXIT_FAILURE);
}
printf('Server started, waiting for connections...
');
while (1) {
// 接受客户端连接
socklen_t client_len = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &client_len);
if (client_sock < 0) {
perror('Failed to accept connection');
exit(EXIT_FAILURE);
}
printf('Client connected: %s:%d\n', inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 接收JSON数据
recv_len = recv(client_sock, buffer, sizeof(buffer), 0);
if (recv_len > 0) {
buffer[recv_len] = '\0';
printf('Received JSON data: %s\n', buffer);
// 解析JSON数据
struct json_object *json, *userid_json;
json = json_tokener_parse(buffer);
if (json_object_object_get_ex(json, 'userid', &userid_json)) {
int userid = json_object_get_int(userid_json);
// 连接数据库
sqlite3 *db;
if (sqlite3_open(DATABASE, &db) == SQLITE_OK) {
char sql[100];
sprintf(sql, 'SELECT uid, device_name, device_state, value FROM Status WHERE uid = %d', userid);
// 查询数据库
char *errmsg;
if (sqlite3_exec(db, sql, callback, &client_sock, &errmsg) != SQLITE_OK) {
fprintf(stderr, 'SQL error: %s\n', errmsg);
sqlite3_free(errmsg);
}
sqlite3_close(db);
} else {
fprintf(stderr, 'Failed to open database: %s\n', sqlite3_errmsg(db));
}
}
}
close(client_sock);
printf('Client disconnected\n');
}
close(server_sock);
return 0;
}
客户端代码(client.cpp):
#include <QCoreApplication>
#include <QTcpSocket>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QDebug>
#define SERVER_IP '127.0.0.1'
#define SERVER_PORT 8080
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
// 创建TCP套接字
QTcpSocket socket;
socket.connectToHost(SERVER_IP, SERVER_PORT);
if (!socket.waitForConnected()) {
qDebug() << 'Failed to connect to server';
return 1;
}
// 构建JSON数据
QJsonObject json;
json.insert('userid', 123);
QJsonDocument doc(json);
QByteArray data = doc.toJson();
// 发送JSON数据
socket.write(data);
socket.waitForBytesWritten();
// 接收服务器响应
socket.waitForReadyRead();
QByteArray response = socket.readAll();
// 解析JSON响应
QJsonParseError error;
QJsonDocument responseDoc = QJsonDocument::fromJson(response, &error);
if (error.error != QJsonParseError::NoError) {
qDebug() << 'Failed to parse JSON response:' << error.errorString();
return 1;
}
QJsonObject responseObject = responseDoc.object();
QString suggestion = responseObject.value('suggestion').toString();
qDebug() << 'Received suggestion:' << suggestion;
return a.exec();
}
请注意,这只是一个简单的示例,仅演示了服务器和客户端之间的基本通信和JSON数据解析。您需要根据自己的需求进行修改和扩展。此外,您还需要安装SQLite和json-c库,并在编译时链接相应的库。
原文地址: http://www.cveoy.top/t/topic/fB6j 著作权归作者所有。请勿转载和采集!