| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131 | #include "stm32f4xx.h"  #include "private_mib.h"#include "lwip/snmp.h"#include "lwip/snmp_msg.h"#include "lwip/snmp_asn1.h"#include "lwip/snmp_structs.h"#include "settings_api.h"#include "parameters.h"#include "web_params_api.h"#include "snmp_api.h"#include "trap_api.h"#include "common_config.h"#include "log.h"#include "megatec.h"#include "FreeRTOS.h"#include "task.h"#ifdef PRINTF_STDLIB#include <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include <stdlib.h>/**  * @brief  Общая структура настроек  */extern SETTINGS_t sSettings;extern float TimeParamFloat;extern void ocstrncpy(u8_t *dst, u8_t *src, u16_t n);char paramStr[255];uint8_t paramLength = 0;uint32_t paramInt = 0;static void system_get_object_def_ee( u8_t ident_len, s32_t *ident, struct obj_def *od );static void system_get_value_ee(struct obj_def *od, u16_t len, void *value);static u8_t system_set_test_ee(struct obj_def *od, u16_t len, void *value);static void system_set_value_ee(struct obj_def *od, u16_t len, void *value);/* Функции для узла Signals */static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od);static void signals_get_value (struct obj_def *od, u16_t len, void *value);static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value);static void signals_set_value (struct obj_def *od, u16_t len, void *value);/*------------------------------------------------------------------------------ Описание узлов ------------------------------------------------------------------------------*//* узел SYSTEM (операции с EEPROM) *//*             0 1 2 3 4 5 6 *//* system .1.3.6.1.2.1.1 */const mib_scalar_node system_scalar_ee = {  &system_get_object_def_ee,  &system_get_value_ee,  &system_set_test_ee,  &system_set_value_ee,  MIB_NODE_SC,  0};// переменные узла SIGNALS ------------------------------------------const mib_scalar_node signals_var = {  &signals_get_object_def,  &signals_get_value,  &signals_set_test,  &signals_set_value,  MIB_NODE_SC,  0};// узел SIGNALS -----------------------------------------------------const s32_t signals_ids[18] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 };struct mib_node* const signals_nodes[18] ={  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,  (struct mib_node* const)&signals_var,};const struct mib_array_node signals = {  &noleafs_get_object_def,  &noleafs_get_value,  &noleafs_set_test,  &noleafs_set_value,  MIB_NODE_AR,  18,  signals_ids,  signals_nodes};// узел BT-6701 ------------------------------------------------------------const s32_t bt6701_ids[1] = { 1 };struct mib_node* const bt6701_nodes[1] = {  (struct mib_node* const)&signals,};const struct mib_array_node bt6701 = {  &noleafs_get_object_def,  &noleafs_get_value,  &noleafs_set_test,  &noleafs_set_value,  MIB_NODE_AR,  1,  bt6701_ids,  bt6701_nodes};// узел swt ------------------------------------------------------------const s32_t swt_ids[1] = { 3};struct mib_node* const swt_nodes[1] = {  (struct mib_node* const)&bt6701,};const struct mib_array_node swt = {  &noleafs_get_object_def,  &noleafs_get_value,  &noleafs_set_test,  &noleafs_set_value,  MIB_NODE_AR,  1,  swt_ids,  swt_nodes};// узел ROTEK ------------------------------------------------------------const s32_t rotek_ids[1] = { 911 };struct mib_node* const rotek_nodes[1] = {  (struct mib_node* const)&swt,};const struct mib_array_node rotek = {  &noleafs_get_object_def,  &noleafs_get_value,  &noleafs_set_test,  &noleafs_set_value,  MIB_NODE_AR,  1,  rotek_ids,  rotek_nodes};// узел ENTERPRISES -------------------------------------------------------const s32_t enterprises_ids[1] = { 41752 };struct mib_node* const enterprises_nodes[1] = {  (struct mib_node* const)&rotek};const struct mib_array_node enterprises = {  &noleafs_get_object_def,  &noleafs_get_value,  &noleafs_set_test,  &noleafs_set_value,  MIB_NODE_AR,  1,  enterprises_ids,  enterprises_nodes};// узел PRIVATE -----------------------------------------------------------const s32_t mib_private_ids[1] = { 1 };struct mib_node* const mib_pivate_nodes[1] = {  (struct mib_node* const)&enterprises};const struct mib_array_node mib_private = {  &noleafs_get_object_def,  &noleafs_get_value,  &noleafs_set_test,  &noleafs_set_value,  MIB_NODE_AR,  1,  mib_private_ids,  mib_pivate_nodes};/*------------------------------------------------------------------------------ Функции------------------------------------------------------------------------------*/// Функции для узла SIGNALS/**----------------------------------------------------------------------------- \fn     static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od) \brief  функция получения свойств переменных узла Identification \param  ident_len - the address length. длина адреса \param  ident - points to objectname.0 (object id trailer)  \param  od - points to object definition. указатель на описание переменной \return нет------------------------------------------------------------------------------*/static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od){  u8_t id;    /* return to object name, adding index depth (1) */  ident_len += 1;  ident -= 1;  if (ident_len == 2)  {    od->id_inst_len = ident_len;    od->id_inst_ptr = ident;    id = ident[0];        switch (id)    {      case 1: /* FWVersion */		GetVersionStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;	 case 2: /* RestoreSignal */        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_WRITE_ONLY;        od->asn_type = SNMP_ASN1_INTEG;        od->v_len = sizeof(s32_t);        break;	  case 3: /* RebootSignal */		od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_WRITE_ONLY;        od->asn_type = SNMP_ASN1_INTEG;        od->v_len = sizeof(s32_t);        break;	  case 4: /* UPSModel*/		GetUPSModelStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;	  case 5: /* DO1*/		GetDOUTStatusStr(paramStr, ¶mLength, 0);		od->instance = MIB_OBJECT_SCALAR;		od->access = MIB_OBJECT_READ_WRITE;		od->asn_type = SNMP_ASN1_OC_STR;		od->v_len = paramLength;		break;	  case 6: /* DO2*/		GetDOUTStatusStr(paramStr, ¶mLength, 1);		od->instance = MIB_OBJECT_SCALAR;		od->access = MIB_OBJECT_READ_WRITE;		od->asn_type = SNMP_ASN1_OC_STR;		od->v_len = paramLength;		break;	  case 7: /* BatTest*/		od->instance = MIB_OBJECT_SCALAR;		od->access = MIB_OBJECT_WRITE_ONLY;		od->asn_type = SNMP_ASN1_INTEG;		od->v_len = sizeof(s32_t);		break;	  case 8: /* Shutdown UPS*/		od->instance = MIB_OBJECT_SCALAR;		od->access = MIB_OBJECT_WRITE_ONLY;		od->asn_type = SNMP_ASN1_OC_STR;		od->v_len = paramLength;		break;	  case 9: /* DIO*/		GetDINStatusStr(paramStr, ¶mLength, 0);		od->instance = MIB_OBJECT_SCALAR;		od->access = MIB_OBJECT_READ_ONLY;		od->asn_type = SNMP_ASN1_OC_STR;		od->v_len = paramLength;		break;	  case 10: /* IntTemp */		GetInternalTempStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;	  case 11: /* InFreq */		GetInputFreqStr(paramStr, ¶mLength);		od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;		break;	  case 12: /* InVoltVAC */		GetInputVoltageStr(paramStr, ¶mLength);		od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;		break;	  case 13: /* OutVoltVAC */		GetOutputVoltageStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;	  case 14: /* Power */		GetPowerStr(paramStr, ¶mLength);		od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;		break;	  case 15: /* BatCap */		GetBatCapacityStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;	  case 16: /* BatTime */		GetRuntimeStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;	      case 17: /* ConnectMonitor */		GetConnectMonitorStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;      case 18: /* Alarms */    	GetAlarmStr(paramStr, ¶mLength);        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_ONLY;        od->asn_type = SNMP_ASN1_OC_STR;        od->v_len = paramLength;        break;      default:        //LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no such object\n"));        od->instance = MIB_OBJECT_NONE;        break;    };  }  else  {    LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no scalar\n"));    od->instance = MIB_OBJECT_NONE;  }}/**----------------------------------------------------------------------------- \fn     static void Identification_get_value(struct obj_def *od, u16_t len, void *value) \brief  функция получения значения переменных узла Identification \param  obj_def - указатель на описание переменной \param  len - длина переменной в байтах  \param  value - указатель на значение переменной \return нет------------------------------------------------------------------------------*/static void signals_get_value (struct obj_def *od, u16_t len, void *value){  u8_t id;    id = od->id_inst_ptr[0];    switch (id)  {    case 1: /* FWVersion */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;	case 2: /* RestoreSignal */	  *((s32_t*)value) = 0;      break;	case 3: /* RebootSignal */	  *((s32_t*)value) = 0;      break;	case 4: /* UPSModel */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);	  break;	case 5: /* DO1 */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);	  break;	case 6: /* DO2 */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);	  break;	case 7: /* BatTest */	  *((s32_t*)value) = 0;	  break;	case 8: /* Shutdown UPS */	  *((s32_t*)value) = 0;	  break;	case 9: /* DIO */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);	  break;	case 10: /* IntTemp */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;  	case 11: /* InFreq */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;	case 12: /* InVoltVAC */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;	case 13: /* OutVoltVAC */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;	case 14: /* Power */      ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;	case 15: /* BatCap */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;    case 16: /* BatTime */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;    case 17: /* ConnectMonitor */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;    case 18: /* Alarms */	  ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);      break;    default :	  break;  };}/**----------------------------------------------------------------------------- \fn     static void Identification_set_value (struct obj_def *od, u16_t len, void *value) \brief  функция записи значений переменных узла Identification \param  obj_def - указатель на описание переменной \param  len - длина переменной в байтах  \param  value - указатель на значение переменной \return нет------------------------------------------------------------------------------*/static void signals_set_value (struct obj_def *od, u16_t len, void *value){  u8_t id;  uint32_t val;  char *val_string;  char str[20];  int8_t res = 0;  memset(str, 0, 20);    id = od->id_inst_ptr[0];    switch (id)  {    case 2: /* RestoreSignal */      val = *((s32_t*)value);      if (val == 1) {    	SNMP_SendUserTrap(DEVICE_RESTORED);		log_event_data(LOG_SYSTEM_DEFCONFIG, "Администратор");		vTaskDelay(500);		SETTINGS_SetPartDefault();		SETTINGS_Save();      }    break;    case 3: /* RebootSignal */      val = *((s32_t*)value);      if (val == 1){#ifndef BT6702_SERVICE		SNMP_SendUserTrap(DEVICE_REBOOTED);		log_event_data(LOG_SYSTEM_BOOT, "Администратор");		vTaskDelay(1010);		LOG_Disable();#endif		NVIC_SystemReset();      }    break;	case 5: /* DO1 */	  if(sSettings.sInOuts.ro_type_source[0] == SNMP_SET){		  val_string = (char*)value;		  SetROStr(val_string, 0);		  if(val_string[0] == 0x31)			  strcat(str, "Замкнуто");		  else			  strcat(str, "Разомкнуто");		  SNMP_SendUserTrap(DO0_TOGGLED);		  log_event_data(LOG_DO0_STATE, str);	  }	  break;	case 6: /* DO2 */	  if(sSettings.sInOuts.ro_type_source[1] == SNMP_SET){		  val_string = (char*)value;		  SetROStr(val_string, 1);		  if(val_string[0] == 0x31)			  strcat(str, "Замкнуто");		  else			  strcat(str, "Разомкнуто");		  SNMP_SendUserTrap(DO1_TOGGLED);		  log_event_data(LOG_DO1_STATE, str);	  }	  break;	case 7: /* BatTest */	  val =*((s32_t*)value);	  if(val == 0){		  res = ups_metac_service_pdu(ups_cancel_test);		  if(res == 1){			  log_event_data(LOG_TEST_UPS, "Администратор (Останов)");		  }	  }	  else if(val > 0 && val < 100){		  TimeParam = val;		  res = ups_metac_service_pdu(ups_test_time);		  if(res == 1){			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");		  }	  }	  else if(val == 100){		  res = ups_metac_service_pdu(ups_test_10sec);		  if(res == 1){			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");		  }	  }	  else if(val == 999){		  res = ups_metac_service_pdu(ups_test_low_bat);		  if(res == 1){			  log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");		  }	  }	  break;	case 8: /* Shutdown UPS */	  val_string = (char*)value;	  float shtdn_val = atof(val_string);	  if(shtdn_val == 0){		  res = ups_metac_service_pdu(ups_cancel_shut_down);		 	if(res == 1){		 		log_event_data(LOG_SHUTDOWN_UPS, "Администратор (Останов)");		 	}	  }	  else{		TimeParamFloat = shtdn_val;		res = ups_metac_service_pdu(ups_shutdown);		if(res == 1)			log_event_data(LOG_SHUTDOWN_UPS, "Администратор");	  }	  break;    default :    break;  };  }/**----------------------------------------------------------------------------- \fn     static u8_t Identification_set_test (struct obj_def *od, u16_t len, void *value) \brief  функция проверки записываемых значений переменных узла Identification \param  obj_def - указатель на описание переменной \param  len - длина переменной в байтах  \param  value - указатель на значение переменной \return 0 - некорректное значение         1 - корректное значение------------------------------------------------------------------------------*/static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value){  u8_t id, set_ok;  char *val_string;  int32_t val;  LWIP_UNUSED_ARG(value);  set_ok = 0;  id = od->id_inst_ptr[0];    switch (id)  {    case 2:       if ( len == sizeof(s32_t) )      {        set_ok = 1;      }      break;  	      case 3:       if ( len == sizeof(s32_t) )      {        set_ok = 1;      }      break; 	case 5: /* DO1 */		if ( len <= 1 )	    {		   val_string = (char*)value;		   val_string[len] = 0;		   if(atoi(val_string) <= 1){			   if(sSettings.sInOuts.ro_type_source[0] == SNMP_SET)				   set_ok = 1;		   }	    }	  break;	case 6: /* DO2 */		if ( len <= 1 )		{		   val_string = (char*)value;		   val_string[len] = 0;		   if(atoi(val_string) <= 1){			   if(sSettings.sInOuts.ro_type_source[1] == SNMP_SET)				   set_ok = 1;		   }		}	  break;	case 7: /* BatTest */	   val = *((s32_t*)value);	   if((val >= 0 && val <= 100) || val == 999){		   set_ok = 1;	   }	  break;	case 8: /* Shutdown UPS */		if ( len <= 3 )		{		   val_string = (char*)value;		   val_string[len] = 0;		   if(atof(val_string) <= 10){			set_ok = 1;		   }		}	  break;  };    return set_ok;}/** * Returns systems object definitions (eeprom). * * @param ident_len the address length (2) * @param ident points to objectname.0 (object id trailer) * @param od points to object definition. */static voidsystem_get_object_def_ee(u8_t ident_len, s32_t *ident, struct obj_def *od){  u8_t id;  /* return to object name, adding index depth (1) */  ident_len += 1;  ident -= 1;  if (ident_len == 2)  {    od->id_inst_len = ident_len;    od->id_inst_ptr = ident;    id = ident[0];    //LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def_ee system.%"U16_F".0\n",(u16_t)id));    switch (id)    {      case 4: /* sysContact */        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_WRITE;        od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);        od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSCONTACT_TYPE)*/;        break;      case 5: /* sysName */        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_WRITE;        od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);        od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSNAME_TYPE)*/;        break;      case 6: /* sysLocation */        od->instance = MIB_OBJECT_SCALAR;        od->access = MIB_OBJECT_READ_WRITE;        od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);        od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSLOCATION_TYPE)*/;        break;      default:        //LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def_ee: no such object\n"));        od->instance = MIB_OBJECT_NONE;        break;    };  }  else  {    LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def_ee: no scalar\n"));    od->instance = MIB_OBJECT_NONE;  }}// ----------------------------------------------------------------------------/** * Returns system object value. * * @param ident_len the address length (2) * @param ident points to objectname.0 (object id trailer) * @param len return value space (in bytes) * @param value points to (varbind) space to copy value into. */static voidsystem_get_value_ee(struct obj_def *od, u16_t len, void *value){  u8_t id;  id = od->id_inst_ptr[0];  switch (id)  {    case 4: /* sysContact */      //GetSnmpString(SNMP_SYSCONTACT_TYPE, value, len );      break;    case 5: /* sysName */      //GetSnmpString(SNMP_SYSNAME_TYPE, value, len );      break;    case 6: /* sysLocation */      //GetSnmpString(SNMP_SYSLOCATION_TYPE, value, len );      break;  };}// ----------------------------------------------------------------------------static u8_tsystem_set_test_ee(struct obj_def *od, u16_t len, void *value){  u8_t id, set_ok;  LWIP_UNUSED_ARG(value);  set_ok = 0;  id = od->id_inst_ptr[0];  switch (id)  {    case 4: /* sysContact */      if ( len <= 255 )      {        set_ok = 1;      }      break;    case 5: /* sysName */      if ( len <= 255 )      {        set_ok = 1;      }      break;    case 6: /* sysLocation */      if ( len <= 255 )      {        set_ok = 1;      }      break;  };  return set_ok;}// ----------------------------------------------------------------------------static voidsystem_set_value_ee(struct obj_def *od, u16_t len, void *value){  u8_t id;  id = od->id_inst_ptr[0];  switch (id)  {    case 4: /* sysContact */      //SetSnmpString(SNMP_SYSCONTACT_TYPE, value, len );      //*syscontact_len_ptr = len;    break;    case 5: /* sysName */      //SetSnmpString(SNMP_SYSNAME_TYPE, value, len );      //*sysname_len_ptr = len;    break;    case 6: /* sysLocation */      //SetSnmpString(SNMP_SYSLOCATION_TYPE, value, len );      //*syslocation_len_ptr = len;    break;  };}// ----------------------------------------------------------------------------/**----------------------------------------------------------------------------- \fn     err_t snmp_send_trap_ex (s8_t generic_trap,                          struct snmp_obj_id *eoid,                          s32_t specific_trap,                          struct snmp_obj_id* varbinds,                          u8_t varbinds_num) \brief  функция посылки трапа с возможностью пристыковывать переменные \param  generic_trap  - код трапа \param  eoid          - указатель на enterprise object identifier \param  specific_trap - used for enterprise traps when generic_trap == 6 \param  varbinds      - указатель на переменные \param  varbinds_num  - число переменных \return код ошибки------------------------------------------------------------------------------*/err_t snmp_send_trap_ex (s8_t generic_trap,                          struct snmp_obj_id *eoid,                          s32_t specific_trap,                          struct snmp_obj_id* varbinds,                          u8_t varbinds_num){	uint8_t bSnmpActive = 1;		struct snmp_varbind** vb_list;	struct mib_node* node;	struct obj_def obj;	err_t tResult;	s32_t* VarNum;    struct snmp_name_ptr np;		/* SNMP не готово - ничего не отправляем */	if( !bSnmpActive )	{		return ERR_MEM;	}		/* создаем таблицу указателей переменных */	pvPortMalloc( varbinds_num * sizeof(struct snmp_varbind*) );	/*	if(vb_list == NULL)	{		return ERR_MEM;	}	*/	/* создаем сами переменные */	for(u8_t i = 0; i < varbinds_num; i++)	{		/* ищем узел в дереве*/		node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len - 3, 										 &varbinds[i].id[4], &np );				//node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len, 		//								 &varbinds[i].id[0], &np );				if(node != NULL)		{			/* получаем информацию о переменной узла */			VarNum = &varbinds[i].id[ varbinds[i].len - 1 ];						if( node->node_type == MIB_NODE_EX)			{				struct mib_external_node* node_ex;				node_ex = (struct mib_external_node*)node;				/* TODO: подставить правильный rid вместо 0 */				node_ex->get_object_def_a(0, 1, VarNum, &obj);			}			else			{				node->get_object_def(1, VarNum, &obj);			}						/* создаем переменную */			vb_list[i] = snmp_varbind_alloc(&varbinds[i], obj.asn_type, obj.v_len);			if( vb_list[i] != NULL )			{				{					/* получаем значение переменной */					if( node->node_type == MIB_NODE_EX)					{						struct mib_external_node* node_ex;						node_ex = (struct mib_external_node*)node;						/* TODO: подставить правильный rid вместо 0 */						node_ex->get_value_a(0, &obj, obj.v_len, vb_list[i]->value);					}					else					{						node->get_value(&obj, obj.v_len, vb_list[i]->value);					}					/* добавляем переменную в ловушку */					snmp_varbind_tail_add(&trap_msg.outvb, vb_list[i]);				}			}		}	}	/* посылаем ловушку */	tResult = snmp_send_trap(generic_trap, eoid, specific_trap);		/* удаляем переменные из списка */	snmp_varbind_list_free(&trap_msg.outvb);		/* удаляем указатели переменных */	vPortFree(vb_list);		return tResult;}void SNMP_SendTestTrap(void){/*    struct snmp_varbind *vb;  struct snmp_obj_id objid = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 2, 1}};  unsigned char msg[] = "Sex, drugs and LwIP";  unsigned char msglen = 19;    vb = snmp_varbind_alloc(&objid, SNMP_ASN1_OPAQUE, msglen);    vb->value = &msg;             trap_msg.outvb.head = vb;  trap_msg.outvb.tail = vb;  trap_msg.outvb.count = 1;    snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &objid, 0);       trap_msg.outvb.head = NULL;  trap_msg.outvb.tail = NULL;  trap_msg.outvb.count = 0;  //vb->value = NULL;       snmp_varbind_free(vb);*/    static struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 2, 1}};  static struct snmp_obj_id varObjId  = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 1, 1}};    struct snmp_varbind* vb;  u32_t *u32ptr;    vb = snmp_varbind_alloc(&varObjId, MIB_NODE_SC, 4);    vb->value_len = 4;  vb->value_type = 0x02;  u32ptr = vb->value; 	  *u32ptr = 23;    if( vb != NULL )	snmp_varbind_tail_add(&trap_msg.outvb, vb);			  snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0);	  /* удаляем переменные из списка */  snmp_varbind_list_free(&trap_msg.outvb);    //snmp_send_trap_ex(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0, &varObjId, 1);    #if 0		struct snmp_varbind** vb_list;	struct mib_node* node;	struct obj_def obj;	err_t tResult;	s32_t* VarNum;    struct snmp_name_ptr np;		/* создаем указатель на переменную */	pvPortMalloc(sizeof(struct snmp_varbind*) );	/* создаем сами переменные */	for(u8_t i = 0; i < varbinds_num; i++)	{		/* ищем узел в дереве*/		node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len - 4, 										 &varbinds[i].id[4], &np );				//node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len, 		//								 &varbinds[i].id[0], &np );				if(node != NULL)		{			/* получаем информацию о переменной узла */			VarNum = &varbinds[i].id[ varbinds[i].len - 1 ];						if( node->node_type == MIB_NODE_EX)			{				struct mib_external_node* node_ex;				node_ex = (struct mib_external_node*)node;				/* TODO: подставить правильный rid вместо 0 */				node_ex->get_object_def_a(0, 1, VarNum, &obj);			}			else			{				node->get_object_def(1, VarNum, &obj);			}						/* создаем переменную */			vb_list[i] = snmp_varbind_alloc(&varbinds[i], obj.asn_type, obj.v_len);			if( vb_list[i] != NULL )			{				{					/* получаем значение переменной */					if( node->node_type == MIB_NODE_EX)					{						struct mib_external_node* node_ex;						node_ex = (struct mib_external_node*)node;						/* TODO: подставить правильный rid вместо 0 */						node_ex->get_value_a(0, &obj, obj.v_len, vb_list[i]->value);					}					else					{						node->get_value(&obj, obj.v_len, vb_list[i]->value);					}					/* добавляем переменную в ловушку */					snmp_varbind_tail_add(&trap_msg.outvb, vb_list[i]);				}			}		}	}	/* посылаем ловушку */	tResult = snmp_send_trap(generic_trap, eoid, specific_trap);		/* удаляем переменные из списка */	snmp_varbind_list_free(&trap_msg.outvb);		/* удаляем указатели переменных */	vPortFree(vb_list);		return tResult;#endif	}#define NUM_PRIVATE_TRAP 10 //static unsigned char SNMP_TRAP_0_FLAG = 1;//static struct ip_addr SNMP_TRAP_0_ADDR; extern struct snmp_msg_trap trap_msg; struct private_trap{  /* source enterprise ID (sysObjectID) */  struct snmp_obj_id *enterprise;   /* trap ID */  struct snmp_obj_id *trap_oid;   /* specific trap code */  u32_t spc_trap;   /* object value ASN1 type */  u8_t value_type;  /* object value length (in u8_t) */  u8_t value_len;  /* object value */  void *value;  /* indicate that the trap is sent */  u8_t in_use;}; struct private_trap trap_bank[NUM_PRIVATE_TRAP]; struct private_trap * getNextFreePrivateTrap(){   u8_t index;   void * result = NULL;     for(index = 0; index < NUM_PRIVATE_TRAP; index++)   {      if(!trap_bank[index].in_use)      {         trap_bank[index].in_use = 1;         result = &trap_bank[index];                 break;      }   }     return result; } void freePrivateTrap(struct private_trap * trap){   trap->enterprise = NULL;   trap->trap_oid = NULL;   trap->value = NULL;   trap->in_use = 0;  } void vSendTrapCallback( void * parameters ){   struct private_trap * trapToSend;   struct snmp_varbind * vb;     if( parameters != NULL )   {      trapToSend = (struct private_trap *) parameters;           vb = snmp_varbind_alloc(trapToSend->enterprise,                              trapToSend->value_type,                              trapToSend->value_len);                                   vb->value = trapToSend->value;                 trap_msg.outvb.head = vb;      trap_msg.outvb.tail = vb;      trap_msg.outvb.count = 1;           snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, trapToSend->trap_oid, trapToSend->spc_trap);           trap_msg.outvb.head = NULL;      trap_msg.outvb.tail = NULL;      trap_msg.outvb.count = 0;           vb->value = NULL;           snmp_varbind_free(vb);           freePrivateTrap(trapToSend);   }  }  
 |