基于C语言和SQLite的物联网服务器端程序设计

这篇博客文章介绍了如何使用C语言和SQLite数据库开发一个简单的物联网服务器端程序。

功能

该服务器程序可以接收来自客户端的请求,并根据数据库中存储的传感器数据提供建议。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <json-c/json.h>
#include 'server.h'

#define DATABASE 'database.db'

struct Status {
    int sid; // 状态ID
    int uid; // 用户ID
    char device_name[10]; // 设备名称
    char device_state[10]; // 设备状态
    char value[10]; // 值
    char mode[10]; // 模式
};

void handleClientRequest(int clientSocket) {
    char buffer[1024];
    int bytesRead = read(clientSocket, buffer, sizeof(buffer));
    if (bytesRead < 0) {
        perror('从套接字读取数据出错');
        exit(1);
    }

    // 解析JSON请求
    struct json_object* jsonRequest = json_tokener_parse(buffer);
    if (jsonRequest == NULL) {
        perror('解析JSON出错');
        exit(1);
    }

    // 从JSON请求中获取用户ID
    struct json_object* jsonUserID;
    json_object_object_get_ex(jsonRequest, 'userid', &jsonUserID);
    int uid = json_object_get_int(jsonUserID);

    // 处理温度湿度请求
    handleTemperatureHumidity(clientSocket, uid);

    // 清理资源
    json_object_put(jsonRequest);
}

void handleTemperatureHumidity(int clientSocket, int uid) {
    sqlite3* db;
    int rc = sqlite3_open(DATABASE, &db);
    if (rc != SQLITE_OK) {
        perror('打开数据库出错');
        exit(1);
    }

    char query[100];
    snprintf(query, sizeof(query), 'SELECT * FROM Status WHERE uid = %d', uid);

    sqlite3_stmt* stmt;
    rc = sqlite3_prepare_v2(db, query, -1, &stmt, 0);
    if (rc != SQLITE_OK) {
        perror('准备SQL语句出错');
        exit(1);
    }

    // 获取用户的最新温度和湿度值
    int temperature = 0;
    int humidity = 0;

    while (sqlite3_step(stmt) == SQLITE_ROW) {
        struct Status status;
        status.sid = sqlite3_column_int(stmt, 0);
        status.uid = sqlite3_column_int(stmt, 1);
        strcpy(status.device_name, (char*)sqlite3_column_text(stmt, 2));
        strcpy(status.device_state, (char*)sqlite3_column_text(stmt, 3));
        strcpy(status.value, (char*)sqlite3_column_text(stmt, 4));
        strcpy(status.mode, (char*)sqlite3_column_text(stmt, 5));

        if (strcmp(status.device_name, 'Temperature') == 0) {
            temperature = atoi(status.value);
        } else if (strcmp(status.device_name, 'Humidity') == 0) {
            humidity = atoi(status.value);
        }
    }

    // 根据温度和湿度值获取建议
    char* advice = getAdvice(temperature, humidity);

    // 将建议发送给客户端
    sendResponse(clientSocket, advice);

    // 清理资源
    sqlite3_finalize(stmt);
    sqlite3_close(db);
}

void sendResponse(int clientSocket, const char* response) {
    int bytesWritten = write(clientSocket, response, strlen(response));
    if (bytesWritten < 0) {
        perror('写入套接字出错');
        exit(1);
    }
}

char* getAdvice(int temperature, int humidity) {
    char* advice = (char*)malloc(100);

    if (temperature < 24) {
        snprintf(advice, 100, '温度过低,请将温度调高至 26°C。');
    } else if (humidity < 40 || humidity > 70) {
        snprintf(advice, 100, '湿度过高或过低,请调整湿度水平。');
    } else {
        snprintf(advice, 100, '暂无建议。');
    }

    return advice;
}

解释

  • 该程序使用SQLite数据库来存储传感器数据。
  • 它使用JSON格式来解析来自客户端的请求和发送响应。
  • 函数handleClientRequest()处理来自客户端的请求。
  • 函数handleTemperatureHumidity()从数据库中检索温度和湿度数据,并根据这些数据生成建议。
  • 函数sendResponse()将建议发送回客户端。

QT和服务器不能连接

在代码中,并没有包含与QT相关的内容,因此无法判断具体的问题所在。可能的原因包括:

  1. 服务器未正确启动:请确保服务器已正确启动,并监听正确的IP地址和端口号。
  2. IP地址和端口号设置错误:请检查QT代码中连接服务器的IP地址和端口号是否与服务器设置一致。
  3. 防火墙或网络设置问题:请确保防火墙或网络设置不会阻止QT与服务器之间的连接。
  4. 服务器返回错误:请检查服务器的返回值是否正确,并确保服务器能够正确处理QT发送的请求。

如果以上方法都无法解决问题,请提供更多的代码和错误信息,以便更好地帮助你解决问题。

基于C语言和SQLite的物联网服务器端程序设计

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

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