/********************************* (C) ROTEK *********************************** * @module web_params_api * @file web_params_api.c * @version 1.0.0 * @date XX.XX.XXXX * $brief web_params_api ******************************************************************************* * @history Version Author Comment * XX.XX.XXXX 1.0.0 Telenkov D.A. First release. ******************************************************************************* */ #include "stm32f4xx.h" #include "web_params_api.h" #if defined HARDWARE_BT6707 || HARDWARE_BT6709 #include "http_server.h" #elif defined HARDWARE_BT6703 #include "my_ssl_server.h" #endif #include "parameters.h" #include "snmp_api.h" #include "trap_api.h" #include "settings_api.h" #include "common_config.h" #include "snmp.h" #include "log.h" #include "hal.h" #include "FreeRTOS.h" #include "task.h" #ifdef PRINTF_STDLIB #include #endif #ifdef PRINTF_CUSTOM #include "tinystdio.h" #endif #include typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t JumpAddress; /** * @brief Возвращяет строку с настройками на первой странице * @retval None */ char *HTTP_GetParamsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut) { char str[40]; uint8_t len; (void)bufIn; (void)lenBufIn; (void)reqNum; memset(bufOut, 0, SEND_BUF_MAX_LEN); // Headers для поддержки saffari strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n"); // Параметры UPS GetInputVoltageStr(str, &len); strcat(bufOut, "{\"AC\":\""); strncat(bufOut, str, len); GetOutputVoltageStr(str, &len); strcat(bufOut, "\",\"DC\":\""); strncat(bufOut, str, len); GetInputFreqStr(str, &len); strcat(bufOut, "\",\"in_freq\":\""); strncat(bufOut, str, len); GetOutputFreqStr(str, &len); strcat(bufOut, "\",\"out_freq\":\""); strncat(bufOut, str, len); GetPowerStr(str, &len); strcat(bufOut, "\",\"pwr\":\""); strncat(bufOut, str, len); GetBatCapacityStr(str, &len); strcat(bufOut, "\",\"bat_rem_cap\":\""); strncat(bufOut, str, len); GetInternalTempStr(str, &len); strcat(bufOut, "\",\"inner_temp\":\""); strncat(bufOut, str, len); GetRuntimeStr(str, &len); strcat(bufOut, "\",\"bat_time_left\":\""); strncat(bufOut, str, len); #ifdef HARDWARE_BT6709 GetInputCurrentStr(str, &len); strcat(bufOut, "\",\"in_cur\":\""); strncat(bufOut, str, len); GetOutputCurrentStr(str, &len); strcat(bufOut, "\",\"out_cur\":\""); strncat(bufOut, str, len); GetVoltageAKBtStr(str, &len); strcat(bufOut, "\",\"bat_volt\":\""); strncat(bufOut, str, len); GetCapacityNominalAKBStr(str, &len); strcat(bufOut, "\",\"bat_cap\":\""); strncat(bufOut, str, len); GetDataNextChangeAKBStrRU(str, &len); strcat(bufOut, "\",\"bat_exp\":\""); strncat(bufOut, str, len); #endif #ifndef HARDWARE_BT6709 GetDINStatusStr(str, &len, 0); strcat(bufOut, "\",\"di1\":\""); strncat(bufOut, str, len); GetDOUTStatusStr(str, &len, 0); strcat(bufOut, "\",\"ro1\":\""); strncat(bufOut, str, len); GetDOUTStatusStr(str, &len, 1); strcat(bufOut, "\",\"ro2\":\""); strncat(bufOut, str, len); #if defined HARDWARE_BT6707 GetDOUTStatusStr(str, &len, 2); strcat(bufOut, "\",\"ro3\":\""); strncat(bufOut, str, len); #endif #endif // Дополнительные параметры // Мониторинг // load_monitor (нагрузка, 0 - норма, 1 - fail) // temp_monitor (внутренняя температура, 0 - норма, 1 - fail) // connect_monitor (связь с UPSом, 0 - норма, 1 - fail) GetAlarmMonitorStr(str, &len); strcat(bufOut, "\",\"m_alarm\":\""); strncat(bufOut, str, len); GetAlarmStr(str, &len); strcat(bufOut, "\",\"u_alarm\":\""); strncat(bufOut, str, len); // Признак изменения сетевых настроек GetWebReinitFlag(str, &len); strcat(bufOut, "\",\"netsettings_changed\":\""); strncat(bufOut, str, len); strncat(bufOut, "\"}", 2); *lenBufOut = strlen(bufOut); return bufOut; } /** * @brief Возвращяет строку с настройками на второй странице * @retval None */ char *HTTP_GetSettingsPage(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut) { char str[30]; uint8_t len; memset(bufOut, 0, SEND_BUF_MAX_LEN); (void)bufIn; (void)lenBufIn; (void)reqNum; /* Headers для поддержки saffari */ strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n"); /* SNMP */ GetReadCommunity(str, &len); strcat(bufOut, "{\"read_community\":\""); strncat(bufOut, str, len); GetWriteCommunity(str, &len); strcat(bufOut, "\",\"write_community\":\""); strncat(bufOut, str, len); GetManagerIp(str, &len); strcat(bufOut, "\",\"managerIP\":\""); strncat(bufOut, str, len); GetManagerIp2(str, &len); strcat(bufOut, "\",\"managerIP2\":\""); strncat(bufOut, str, len); GetManagerIp3(str, &len); strcat(bufOut, "\",\"managerIP3\":\""); strncat(bufOut, str, len); GetManagerIp4(str, &len); strcat(bufOut, "\",\"managerIP4\":\""); strncat(bufOut, str, len); GetManagerIp5(str, &len); strcat(bufOut, "\",\"managerIP5\":\""); strncat(bufOut, str, len); #ifndef HARDWARE_BT6709 /*Параметры реле и сухих контактов*/ GetDINTypeActStr(str, &len, 0); strcat(bufOut, "\",\"di1\":\""); strncat(bufOut, str, len); GetROTypeActStr(str, &len, 0); strcat(bufOut, "\",\"ro1\":\""); strncat(bufOut, str, len); GetROTypeActStr(str, &len, 1); strcat(bufOut, "\",\"ro2\":\""); strncat(bufOut, str, len); #if defined HARDWARE_BT6707 GetROTypeActStr(str, &len, 2); strcat(bufOut, "\",\"ro3\":\""); strncat(bufOut, str, len); #endif #endif /* WEB */ GetIpStr(str, &len); strcat(bufOut, "\",\"ipaddr\":\""); strncat(bufOut, str, len); GetGatewayStr(str, &len); strcat(bufOut, "\",\"gw\":\""); strncat(bufOut, str, len); GetMaskStr(str, &len); strcat(bufOut, "\",\"mask\":\""); strncat(bufOut, str, len); GetDhcpStateStr(str, &len); strcat(bufOut, "\",\"dhcp\":"); strncat(bufOut, str, len); #if defined HARDWARE_BT6707 || HARDWARE_BT6709 GetTelnetPortStr(str, &len); strcat(bufOut, ",\"tn_port\":\""); strncat(bufOut, str, len); GetTelnetEnableStateStr(str, &len); strcat(bufOut, "\",\"tn_enabled\":"); strncat(bufOut, str, len); #endif #ifdef HARDWARE_BT6703 GetAuthEnableStateStr(str, &len); strcat(bufOut, ",\"swauth\":"); strncat(bufOut, str, len); /* RADIUS */ GetRDSIpStr(str, &len); strcat(bufOut, ",\"rs_server\":\""); strncat(bufOut, str, len); GetRDSPortStr(str, &len); strcat(bufOut, "\",\"rs_port\":\""); strncat(bufOut, str, len); GetRDSPasswordkStr(str, &len); strcat(bufOut, "\",\"rs_pwd\":\""); strncat(bufOut, str, len); GetRDSKeyAccesstStr(str, &len); strcat(bufOut, "\",\"rs_key\":\""); strncat(bufOut, str, len); GetRDSEnableStateStr(str, &len); strcat(bufOut, "\",\"rs_enabled\":"); strncat(bufOut, str, len); #endif #ifdef HARDWARE_BT6709 /* White list */ const char *white_list_js[] = { ",\"wtl_ip1\":\"", "\",\"wtl_ip2\":\"", "\",\"wtl_ip3\":\"", "\",\"wtl_ip4\":\"", "\",\"wtl_ip5\":\"", }; for (uint8_t i = 0; i < MAX_WHITE_LIST; i++) { GetWhiteListSTR(str, &len, i); strcat(bufOut, white_list_js[i]); strncat(bufOut, str, len); } strcat(bufOut, "\""); #endif /* Параметры даты и времени */ GetDateStr(str, &len); strcat(bufOut, ",\"date\":\""); strncat(bufOut, str, len); GetTimeStr(str, &len); strcat(bufOut, "\",\"time\":\""); strncat(bufOut, str, len); /* Параметры SNTP */ GetSntpStateStr(str, &len); strcat(bufOut, "\",\"ntp\":\""); strncat(bufOut, str, len); GetSntpServerIpStr(str, &len); strcat(bufOut, "\",\"ntpservip\":\""); strncat(bufOut, str, len); GetSntpTimeZoneStr(str, &len); strcat(bufOut, "\",\"utc\":\""); strncat(bufOut, str, len); GetUnixTimeStr(str, &len); strcat(bufOut, "\",\"utm\":\""); strncat(bufOut, str, len); GetSntpLastDataStr(str, &len); strcat(bufOut, "\",\"lastsynctime\":\""); strncat(bufOut, str, len); GetUPSVoltCellMinStr(str, &len); strcat(bufOut, "\",\"ups_cell_min\":\""); strncat(bufOut, str, len); GetUPSVoltCellMaxStr(str, &len); strcat(bufOut, "\",\"ups_cell_max\":\""); strncat(bufOut, str, len); #ifdef HARDWARE_BT6709 GetDataSetAKBStr(str, &len); strcat(bufOut, "\",\"bat_prod\":\""); strncat(bufOut, str, len); GetLifeTimeAKBStr(str, &len); strcat(bufOut, "\",\"bat_exp\":\""); strncat(bufOut, str, len); GetCapacityNominalAKBStr(str, &len); strcat(bufOut, "\",\"bat_cap\":\""); strncat(bufOut, str, len); GetVoltageAKBNominalStr(str, &len); strcat(bufOut, "\",\"bat_charge\":\""); strncat(bufOut, str, len); GetUPSPowerStr(str, &len); strcat(bufOut, "\",\"ups_max_power\":\""); strncat(bufOut, str, len); #endif #if defined HARDWARE_BT6707 || HARDWARE_BT6709 GetVACAlarmHighRangeStr(str, &len); strcat(bufOut, "\",\"mainvolt_high\":\""); strncat(bufOut, str, len); GetVACAlarmLowRangeStr(str, &len); strcat(bufOut, "\",\"mainvolt_low\":\""); strncat(bufOut, str, len); GetVACAlarmHisteStr(str, &len); strcat(bufOut, "\",\"mainvolt_hist\":\""); strncat(bufOut, str, len); #endif GetTemperatureAlarmHighRangeStr(str, &len); strcat(bufOut, "\",\"temp_high\":\""); strncat(bufOut, str, len); GetTemperatureAlarmLowRangeStr(str, &len); strcat(bufOut, "\",\"temp_low\":\""); strncat(bufOut, str, len); GetTemperatureAlarmHisteStr(str, &len); strcat(bufOut, "\",\"temp_hist\":\""); strncat(bufOut, str, len); GetLoadAlarmHighRangeStr(str, &len); strcat(bufOut, "\",\"loadvolt_high\":\""); strncat(bufOut, str, len); GetLoadAlarmHisteStr(str, &len); strcat(bufOut, "\",\"loadvolt_hist\":\""); strncat(bufOut, str, len); /* Признак изменения сетевых настроек */ GetWebReinitFlag(str, &len); strcat(bufOut, "\",\"netsettings_changed\":\""); strncat(bufOut, str, len); strncat(bufOut, "\"}", 2); *lenBufOut = strlen(bufOut); return bufOut; } uint8_t ConvertStringForJSON(char *inStr, char *paramValue, uint8_t inLen) { int len = 0, len2 = 0; char *strPtr = 0; uint8_t i = 0; while (i < inLen) { strPtr = strstr(inStr, "\""); if (strPtr != 0) { len = strPtr - inStr; if (len != 0) { strncat(paramValue, inStr, len); } strncat(paramValue, "\\", 1); strncat(paramValue, &inStr[len], 1); inStr = inStr + len + 1; i = i + len + 1; } else { if (paramValue != 0) { len2 = inLen - i; strncat(paramValue, inStr, len2); return 1; } else { return 0; } } } if (inLen == 0) { return 0; } return 1; } #ifdef HARDWARE_BT6709 /** * @brief Возвращяет строку с настройками уведомлений (есть/нет отправка) * @retval None */ char *HTTP_GetTrapAccess(char *params, uint16_t len_params, char *buf, uint16_t *len_out) { char str[64]; uint8_t len, i, first_item = 1; char value[20]; (void)len_params; ClearParamString(params); memset(value, 0, 20); memset(str, 0, 64); /* Headers для поддержки saffari */ strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n"); /* Формирование списка уведомлений */ strcat(buf, "{\"params\":["); for (i = 1; i < ALL_TRAPS; i++) { if (first_item) { first_item = 0; } else { strcat(buf, ","); } sprintf(str, "%d", i); len = strlen(str); strcat(buf, "{\"name\":\""); strncat(buf, str, len); GetTrapLongNameStr(str, &len, i); strcat(buf, "\",\"label\":\""); strncat(buf, str, len); GetNotificationTrapsStateStr(str, &len, i); strcat(buf, "\",\"snmp\":\""); strncat(buf, str, len); strcat(buf, "\"}"); } strcat(buf, "]"); /* Признак изменения сетевых настроек */ GetWebReinitFlag(str, &len); strcat(buf, ",\"netsettings_changed\":\""); strncat(buf, str, len); strcat(buf, "\"}"); *len_out = strlen(buf); return buf; } #endif /** * @brief Возвращяет строку с информацией об устройстве * @retval None */ // TODO Согласовать максимальную длину строк char *HTTP_GetInfo(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut) { char str[110]; char tmp_str[220]; uint8_t len; char tempStr[30]; strncpy(tempStr, bufIn, 30); (void)lenBufIn; (void)reqNum; /* В запросе нет параметров, нужно формировать JSON ответ */ if (strpbrk(tempStr, "?") == 0) { memset(bufOut, 0, SEND_BUF_MAX_LEN); /* Headers для поддержки saffari */ strcpy(bufOut, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n"); GetWorkTimeStr(str, &len); strcat(bufOut, "{\"uptime\":\""); strncat(bufOut, str, len); GetModelStr(str, &len); strcat(bufOut, "\",\"model\":\""); strncat(bufOut, str, len); GetProductionDataStr(str, &len); strcat(bufOut, "\",\"prodate\":\""); strncat(bufOut, str, len); GetVersionStr(str, &len); strcat(bufOut, "\",\"fwversion\":\""); strncat(bufOut, str, len); GetMacStr(str, &len); strcat(bufOut, "\",\"macaddr\":\""); strncat(bufOut, str, len); GetSerialNumberStr(str, &len); strcat(bufOut, "\",\"serno\":\""); strncat(bufOut, str, len); GetNameDeviceStr(str, &len); str[len] = 0; strcat(bufOut, "\",\"sysname\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if (ConvertStringForJSON(str, tmp_str, len)) { strncat(bufOut, tmp_str, strlen(tmp_str)); } else { strncat(bufOut, str, len); } GetOwnerStr(str, &len); str[len] = 0; strcat(bufOut, "\",\"owner\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if (ConvertStringForJSON(str, tmp_str, len)) { strncat(bufOut, tmp_str, strlen(tmp_str)); } else { strncat(bufOut, str, len); } GetLocationStr(str, &len); str[len] = 0; strcat(bufOut, "\",\"sysLocation\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if (ConvertStringForJSON(str, tmp_str, len)) { strncat(bufOut, tmp_str, strlen(tmp_str)); } else { strncat(bufOut, str, len); } GetCommentsStr(str, &len); str[len] = 0; strcat(bufOut, "\",\"comment\":\""); memset(tmp_str, 0, sizeof(tmp_str)); if (ConvertStringForJSON(str, tmp_str, len)) { strncat(bufOut, tmp_str, strlen(tmp_str)); } else { strncat(bufOut, str, len); } GetUPSModelStr(str, &len); strcat(bufOut, "\",\"ups_model\":\""); strncat(bufOut, str, len); GetUPSSerialStr(str, &len); strcat(bufOut, "\",\"ups_sn\":\""); strncat(bufOut, str, len); GetUPSVersionStr(str, &len); strcat(bufOut, "\",\"ups_fwversion\":\""); strncat(bufOut, str, len); /* Признак изменения сетевых настроек */ GetWebReinitFlag(str, &len); strcat(bufOut, "\",\"netsettings_changed\":\""); strncat(bufOut, str, len); strncat(bufOut, "\"}", 2); *lenBufOut = strlen(bufOut); return bufOut; } *lenBufOut = 0; return NULL; } void HTTP_GetHistoryPage(char *buf, uint32_t pageNumber) { char str[16]; uint16_t len; strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n"); strcat(buf, "{\"page\": ["); History_GetPage(buf, pageNumber); len = strlen(buf); buf += len - 1; *buf = 0; buf -= len - 1; /* Количество страниц */ memset(str, 0, 16); sprintf(str, "%i", History_GetPageCount()); strcat(buf, "],\"pages\":\""); strcat(buf, str); /* Часовой пояс */ GetSntpTimeZoneStr(str, (uint8_t *)&len); strcat(buf, "\",\"utc\":\""); strncat(buf, str, len); GetUnixTimeStr(str, (uint8_t *)&len); strcat(buf, "\",\"utm\":\""); strncat(buf, str, len); strcat(buf, "\"}"); //printf(buf); } void HTTP_GetUpsHistoryPage(char *buf, uint32_t pageNumber) { char str[16]; uint16_t len; strcpy(buf, "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n"); strcat(buf, "{\"page\": ["); LOG_GetPage(buf, pageNumber); len = strlen(buf); buf += len - 1; *buf = 0; buf -= len - 1; /* Количество страниц */ memset(str, 0, 16); sprintf(str, "%i", LOG_GetPageCount()); strcat(buf, "],\"pages\":\""); strcat(buf, str); /* Часовой пояс */ GetSntpTimeZoneStr(str, (uint8_t *)&len); strcat(buf, "\",\"utc\":\""); strncat(buf, str, len); GetUnixTimeStr(str, (uint8_t *)&len); strcat(buf, "\",\"utm\":\""); strncat(buf, str, len); strcat(buf, "\"}"); //printf(buf); } /** * @brief Возвращает uptime, freq, dutycicle */ void HTTP_GetProgonParams(char *buf) { char str[20]; u32_t tick; strcpy(buf, "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\n\r\n"); strcat(buf, "{\"uptime\":\""); // snmp_get_sysuptime(&tick); tick = tick / 100; memset(str, 0, 20); sprintf(str, "%d", tick); strncat(buf, str, strlen(str)); strncat(buf, "\"}", 2); } /** * @brief Сброс настроек (всё кроме сетевых параметров) */ void HTTP_ResetSettings(void) { //taskENTER_CRITICAL(); SNMP_SendUserTrap(DEVICE_RESTORED); log_event_data(LOG_SYSTEM_DEFCONFIG, name_login); vTaskDelay(500); SETTINGS_SetPartDefault(); SETTINGS_Save(); //taskEXIT_CRITICAL(); } /** * @brief Сохранение настроек */ void HTTP_SaveSettings(void) { // taskENTER_CRITICAL(); SETTINGS_Save(); #if defined HARDWARE_BT6707 || HARDWARE_BT6709 if (telnet_act) { log_event_data(LOG_SETTING_SAVE, name_login_telnet); } else #endif log_event_data(LOG_SETTING_SAVE, name_login); // taskEXIT_CRITICAL(); } /** * @brief Перезагрузка контроллера */ char *HTTP_Reboot(uint32_t reqNum, char *bufIn, char *bufOut, uint16_t lenBufIn, uint16_t *lenBufOut) { (void)bufIn; (void)lenBufIn; (void)reqNum; strcpy(bufOut, "HTTP/1.1 200 OK\r\n"); *lenBufOut = strlen(bufOut); /* Запускаем задачу отложенной перезагрузки. Контроллер должен успеть * отправить ответ серверу об успешном выполнении команды */ HTTP_StartResetTask(false); return bufOut; } /** * @brief Запускает задачу ресета контроллера * @param fBootMode: * true - перед перезагрузкой будет установлен флаг входа в режим * bootloader и перезаписаны настройки * * false - обычная перезагрузка */ void HTTP_StartResetTask(bool fBootMode) { static bool temp; temp = fBootMode; xTaskCreate(vTaskReboot, "RebootTask", configMINIMAL_STACK_SIZE, (void *)&temp, tskIDLE_PRIORITY, NULL); } /** * @brief */ void vTaskReboot(void *pvParameters) { bool mode = false; // тип перезагрузки (нужно ли устанавливать флаг bootloader) for (;;) { mode = *(bool *)pvParameters; if (mode) { SNMP_SendUserTrap(FW_VERSION_UPDATE); #if defined HARDWARE_BT6707 || HARDWARE_BT6709 if (telnet_act) { log_event_data(LOG_UPDATE_SOFT, name_login_telnet); } else #endif log_event_data(LOG_UPDATE_SOFT, name_login); SetLoadMode(); HTTP_SaveSettings(); vTaskDelay(2000); /* Блокируем управление ключем на тау секунд*/ //IO_KeyBlockOn(); vTaskDelay(1010); Reboot(); } else { vTaskDelay(1000); /* Блокируем управление ключем на тау секунд*/ //IO_KeyBlockOn(); vTaskDelay(1010); Reboot(); } } } /********************************* (C) ROTEK **********************************/