AF_Error_Message


/** * @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
最新发布
10-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值