/**
* @file cloud.h
* @brief 云通信层头文件
* @author Optimized Version 1.1
* @date 2025-10-14
*
* 本文件定义了云通信相关的数据结构、常量和函数接口。
* 提供统一的MQTT通信抽象,支持多种IoT平台。
*
* 优化内容:
* - 重构了云通信架构
* - 增加了详细的错误处理
* - 优化了数据传输格式
* - 增加了连接状态管理
* - 完善了注释文档
*/
// POSIX feature test macros MUST be defined before any system headers
// Use comprehensive setup to ensure all pthread features are available
#ifndef _GNU_SOURCE
#define _GNU_SOURCE // Enable all GNU extensions
#endif
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200809L // POSIX.1-2008 (includes pthread_rwlock_t)
#endif
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE 700 // X/Open 7, POSIX.1-2008 with XSI extensions
#endif
#define __USE_XOPEN2K // Enable X/Open extensions for pthread_rwlock_t
#define __USE_XOPEN2K_EXTENDED // Enable extended X/Open features
#ifndef CLOUD_H
#define CLOUD_H
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <mosquitto.h>
#include <pthread.h>
#include <time.h>
#include "cjson/cJSON.h"
#include "error_codes.h"
#include "sensor.h"
// ==================== 云通信配置 ====================
// MQTT连接参数
#define MQTT_QOS_LEVEL 1 // MQTT服务质量等级
#define MQTT_KEEPALIVE_INTERVAL 60 // 保活间隔(秒)
#define MQTT_CONNECTION_TIMEOUT 30 // 连接超时(秒)
#define MQTT_MAX_RETRY_ATTEMPTS 3 // 最大重试次数
#define MQTT_RECONNECT_INTERVAL 5 // 重连间隔(秒)
// 华为IoTDA平台配置
#define HUAWEI_SERVER_URL "2a1af84511.st1.iotda-device.cn-east-3.myhuaweicloud.com"
#define HUAWEI_PORT 1883
#define HUAWEI_USERNAME "688c23957d33413cbad53994_Grape_test"
#define HUAWEI_PASSWORD "0c1dc92e72847593a126ab14a97655917021547a9709b3a733460ccf003beaca"
#define HUAWEI_CLIENT_ID "688c23957d33413cbad53994_Grape_test_0_0_2025091113"
// MQTT主题配置
#define MQTT_TOPIC_SUBSCRIBE "$oc/devices/688c23957d33413cbad53994_Grape_test/user/get"
#define MQTT_TOPIC_PROPERTY_REPORT "$oc/devices/Grape_Device1/sys/properties/report"
#define MQTT_TOPIC_MESSAGE_UP "$oc/devices/Grape_Device1/sys/messages/up"
#define MQTT_TOPIC_COMMAND_RESPONSE "$oc/devices/688c23957d33413cbad53994_Grape_test/user/get"
// 缓冲区大小
#define CLOUD_TX_BUFFER_SIZE 8000 // 发送缓冲区大小
#define CLOUD_RX_BUFFER_SIZE 256 // 接收缓冲区大小
#define CLOUD_JSON_BUFFER_SIZE 4096 // JSON缓冲区大小
// 最大长度限制
#define MAX_SERVER_URL_LENGTH 127 // 服务器URL最大长度
#define MAX_CLIENT_ID_LENGTH 127 // 客户端ID最大长度
// ==================== 枚举定义 ====================
/**
* @brief 云平台类型枚举
*/
typedef enum {
CLOUD_PLATFORM_HUAWEI = 0, // 华为IoTDA平台
CLOUD_PLATFORM_ALIYUN, // 阿里云IoT平台
CLOUD_PLATFORM_TENCENT, // 腾讯云IoT平台
CLOUD_PLATFORM_CUSTOM, // 自定义平台
CLOUD_PLATFORM_MAX // 平台类型最大值
} cloud_platform_type_t;
/**
* @brief 云连接状态枚举
*/
typedef enum {
CLOUD_STATUS_DISCONNECTED = 0, // 未连接
CLOUD_STATUS_CONNECTING, // 连接中
CLOUD_STATUS_CONNECTED, // 已连接
CLOUD_STATUS_RECONNECTING, // 重连中
CLOUD_STATUS_ERROR, // 连接错误
CLOUD_STATUS_DISABLED // 已禁用
} cloud_connection_status_t;
/**
* @brief 消息类型枚举
*/
typedef enum {
CLOUD_MSG_TYPE_PROPERTY = 0, // 属性上报消息
CLOUD_MSG_TYPE_EVENT, // 事件上报消息
CLOUD_MSG_TYPE_COMMAND, // 命令消息
CLOUD_MSG_TYPE_RESPONSE, // 响应消息
CLOUD_MSG_TYPE_HEARTBEAT, // 心跳消息
CLOUD_MSG_TYPE_IMAGE, // 图像消息
CLOUD_MSG_TYPE_MAX // 消息类型最大值
} cloud_message_type_t;
// 云通信错误码枚举定义已移至 error_codes.h
// ==================== 数据结构定义 ====================
/**
* @brief 云平台配置结构体
*/
typedef struct {
cloud_platform_type_t platform_type; // 平台类型
char server_url[128]; // 服务器URL
int port; // 端口号
char client_id[128]; // 客户端ID
char username[128]; // 用户名
char password[256]; // 密码
char subscribe_topic[256]; // 订阅主题
char publish_topic[256]; // 发布主题
int keepalive; // 保活间隔
int qos; // 服务质量等级
bool auto_reconnect; // 自动重连
bool enabled; // 是否启用
} cloud_config_t;
/**
* @brief 云连接状态结构体
*/
typedef struct {
cloud_connection_status_t status; // 连接状态
time_t last_connect_time; // 最后连接时间
time_t last_activity_time; // 最后活动时间
uint32_t reconnect_count; // 重连次数
uint32_t message_sent_count; // 发送消息计数
uint32_t message_received_count; // 接收消息计数
uint32_t error_count; // 错误计数
cloud_error_code_t last_error; // 最后错误码
char last_error_msg[256]; // 最后错误信息
} cloud_connection_info_t;
/**
* @brief 云消息结构体
*/
typedef struct {
cloud_message_type_t msg_type; // 消息类型
char topic[256]; // 主题
char payload[CLOUD_JSON_BUFFER_SIZE]; // 消息载荷
size_t payload_length; // 载荷长度
uint32_t timestamp; // 时间戳
int qos; // 服务质量等级
bool retain; // 是否保留消息
char message_id[64]; // 消息ID
} cloud_message_t;
/**
* @brief 云通信管理结构体
*/
typedef struct {
struct mosquitto* mosq; // MQTT客户端实例
cloud_config_t config; // 云平台配置
cloud_connection_info_t conn_info; // 连接信息
pthread_mutex_t send_mutex; // 发送互斥锁
pthread_mutex_t recv_mutex; // 接收互斥锁
pthread_cond_t send_cond; // 发送条件变量
pthread_cond_t recv_cond; // 接收条件变量
pthread_rwlock_t status_rwlock; // 状态读写锁
bool is_running; // 运行状态
bool should_exit; // 退出标志
pthread_t worker_thread; // 工作线程
} cloud_manager_t;
// ==================== 全局变量声明 ====================
// 云通信管理器
extern cloud_manager_t g_cloud_manager;
// 全局MQTT客户端实例(兼容原有代码)
extern struct mosquitto* mosq;
// 通信缓冲区(兼容原有代码)
extern char g_cloud_tx_data[CLOUD_TX_BUFFER_SIZE];
extern char g_cloud_rx_data[CLOUD_RX_BUFFER_SIZE];
extern char g_received_command[CLOUD_RX_BUFFER_SIZE];
// 同步原语(兼容原有代码)
extern pthread_rwlock_t g_cmd_rwlock;
extern pthread_cond_t g_cmd_cond;
extern pthread_mutex_t g_cmd_mutex;
extern pthread_rwlock_t g_cloud_data_rwlock;
extern pthread_cond_t g_cloud_data_cond;
extern pthread_mutex_t g_cloud_data_mutex;
// ==================== 云通信管理函数 ====================
/**
* @brief 初始化云通信模块
* @param config 云平台配置
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_init(const cloud_config_t* config);
/**
* @brief 反初始化云通信模块
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_deinit(void);
/**
* @brief 启动云通信服务
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_start(void);
/**
* @brief 停止云通信服务
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_stop(void);
/**
* @brief 连接到云平台
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_connect(void);
/**
* @brief 断开云平台连接
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_disconnect(void);
/**
* @brief 重新连接云平台
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_reconnect(void);
// ==================== 连接状态管理函数 ====================
/**
* @brief 获取云连接状态
* @return cloud_connection_status_t 连接状态
*/
cloud_connection_status_t cloud_get_status(void);
/**
* @brief 设置云连接状态
* @param status 连接状态
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_set_status(cloud_connection_status_t status);
/**
* @brief 获取连接信息
* @param conn_info 连接信息输出指针
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_get_connection_info(cloud_connection_info_t* conn_info);
/**
* @brief 重置连接统计信息
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_reset_statistics(void);
// ==================== 消息发送函数 ====================
/**
* @brief 发送云消息
* @param message 消息结构体指针
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_send_message(const cloud_message_t* message);
/**
* @brief 发布属性数据
* @param sensor_data 传感器数据
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_publish_properties(const environment_sensor_data_t* sensor_data);
/**
* @brief 发布控制板数据
* @param control_data 控制板数据
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_publish_control_data(const control_board_data_t* control_data);
/**
* @brief 发布图像数据
* @param image_path 图像文件路径
* @param image_description 图像描述
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_publish_image(const char* image_path, const char* image_description);
/**
* @brief 发布事件消息
* @param event_type 事件类型
* @param event_data 事件数据
* @param event_level 事件级别
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_publish_event(const char* event_type, const char* event_data, int event_level);
/**
* @brief 发送命令响应
* @param command_id 命令ID
* @param response_data 响应数据
* @param result_code 结果码
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_send_command_response(const char* command_id, const char* response_data, int result_code);
// ==================== 消息接收函数 ====================
/**
* @brief 接收云消息
* @param message 消息结构体输出指针
* @param timeout_ms 超时时间(毫秒)
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_receive_message(cloud_message_t* message, int timeout_ms);
/**
* @brief 处理接收到的命令
* @param command_data 命令数据
* @param command_length 命令长度
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_process_command(const char* command_data, size_t command_length);
/**
* @brief 解析云消息
* @param topic 消息主题
* @param payload 消息载荷
* @param payload_length 载荷长度
* @param message 解析后的消息结构体
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_parse_message(const char* topic, const void* payload,
size_t payload_length, cloud_message_t* message);
// ==================== JSON构建函数 ====================
/**
* @brief 构建属性上报JSON
* @param sensor_data 传感器数据
* @param json_buffer JSON输出缓冲区
* @param buffer_size 缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_build_properties_json(const environment_sensor_data_t* sensor_data,
char* json_buffer, size_t buffer_size);
/**
* @brief 构建控制板数据JSON
* @param control_data 控制板数据
* @param json_buffer JSON输出缓冲区
* @param buffer_size 缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_build_control_json(const control_board_data_t* control_data,
char* json_buffer, size_t buffer_size);
/**
* @brief 构建图像消息JSON
* @param base64_image Base64编码的图像数据
* @param image_description 图像描述
* @param json_buffer JSON输出缓冲区
* @param buffer_size 缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_build_image_json(const char* base64_image, const char* image_description,
char* json_buffer, size_t buffer_size);
/**
* @brief 构建事件消息JSON
* @param event_type 事件类型
* @param event_data 事件数据
* @param event_level 事件级别
* @param json_buffer JSON输出缓冲区
* @param buffer_size 缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_build_event_json(const char* event_type, const char* event_data,
int event_level, char* json_buffer, size_t buffer_size);
/**
* @brief 构建命令响应JSON
* @param command_id 命令ID
* @param response_data 响应数据
* @param result_code 结果码
* @param json_buffer JSON输出缓冲区
* @param buffer_size 缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_build_response_json(const char* command_id, const char* response_data,
int result_code, char* json_buffer, size_t buffer_size);
// ==================== 数据验证函数 ====================
/**
* @brief 验证传感器数据有效性
* @param sensor_data 传感器数据
* @return true 数据有效,false 数据无效
*/
bool cloud_validate_sensor_data(const environment_sensor_data_t* sensor_data);
/**
* @brief 验证控制板数据有效性
* @param control_data 控制板数据
* @return true 数据有效,false 数据无效
*/
bool cloud_validate_control_data(const control_board_data_t* control_data);
/**
* @brief 验证JSON格式有效性
* @param json_string JSON字符串
* @return true 格式有效,false 格式无效
*/
bool cloud_validate_json_format(const char* json_string);
// ==================== 心跳和保活函数 ====================
/**
* @brief 发送心跳消息
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_send_heartbeat(void);
/**
* @brief 心跳线程函数
* @param arg 线程参数
* @return void* 线程返回值
*/
void* cloud_heartbeat_thread(void* arg);
// ==================== 错误处理函数 ====================
/**
* @brief 获取云错误描述字符串
* @param error_code 错误码
* @return const char* 错误描述字符串
*/
const char* cloud_get_error_string(cloud_error_code_t error_code);
/**
* @brief 处理云通信错误
* @param error_code 错误码
* @param error_msg 错误信息
* @return cloud_error_code_t 处理结果错误码
*/
cloud_error_code_t cloud_handle_error(cloud_error_code_t error_code, const char* error_msg);
/**
* @brief 云连接错误恢复
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_error_recovery(void);
// ==================== 工具函数 ====================
/**
* @brief 生成UUID
* @param uuid_buffer UUID输出缓冲区
* @param buffer_size 缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_generate_uuid(char* uuid_buffer, size_t buffer_size);
/**
* @brief 获取当前时间戳字符串
* @param time_buffer 时间戳输出缓冲区
* @param buffer_size 缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_get_timestamp_string(char* time_buffer, size_t buffer_size);
/**
* @brief 安全数值转换函数
* @param value 原始值
* @return double 转换后的安全值
*/
double cloud_safe_convert_double(double value);
/**
* @brief 编码Base64
* @param input_data 输入数据
* @param input_length 输入长度
* @param output_buffer 输出缓冲区
* @param output_size 输出缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_base64_encode(const uint8_t* input_data, size_t input_length,
char* output_buffer, size_t output_size);
/**
* @brief 从文件进行Base64编码
* @param file_path 文件路径
* @param output 输出缓冲区
* @param output_size 输出缓冲区大小
* @return cloud_error_code_t 错误码,CLOUD_ERR_NONE表示成功
*/
cloud_error_code_t cloud_base64_encode_from_file(const char* file_path, char* output, size_t output_size);
// ==================== MQTT回调函数 ====================
/**
* @brief MQTT连接回调函数
* @param mosq MQTT客户端实例
* @param obj 用户数据
* @param rc 连接结果码
*/
void cloud_mqtt_connect_callback(struct mosquitto* mosq, void* obj, int rc);
/**
* @brief MQTT断开连接回调函数
* @param mosq MQTT客户端实例
* @param obj 用户数据
* @param rc 断开结果码
*/
void cloud_mqtt_disconnect_callback(struct mosquitto* mosq, void* obj, int rc);
/**
* @brief MQTT消息接收回调函数
* @param mosq MQTT客户端实例
* @param obj 用户数据
* @param message 接收到的消息
*/
void cloud_mqtt_message_callback(struct mosquitto* mosq, void* obj,
const struct mosquitto_message* message);
/**
* @brief MQTT发布回调函数
* @param mosq MQTT客户端实例
* @param obj 用户数据
* @param mid 消息ID
* @param reason_code 发布结果码
*/
void cloud_mqtt_publish_callback(struct mosquitto* mosq, void* obj, int mid, int reason_code);
/**
* @brief MQTT订阅回调函数
* @param mosq MQTT客户端实例
* @param obj 用户数据
* @param mid 消息ID
* @param qos_count QOS数量
* @param granted_qos 授予的QOS数组
*/
void cloud_mqtt_subscribe_callback(struct mosquitto* mosq, void* obj, int mid,
int qos_count, const int* granted_qos);
// ==================== 兼容性函数(保持原有接口) ====================
/**
* @brief MQTT连接回调函数(兼容原有代码)
* @param mosq MQTT客户端实例
* @param obj 用户数据
* @param rc 连接结果码
*/
void on_connect(struct mosquitto* mosq, void* obj, int rc);
/**
* @brief MQTT消息接收回调函数(兼容原有代码)
* @param mosq MQTT客户端实例
* @param obj 用户数据
* @param message 接收到的消息
*/
void on_message(struct mosquitto* mosq, void* obj, const struct mosquitto_message* message);
/**
* @brief 发送消息函数(兼容原有代码)
* @param mosq MQTT客户端实例
*/
void send_message(struct mosquitto* mosq);
/**
* @brief 云通信线程函数(兼容原有代码)
* @param arg 线程参数
* @return void* 线程返回值
*/
void* fCloudT(void* arg);
/**
* @brief 云数据发送函数(兼容原有代码)
* @param value 发送数据
* @return int 发送结果,0表示成功
*/
int cloudTx(char* value);
/**
* @brief 发送属性上报函数(兼容原有代码)
*/
void send_property_report(void);
/**
* @brief 发送控制数据上报函数(兼容原有代码)
*/
void send_control_report(void);
/**
* @brief 发送消息上报函数(兼容原有代码)
* @param value 消息内容
*/
void send_message_report(char* value);
#endif // CLOUD_H
最新发布