/** * @Author: 李建 * @Date: 12/17/2023, 8:22:32 PM * @LastEditors: 李建 * @LastEditTime: 12/17/2023, 8:22:32 PM * Description: 网关通用命令处理,主要包含时间同步,软重启,上报最新状态 ,上报设备信息等 * Copyright: Copyright (©)}) 2023 永续绿建. All rights reserved. */ #include "zero_device.h" #include "command.h" #include "../channel.h" #include "esp_log.h" #include "esp_system.h" #include #include #include #include "../gateway/access.h" #include "../system/miscellaneous_interface.h" static const char *TAG = "ZERO_DEVICE"; extern esp_mqtt_client_handle_t client; /** * 处理云端状态消息 */ static void status_message_process(char *payload) { } // 处理云端事件消息 static void event_message_process(char *payload) { } // 处理云端指令消息 static void command_message_process(char *payload) { cJSON *root = cJSON_Parse(payload); cJSON *cmd = cJSON_GetObjectItemCaseSensitive(root, "cmd"); cJSON *params = cJSON_GetObjectItem(root, "params"); if (!root || !cmd || !params) return; sparrow_command *spCmd = find_sparrow_command(cmd->valuestring); if (NULL != spCmd) { spCmd->unpack(cJSON_PrintUnformatted(params)); } else { ESP_LOGI(TAG, "%s is not found!", cmd->valuestring); } cJSON_Delete(root); } /** * 处理网关消息 */ void zero_device_process(char *payload, sparrow_topic_type topicType) { if (NULL == payload) { return; } switch (topicType) { case SPARROW_TOPIC_STATUS: status_message_process(payload); break; case SPARROW_TOPIC_COMMAND: command_message_process(payload); break; case SPARROW_TOPIC_EVENT: event_message_process(payload); break; default: break; } } // 设备软重启处理 void restart_process(char *params) { esp_restart(); } // 设备时间同步处理 void timeSync_process(char *params) { ESP_LOGI(TAG, "time sync"); } // 上报最新状态处理 void report_process(char *params) { } void publish_sys_info(void) { gateway_sys_info info = {0}; get_sys_info(&info); cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "cmd", "sysInfo"); cJSON *params = cJSON_CreateObject(); cJSON_AddStringToObject(params, "mac", info.mac); cJSON_AddNumberToObject(params, "revision", info.revision); cJSON_AddNumberToObject(params, "cores", info.cores); cJSON_AddNumberToObject(params, "total", info.total); cJSON_AddNumberToObject(params, "used", info.used); cJSON_AddStringToObject(params, "version", info.version); cJSON_AddStringToObject(params, "idf_version", info.idf_version); cJSON_AddItemToObject(root, "params", params); publish_message_t msg = { .topic = "s", .data = root, }; sparrow_publish_status(msg); } void publish_app_version(void) { char str_device_serial[16]; get_device_serial(str_device_serial); cJSON *root = cJSON_CreateObject(); cJSON_AddStringToObject(root, "action", "reportFirmware"); cJSON_AddStringToObject(root, "deviceCode", str_device_serial); esp_app_desc_t * desc = esp_app_get_description(); cJSON_AddStringToObject(root, "version", desc->version); char * payload = cJSON_PrintUnformatted(root); char topic[300]; sprintf(topic, "%s%s", TOPIC_PUB_STATUS, str_device_serial); esp_mqtt_client_publish(client, topic, payload, 0, 1, false); cJSON_Delete(root); free(payload); } /** * 上报设备信息。包含MAC地址,程序版本,IP地址 * 本地文件系统使用情况 */ void system_info_progress(char *pv) { publish_sys_info(); } void sparrow_zero_device_init(void) { // restart command sparrow_command restart = { .name = "restart", .unpack = &restart_process, }; // time sync command sparrow_command timeSync = { .name = "timeSync", .unpack = &timeSync_process, }; // report command sparrow_command report = { .name = "report", .unpack = &report_process, }; // get_sys_info command sparrow_command get_sys_info = { .name = "systemInfo", .unpack = &system_info_progress, }; register_sparrow_command(restart); register_sparrow_command(timeSync); register_sparrow_command(report); register_sparrow_command(get_sys_info); register_sub_device_channel_recv(SPARROW_CHANNEL_PORT_0, zero_device_process); }