| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 | /********************************* (C) ROTEK *********************************** * @module  template * @file    template.c * @version 1.0.0 * @date    XX.XX.XXXX * $brief   Template ******************************************************************************* * @history     Version  Author         Comment * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release. ******************************************************************************* */#include "stm32f4xx.h"#include "snmp_api.h"#include "trap_api.h"#include "settings_api.h"#include "common_config.h"#include "rtc.h"#include "megatec.h"#include "log.h"#include "apps/snmp.h"#include "snmp_mib2.h"#include "snmp_core.h"#include "private_mib.h"#include "snmp_trap_pdu2.h"#ifdef PRINTF_STDLIB#include <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include <stdbool.h>#include <string.h>#include "lwip/opt.h"#include "lwip/api.h"#include "lwip/sys.h"#include "lwip/udp.h"//#include "snmp.h"//#include "snmp_msg.h"//#include "private_mib.h"#include "FreeRTOS.h"#include "task.h"#include "queue.h"/**  * @brief  Пул всех возможных трапов устройства  */extern TRAP_t traps[];/**  * @brief  Общая структура настроек  */extern SETTINGS_t sSettings;extern bool isIpReceived;/**  * @brief  Очередь для отправки трапов  */QueueHandle_t    SNMP_TrapQueue;/**  * @brief  Инициализация параметров SNMP  * @retval  */void SNMP_Init(void){    //snmp_mib *my_snmp_mibs[] = { &mib2, &private_mib };    //SETTINGS_SetSnmpDef();    SNMP_AgentInit();    lwip_privmib_init();    //snmp_set_mibs(my_snmp_mibs, LWIP_ARRAYSIZE(my_snmp_mibs));}/**  * @brief  Системный тик SNMP. Таск должен вызываться с частотой 100Гц.  * @retval  */void SNMP_SysUpTimeTask(void *arg){    TickType_t xLastWakeTime;    const TickType_t xFrequency = 10;    xLastWakeTime = xTaskGetTickCount();    while (1) {        vTaskDelayUntil( &xLastWakeTime, xFrequency );        //snmp_inc_sysuptime();    }}/**  * @brief  Тестовый таск для проверки отправки трапов  * @retval  */void snmp_trap_tread(void *arg){    uint8_t trapName;    while (1) {        if (isIpReceived) {            if (xQueueReceive(SNMP_TrapQueue, &trapName, 0) == pdTRUE) {#ifdef NOTIFICATION_CONTROL_ENABLE                if (sSettings.sFlagNotification[trapName])#endif                {                    SNMP_SetManagerIP(sSettings.sSnmp.managerIP);                    SNMP_SendVarbindTrap(&traps[trapName]);                    SNMP_SetManagerIP(sSettings.sSnmp.managerIP2);                    SNMP_SendVarbindTrap(&traps[trapName]);                    SNMP_SetManagerIP(sSettings.sSnmp.managerIP3);                    SNMP_SendVarbindTrap(&traps[trapName]);                    SNMP_SetManagerIP(sSettings.sSnmp.managerIP4);                    SNMP_SendVarbindTrap(&traps[trapName]);                    SNMP_SetManagerIP(sSettings.sSnmp.managerIP5);                    SNMP_SendVarbindTrap(&traps[trapName]);                }            }        }        vTaskDelay(10);    }}/**  * @brief  Инициализация SNMP агента  * @retval  */void SNMP_AgentInit(void){    SNMP_SetObjDescr();    SNMP_SetReadCommunity(sSettings.sSnmp.readCommunity);    SNMP_SetWriteCommunity(sSettings.sSnmp.writeCommunity);    SNMP_SetSysContact(&sSettings.sSnmp.sysContact);    SNMP_SetSysName(&sSettings.sSnmp.sysName);    SNMP_SetSysLocation(&sSettings.sSnmp.sysLocation);    SNMP_SetManagerIP(sSettings.sSnmp.managerIP);  //SNMP_SetManagerIP("192.168.14.37");    SNMP_SetObjID();    SNMP_SetTrapOnOff(1);    SNMP_InitTrapsBase();    snmp_init();    udp_init();    SNMP_TrapQueue = xQueueCreate(SNMP_TRAP_QUEUE_SIZE, sizeof(uint8_t));}/**  * @brief  Пользовательская функция для отправки трапа из массива traps[]  *         Трап помещается в очередь. Работа с очередью происходит по принципу  *         FIFO буфера.  *         Если в настройках трапа отправка отключена, то трап игнорируется.  * @retval  */void SNMP_SendUserTrap(uint8_t trapName){    uint16_t availableSpace;    uint8_t  dummyTrap;    if (traps[trapName].trapEnable) {        availableSpace = uxQueueSpacesAvailable(SNMP_TrapQueue);        if (availableSpace == 0) {            xQueueReceive(SNMP_TrapQueue, &dummyTrap, 0);        }        xQueueSend(SNMP_TrapQueue, &trapName, 0);    }}/**  * @brief  Установить SNMP Descriptor  * @retval  */// TODOvoid SNMP_SetObjDescr(void){    memset(sSettings.sSnmp.sysDesc.description, 0, sizeof(sSettings.sSnmp.sysDesc.description));    strcpy(sSettings.sSnmp.sysDesc.description, HW_REV);    strcat(sSettings.sSnmp.sysDesc.description, " ");    strcat(sSettings.sSnmp.sysDesc.description, VERSION);    strcat(sSettings.sSnmp.sysDesc.description, " ");    sSettings.sSnmp.sysContact.contact[sSettings.sSnmp.sysContact.len] = 0;    strcat(sSettings.sSnmp.sysDesc.description, sSettings.sSnmp.sysContact.contact);    strcat(sSettings.sSnmp.sysDesc.description, " ");    strcat(sSettings.sSnmp.sysDesc.description, sSettings.sInfo.serialNumber);    strcat(sSettings.sSnmp.sysDesc.description, " ");    strcat(sSettings.sSnmp.sysDesc.description, UPS.model);    strcat(sSettings.sSnmp.sysDesc.description, " ");    strcat(sSettings.sSnmp.sysDesc.description, UPS.serial);    sSettings.sSnmp.sysDesc.len = strlen(sSettings.sSnmp.sysDesc.description);    snmp_mib2_set_sysdescr((u8_t *)sSettings.sSnmp.sysDesc.description, &sSettings.sSnmp.sysDesc.len);}void SNMP_SettingsSave(void){    SETTINGS_Save();    log_event_data(LOG_SETTING_SAVE, "Администратор (SNMP)");    SNMP_SetObjDescr();}/**  * @brief  Установить SNMP Community для чтения  */void SNMP_SetReadCommunity(char *comm){    //strcpy(sSettings.sSnmp.readCommunity, comm);    snmp_set_community(comm);}/**  * @brief  Установить SNMP Community для записи  */void SNMP_SetWriteCommunity(char *comm){    //strcpy(sSettings.sSnmp.writeCommunity, comm);    snmp_set_community_write(comm);}/**  * @brief  Установить SNMP SysContact  * @retval  */void SNMP_SetSysContact(SNMP_SYS_CONTACT_t *con){    snmp_mib2_set_syscontact((u8_t *)con->contact, &con->len, (sizeof(con->contact) - 1));}/**  * @brief  Установить SNMP SysName  * @retval  */void SNMP_SetSysName(SNMP_SYS_NAME_t *name){    snmp_mib2_set_sysname((u8_t *)name->name, &name->len, (sizeof(name->name) - 1));}/**  * @brief  Установить SNMP SysLocation  * @retval  */void SNMP_SetSysLocation(SNMP_SYS_LOCATION_t *loc){    snmp_mib2_set_syslocation((u8_t *)loc->location, &loc->len, (sizeof(loc->location) - 1));}/**  * @brief  Установить SNMP SysManagerIP  * @retval  */void SNMP_SetManagerIP(char *ip){    static ip_addr_t trap_addr;    ipaddr_aton(ip, &trap_addr);    // snmp_trap_dst_ip_set(0, &trap_addr);    snmp_trap_pduv2_dst_ip_set(0, &trap_addr);}/**  * @brief  Установить SNMP Object ID  * @retval  */void SNMP_SetObjID(void){    static struct snmp_obj_id my_object_id = {9, {1, 3, 6, 1, 4, 1, 41752, 911, SNMP_DEV_ROOT_OID}};    snmp_set_device_enterprise_oid(&my_object_id);}/**  * @brief  Вкл/выкл трапы  * @retval  */void SNMP_SetTrapOnOff(uint8_t state){    //snmp_trap_dst_enable(0, (u8_t)state);    snmp_trap_pduv2_dst_enable(0, (u8_t)state);}/********************************* (C) ROTEK **********************************/
 |