Qt C++ 客户端和 Linux C 服务器 HTTP 数据通信示例 - 智能家居状态建议
创建用户表
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++ 和 Linux C 服务器进行 http 数据通信的代码:
客户端 Qt C++ 代码:
#include <QtNetwork>
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QNetworkAccessManager manager;
QNetworkRequest request;
// 设置请求URL
request.setUrl(QUrl('http://localhost:8080'));
// 发送问候消息给服务器
QJsonObject greeting;
greeting['message'] = 'Hello server!';
QJsonDocument greetingDoc(greeting);
QByteArray greetingData = greetingDoc.toJson();
manager.post(request, greetingData);
// 接收服务器的回复
QObject::connect(&manager, &QNetworkAccessManager::finished, [&](QNetworkReply *reply) {
QByteArray responseData = reply->readAll();
QJsonDocument responseDoc = QJsonDocument::fromJson(responseData);
QJsonObject responseObj = responseDoc.object();
QString advice = responseObj['advice'].toString();
qDebug() << 'Received advice from server: ' << advice;
// 在GUI中显示建议
});
return a.exec();
}
Linux C 服务器代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_BUFFER_SIZE 1024
void handleClient(int clientSocket) {
char buffer[MAX_BUFFER_SIZE];
memset(buffer, 0, MAX_BUFFER_SIZE);
// 接收客户端的问候消息
ssize_t bytesRead = recv(clientSocket, buffer, MAX_BUFFER_SIZE, 0);
if (bytesRead > 0) {
printf('Received greeting from client: %s\n', buffer);
// 从数据库中获取智能家居状态表最新的温度、湿度数据
// 制定建议
char advice[MAX_BUFFER_SIZE];
snprintf(advice, MAX_BUFFER_SIZE, '空调温度过低,建议提高温度至26℃;加湿器湿度过高或过低,建议调整加湿器湿度');
// 将建议发送给客户端
send(clientSocket, advice, strlen(advice), 0);
}
close(clientSocket);
}
int main() {
int serverSocket, clientSocket;
struct sockaddr_in serverAddress, clientAddress;
socklen_t clientAddressLength = sizeof(clientAddress);
// 创建服务器socket
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
perror('Failed to create socket');
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&serverAddress, 0, sizeof(serverAddress));
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(8080);
// 绑定服务器地址
if (bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) {
perror('Failed to bind socket');
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(serverSocket, 5) < 0) {
perror('Failed to listen');
exit(EXIT_FAILURE);
}
while (1) {
// 接受客户端连接
clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddress, &clientAddressLength);
if (clientSocket < 0) {
perror('Failed to accept connection');
exit(EXIT_FAILURE);
}
// 处理客户端请求
handleClient(clientSocket);
}
close(serverSocket);
return 0;
}
请注意,这只是一个示例代码,实际应用中可能需要根据具体需求进行适当修改。此外,还需要在服务器端进行数据库查询和建议制定的实现。
原文地址: https://www.cveoy.top/t/topic/fBna 著作权归作者所有。请勿转载和采集!