zero_device.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /**
  2. * @Author: 李建
  3. * @Date: 12/17/2023, 8:22:32 PM
  4. * @LastEditors: 李建
  5. * @LastEditTime: 12/17/2023, 8:22:32 PM
  6. * Description: 网关通用命令处理,主要包含时间同步,软重启,上报最新状态 ,上报设备信息等
  7. * Copyright: Copyright (©)}) 2023 永续绿建. All rights reserved.
  8. */
  9. #include "zero_device.h"
  10. #include "command.h"
  11. #include "../channel.h"
  12. #include "esp_log.h"
  13. #include "esp_system.h"
  14. #include <cJSON.h>
  15. #include <mqtt_client.h>
  16. #include <esp_app_desc.h>
  17. #include "../gateway/access.h"
  18. #include "../system/miscellaneous_interface.h"
  19. static const char *TAG = "ZERO_DEVICE";
  20. extern esp_mqtt_client_handle_t client;
  21. /**
  22. * 处理云端状态消息
  23. */
  24. static void status_message_process(char *payload)
  25. {
  26. }
  27. // 处理云端事件消息
  28. static void event_message_process(char *payload)
  29. {
  30. }
  31. // 处理云端指令消息
  32. static void command_message_process(char *payload)
  33. {
  34. cJSON *root = cJSON_Parse(payload);
  35. cJSON *cmd = cJSON_GetObjectItemCaseSensitive(root, "cmd");
  36. cJSON *params = cJSON_GetObjectItem(root, "params");
  37. if (!root || !cmd || !params)
  38. return;
  39. sparrow_command *spCmd = find_sparrow_command(cmd->valuestring);
  40. if (NULL != spCmd)
  41. {
  42. spCmd->unpack(cJSON_PrintUnformatted(params));
  43. }
  44. else
  45. {
  46. ESP_LOGI(TAG, "%s is not found!", cmd->valuestring);
  47. }
  48. cJSON_Delete(root);
  49. }
  50. /**
  51. * 处理网关消息
  52. */
  53. void zero_device_process(char *payload, sparrow_topic_type topicType)
  54. {
  55. if (NULL == payload)
  56. {
  57. return;
  58. }
  59. switch (topicType)
  60. {
  61. case SPARROW_TOPIC_STATUS:
  62. status_message_process(payload);
  63. break;
  64. case SPARROW_TOPIC_COMMAND:
  65. command_message_process(payload);
  66. break;
  67. case SPARROW_TOPIC_EVENT:
  68. event_message_process(payload);
  69. break;
  70. default:
  71. break;
  72. }
  73. }
  74. // 设备软重启处理
  75. void restart_process(char *params)
  76. {
  77. esp_restart();
  78. }
  79. // 设备时间同步处理
  80. void timeSync_process(char *params)
  81. {
  82. ESP_LOGI(TAG, "time sync");
  83. }
  84. // 上报最新状态处理
  85. void report_process(char *params)
  86. {
  87. }
  88. void publish_sys_info(void)
  89. {
  90. gateway_sys_info info = {0};
  91. get_sys_info(&info);
  92. cJSON *root = cJSON_CreateObject();
  93. cJSON_AddStringToObject(root, "cmd", "sysInfo");
  94. cJSON *params = cJSON_CreateObject();
  95. cJSON_AddStringToObject(params, "mac", info.mac);
  96. cJSON_AddNumberToObject(params, "revision", info.revision);
  97. cJSON_AddNumberToObject(params, "cores", info.cores);
  98. cJSON_AddNumberToObject(params, "total", info.total);
  99. cJSON_AddNumberToObject(params, "used", info.used);
  100. cJSON_AddStringToObject(params, "version", info.version);
  101. cJSON_AddStringToObject(params, "idf_version", info.idf_version);
  102. cJSON_AddItemToObject(root, "params", params);
  103. publish_message_t msg = {
  104. .topic = "s",
  105. .data = root,
  106. };
  107. sparrow_publish_status(msg);
  108. }
  109. void publish_app_version(void) {
  110. char str_device_serial[16];
  111. get_device_serial(str_device_serial);
  112. cJSON *root = cJSON_CreateObject();
  113. cJSON_AddStringToObject(root, "action", "reportFirmware");
  114. cJSON_AddStringToObject(root, "deviceCode", str_device_serial);
  115. esp_app_desc_t * desc = esp_app_get_description();
  116. cJSON_AddStringToObject(root, "version", desc->version);
  117. char * payload = cJSON_PrintUnformatted(root);
  118. char topic[300];
  119. sprintf(topic, "%s%s", TOPIC_PUB_STATUS, str_device_serial);
  120. esp_mqtt_client_publish(client, topic, payload, 0, 1, false);
  121. cJSON_Delete(root);
  122. free(payload);
  123. }
  124. /**
  125. * 上报设备信息。包含MAC地址,程序版本,IP地址
  126. * 本地文件系统使用情况
  127. */
  128. void system_info_progress(char *pv)
  129. {
  130. publish_sys_info();
  131. }
  132. void sparrow_zero_device_init(void)
  133. {
  134. // restart command
  135. sparrow_command restart = {
  136. .name = "restart",
  137. .unpack = &restart_process,
  138. };
  139. // time sync command
  140. sparrow_command timeSync = {
  141. .name = "timeSync",
  142. .unpack = &timeSync_process,
  143. };
  144. // report command
  145. sparrow_command report = {
  146. .name = "report",
  147. .unpack = &report_process,
  148. };
  149. // get_sys_info command
  150. sparrow_command get_sys_info = {
  151. .name = "systemInfo",
  152. .unpack = &system_info_progress,
  153. };
  154. register_sparrow_command(restart);
  155. register_sparrow_command(timeSync);
  156. register_sparrow_command(report);
  157. register_sparrow_command(get_sys_info);
  158. register_sub_device_channel_recv(SPARROW_CHANNEL_PORT_0, zero_device_process);
  159. }