创建用户表

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;
}

请注意,这只是一个示例代码,实际应用中可能需要根据具体需求进行适当修改。此外,还需要在服务器端进行数据库查询和建议制定的实现。

Qt C++ 客户端和 Linux C 服务器 HTTP 数据通信示例 - 智能家居状态建议

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

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