web_params_api.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. /********************************* (C) ROTEK ***********************************
  2. * @module web_params_api
  3. * @file web_params_api.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief web_params_api
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "common_config.h"
  13. #include "stm32f4xx.h"
  14. #include "web_params_api.h"
  15. #if defined HTTP_SERVER_ENABLE
  16. #include "http_server.h"
  17. #elif defined SSL_SERVER_ENABLE
  18. #include "my_ssl_server.h"
  19. #endif
  20. #include "parameters.h"
  21. #include "snmp_api.h"
  22. #include "trap_api.h"
  23. #include "settings_api.h"
  24. #include "snmp.h"
  25. #include "log.h"
  26. #include "hal.h"
  27. #include "cJSON.h"
  28. #include "FreeRTOS.h"
  29. #include "task.h"
  30. #ifdef PRINTF_STDLIB
  31. #include <stdio.h>
  32. #endif
  33. #ifdef PRINTF_CUSTOM
  34. #include "tinystdio.h"
  35. #endif
  36. #include <string.h>
  37. #include "syslog.h"
  38. typedef void (*pFunction)(void);
  39. pFunction Jump_To_Application;
  40. uint32_t JumpAddress;
  41. /**
  42. * @brief Возвращяет строку с настройками на первой странице
  43. * @retval None
  44. */
  45. char *HTTP_GetParamsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  46. {
  47. char str[40];
  48. uint8_t len;
  49. (void)bufIn;
  50. (void)lenBufIn;
  51. (void)reqNum;
  52. cJSON *monitor_param = NULL;
  53. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  54. // Headers для поддержки saffari
  55. strcpy(bufOut, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  56. monitor_param = cJSON_CreateObject();
  57. #define XJSON_PARAMS_TAG(tag, get_param) JSON_ADD_TAG(tag, get_param, monitor_param);
  58. WEB_PARAMS_TAGS_TABLE
  59. #undef XJSON_PARAMS_TAG
  60. if(cJSON_PrintPreallocated(monitor_param, &bufOut[strlen(bufOut)], SEND_BUF_MAX_LEN, 0)) {
  61. *lenBufOut = strlen(bufOut);
  62. } else {
  63. *lenBufOut = 0;
  64. }
  65. cJSON_Delete(monitor_param);
  66. return bufOut;
  67. }
  68. /**
  69. * @brief Возвращяет строку с настройками на второй странице
  70. * @retval None
  71. */
  72. char *HTTP_GetSettingsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  73. {
  74. char str[30];
  75. uint8_t len;
  76. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  77. (void)bufIn;
  78. (void)lenBufIn;
  79. (void)reqNum;
  80. cJSON *settings_param = NULL;
  81. /* Headers для поддержки saffari */
  82. strcpy(bufOut, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  83. settings_param = cJSON_CreateObject();
  84. #define XJSON_SETTINGS_TAG(tag, get_param, set_param) JSON_ADD_TAG(tag, get_param, settings_param);
  85. WEB_SETTINGS_TAGS_TABLE
  86. #undef XJSON_SETTINGS_TAG
  87. if(cJSON_PrintPreallocated(settings_param, &bufOut[strlen(bufOut)], SEND_BUF_MAX_LEN, 0)) {
  88. *lenBufOut = strlen(bufOut);
  89. } else {
  90. *lenBufOut = 0;
  91. }
  92. cJSON_Delete(settings_param);
  93. return bufOut;
  94. }
  95. uint8_t ConvertStringForJSON(char *inStr, char *paramValue, uint8_t inLen)
  96. {
  97. int len = 0, len2 = 0;
  98. char *strPtr = 0;
  99. uint8_t i = 0;
  100. while (i < inLen) {
  101. strPtr = strstr(inStr, "\"");
  102. if (strPtr != 0) {
  103. len = strPtr - inStr;
  104. if (len != 0) {
  105. strncat(paramValue, inStr, len);
  106. }
  107. strncat(paramValue, "\\", 1);
  108. strncat(paramValue, &inStr[len], 1);
  109. inStr = inStr + len + 1;
  110. i = i + len + 1;
  111. } else {
  112. if (paramValue != 0) {
  113. len2 = inLen - i;
  114. strncat(paramValue, inStr, len2);
  115. return 1;
  116. } else {
  117. return 0;
  118. }
  119. }
  120. }
  121. if (inLen == 0) {
  122. return 0;
  123. }
  124. return 1;
  125. }
  126. #ifdef NOTIFICATION_CONTROL_ENABLE
  127. /**
  128. * @brief Возвращяет строку с настройками уведомлений (есть/нет отправка)
  129. * @retval None
  130. */
  131. char *HTTP_GetTrapAccess(char *params, uint16_t len_params, char *buf, uint16_t *len_out)
  132. {
  133. char str[64];
  134. uint8_t len, i, first_item = 1;
  135. char value[20];
  136. (void)len_params;
  137. ClearParamString(params);
  138. memset(value, 0, 20);
  139. memset(str, 0, 64);
  140. /* Headers для поддержки saffari */
  141. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  142. /* Формирование списка уведомлений */
  143. strcat(buf, "{\"params\":[");
  144. for (i = 1; i < ALL_TRAPS; i++) {
  145. if (first_item) {
  146. first_item = 0;
  147. } else {
  148. strcat(buf, ",");
  149. }
  150. sprintf(str, "%d", i);
  151. len = strlen(str);
  152. strcat(buf, "{\"name\":\"");
  153. strncat(buf, str, len);
  154. GetTrapLongNameStr(str, &len, i);
  155. strcat(buf, "\",\"label\":\"");
  156. strncat(buf, str, len);
  157. GetNotificationTrapsStateStr(str, &len, i);
  158. strcat(buf, "\",\"snmp\":\"");
  159. strncat(buf, str, len);
  160. strcat(buf, "\"}");
  161. }
  162. strcat(buf, "]");
  163. /* Признак изменения сетевых настроек */
  164. GetWebReinitFlag(str, &len);
  165. strcat(buf, ",\"netsettings_changed\":\"");
  166. strncat(buf, str, len);
  167. strcat(buf, "\"}");
  168. *len_out = strlen(buf);
  169. return buf;
  170. }
  171. #endif
  172. /**
  173. * @brief Возвращяет строку с информацией об устройстве
  174. * @retval None
  175. */
  176. // TODO Согласовать максимальную длину строк
  177. char *HTTP_GetInfo(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  178. {
  179. char str[110];
  180. char tmp_str[220];
  181. uint8_t len;
  182. char tempStr[30];
  183. strncpy(tempStr, bufIn, 30);
  184. (void)lenBufIn;
  185. (void)reqNum;
  186. /* В запросе нет параметров, нужно формировать JSON ответ */
  187. if (strpbrk(tempStr, "?") == 0) {
  188. memset(bufOut, 0, SEND_BUF_MAX_LEN);
  189. /* Headers для поддержки saffari */
  190. strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  191. GetWorkTimeStr(str, &len);
  192. strcat(bufOut, "{\"uptime\":\"");
  193. strncat(bufOut, str, len);
  194. GetModelStr(str, &len);
  195. strcat(bufOut, "\",\"model\":\"");
  196. strncat(bufOut, str, len);
  197. GetProductionDataStr(str, &len);
  198. strcat(bufOut, "\",\"prodate\":\"");
  199. strncat(bufOut, str, len);
  200. GetVersionStr(str, &len);
  201. strcat(bufOut, "\",\"fwversion\":\"");
  202. strncat(bufOut, str, len);
  203. GetMacStr(str, &len);
  204. strcat(bufOut, "\",\"macaddr\":\"");
  205. strncat(bufOut, str, len);
  206. GetSerialNumberStr(str, &len);
  207. strcat(bufOut, "\",\"serno\":\"");
  208. strncat(bufOut, str, len);
  209. GetNameDeviceStr(str, &len);
  210. str[len] = 0;
  211. strcat(bufOut, "\",\"sysname\":\"");
  212. memset(tmp_str, 0, sizeof(tmp_str));
  213. if (ConvertStringForJSON(str, tmp_str, len)) {
  214. strncat(bufOut, tmp_str, strlen(tmp_str));
  215. } else {
  216. strncat(bufOut, str, len);
  217. }
  218. GetOwnerStr(str, &len);
  219. str[len] = 0;
  220. strcat(bufOut, "\",\"owner\":\"");
  221. memset(tmp_str, 0, sizeof(tmp_str));
  222. if (ConvertStringForJSON(str, tmp_str, len)) {
  223. strncat(bufOut, tmp_str, strlen(tmp_str));
  224. } else {
  225. strncat(bufOut, str, len);
  226. }
  227. GetLocationStr(str, &len);
  228. str[len] = 0;
  229. strcat(bufOut, "\",\"sysLocation\":\"");
  230. memset(tmp_str, 0, sizeof(tmp_str));
  231. if (ConvertStringForJSON(str, tmp_str, len)) {
  232. strncat(bufOut, tmp_str, strlen(tmp_str));
  233. } else {
  234. strncat(bufOut, str, len);
  235. }
  236. GetCommentsStr(str, &len);
  237. str[len] = 0;
  238. strcat(bufOut, "\",\"comment\":\"");
  239. memset(tmp_str, 0, sizeof(tmp_str));
  240. if (ConvertStringForJSON(str, tmp_str, len)) {
  241. strncat(bufOut, tmp_str, strlen(tmp_str));
  242. } else {
  243. strncat(bufOut, str, len);
  244. }
  245. GetUPSModelStr(str, &len);
  246. strcat(bufOut, "\",\"ups_model\":\"");
  247. strncat(bufOut, str, len);
  248. GetUPSSerialStr(str, &len);
  249. strcat(bufOut, "\",\"ups_sn\":\"");
  250. strncat(bufOut, str, len);
  251. GetUPSVersionStr(str, &len);
  252. strcat(bufOut, "\",\"ups_fwversion\":\"");
  253. strncat(bufOut, str, len);
  254. /* Признак изменения сетевых настроек */
  255. GetWebReinitFlag(str, &len);
  256. strcat(bufOut, "\",\"netsettings_changed\":\"");
  257. strncat(bufOut, str, len);
  258. strncat(bufOut, "\"}", 2);
  259. *lenBufOut = strlen(bufOut);
  260. return bufOut;
  261. }
  262. *lenBufOut = 0;
  263. return NULL;
  264. }
  265. void HTTP_GetHistoryPage(char *buf, uint32_t pageNumber)
  266. {
  267. char str[16];
  268. uint16_t len;
  269. strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  270. strcat(buf, "{\"page\": [");
  271. History_GetPage(buf, pageNumber);
  272. len = strlen(buf);
  273. buf += len - 1;
  274. *buf = 0;
  275. buf -= len - 1;
  276. /* Количество страниц */
  277. memset(str, 0, 16);
  278. sprintf(str, "%i", History_GetPageCount());
  279. strcat(buf, "],\"pages\":\"");
  280. strcat(buf, str);
  281. /* Часовой пояс */
  282. GetSntpTimeZoneStr(str, (uint8_t *)&len);
  283. strcat(buf, "\",\"utc\":\"");
  284. strncat(buf, str, len);
  285. GetUnixTimeStr(str, (uint8_t *)&len);
  286. strcat(buf, "\",\"utm\":\"");
  287. strncat(buf, str, len);
  288. strcat(buf, "\"}");
  289. //printf(buf);
  290. }
  291. void HTTP_GetUpsHistoryPage(char *buf, uint32_t pageNumber)
  292. {
  293. char str[16];
  294. uint16_t len;
  295. strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n");
  296. strcat(buf, "{\"page\": [");
  297. LOG_GetPage(buf, pageNumber);
  298. len = strlen(buf);
  299. buf += len - 1;
  300. *buf = 0;
  301. buf -= len - 1;
  302. /* Количество страниц */
  303. memset(str, 0, 16);
  304. sprintf(str, "%i", LOG_GetPageCount());
  305. strcat(buf, "],\"pages\":\"");
  306. strcat(buf, str);
  307. /* Часовой пояс */
  308. GetSntpTimeZoneStr(str, (uint8_t *)&len);
  309. strcat(buf, "\",\"utc\":\"");
  310. strncat(buf, str, len);
  311. GetUnixTimeStr(str, (uint8_t *)&len);
  312. strcat(buf, "\",\"utm\":\"");
  313. strncat(buf, str, len);
  314. strcat(buf, "\"}");
  315. //printf(buf);
  316. }
  317. /**
  318. * @brief Возвращает uptime, freq, dutycicle
  319. */
  320. void HTTP_GetProgonParams(char *buf)
  321. {
  322. char str[20];
  323. u32_t tick;
  324. strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n");
  325. strcat(buf, "{\"uptime\":\"");
  326. // snmp_get_sysuptime(&tick);
  327. tick = tick / 100;
  328. memset(str, 0, 20);
  329. sprintf(str, "%d", tick);
  330. strncat(buf, str, strlen(str));
  331. strncat(buf, "\"}", 2);
  332. }
  333. /**
  334. * @brief Сброс настроек (всё кроме сетевых параметров)
  335. */
  336. void HTTP_ResetSettings(void)
  337. {
  338. //taskENTER_CRITICAL();
  339. SNMP_SendUserTrap(DEVICE_RESTORED);
  340. syslog_str("Настройки сброшены к настройкам по умолчанию");
  341. log_event_data(LOG_SYSTEM_DEFCONFIG, name_login);
  342. vTaskDelay(500);
  343. SETTINGS_SetPartDefault();
  344. SETTINGS_Save();
  345. //taskEXIT_CRITICAL();
  346. }
  347. /**
  348. * @brief Сохранение настроек
  349. */
  350. void HTTP_SaveSettings(void)
  351. {
  352. // taskENTER_CRITICAL();
  353. SETTINGS_Save();
  354. log_event_data(LOG_SETTING_SAVE, name_login);
  355. // taskEXIT_CRITICAL();
  356. }
  357. /**
  358. * @brief Перезагрузка контроллера
  359. */
  360. char *HTTP_Reboot(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut)
  361. {
  362. (void)bufIn;
  363. (void)lenBufIn;
  364. (void)reqNum;
  365. strcpy(bufOut, "HTTP/1.1 200 OK\r\n");
  366. *lenBufOut = strlen(bufOut);
  367. /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть
  368. * отправить ответ серверу об успешном выполнении команды */
  369. HTTP_StartResetTask(false);
  370. return bufOut;
  371. }
  372. /**
  373. * @brief Запускает задачу ресета контроллера
  374. * @param fBootMode:
  375. * true - перед перезагрузкой будет установлен флаг входа в режим
  376. * bootloader и перезаписаны настройки
  377. *
  378. * false - обычная перезагрузка
  379. */
  380. void HTTP_StartResetTask(bool fBootMode)
  381. {
  382. static bool temp;
  383. temp = fBootMode;
  384. xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE,
  385. (void *)&temp, tskIDLE_PRIORITY, NULL);
  386. }
  387. /**
  388. * @brief
  389. */
  390. void vTaskReboot(void *pvParameters)
  391. {
  392. bool mode = false; // тип перезагрузки (нужно ли устанавливать флаг bootloader)
  393. for (;;) {
  394. mode = *(bool *)pvParameters;
  395. if (mode) {
  396. SNMP_SendUserTrap(FW_VERSION_UPDATE);
  397. syslog_str("Идёт обновление ПО");
  398. source_act_t src_act = get_act_source();
  399. #ifdef CLI_ENABLE
  400. if (src_act == CLI_ACT) {
  401. log_event_data(LOG_UPDATE_SOFT, "Администратор");
  402. } else
  403. #endif
  404. log_event_data(LOG_UPDATE_SOFT, name_login);
  405. SetLoadMode();
  406. #ifdef CLI_ENABLE
  407. if (src_act == CLI_ACT) {
  408. SETTINGS_Save();
  409. log_event_data(LOG_SETTING_SAVE, "Администратор");
  410. } else
  411. #endif
  412. HTTP_SaveSettings();
  413. vTaskDelay(2000);
  414. vTaskDelay(1010);
  415. Reboot(src_act);
  416. } else {
  417. vTaskDelay(1000);
  418. vTaskDelay(1010);
  419. Reboot(SNMP_ACT);
  420. }
  421. }
  422. }
  423. /********************************* (C) ROTEK **********************************/