| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713 | /********************************* (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 "trap_params.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 <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include <string.h>typedef  void (*pFunction)(void);pFunction Jump_To_Application;uint32_t JumpAddress;extern uint8_t seclevel;/**  * @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_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);#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;    if (seclevel == USER) {      return 0;    }    /* 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);#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;}/**  * @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(bufOut, &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 **********************************/
 |