trap_api.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /********************************* (C) ROTEK ***********************************
  2. * @module trap_api
  3. * @file trap_api.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief trap_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 "trap_api.h"
  15. #include "parameters.h"
  16. #include "settings_api.h"
  17. #include "snmp_trap_pdu2.h"
  18. #include "lwip/apps/snmp.h"
  19. #include "lwip/snmp.h"
  20. #include "lwip/sys.h"
  21. /*
  22. #include "lwip/snmp.h"
  23. #include "lwip/snmp_msg.h"
  24. #include "lwip/snmp_asn1.h"
  25. #include "lwip/snmp_structs.h"
  26. */
  27. #ifdef PRINTF_STDLIB
  28. #include <stdio.h>
  29. #endif
  30. #ifdef PRINTF_CUSTOM
  31. #include "tinystdio.h"
  32. #endif
  33. #include <string.h>
  34. #include <stdbool.h>
  35. /**
  36. * @brief Общая структура настроек
  37. */
  38. extern SETTINGS_t sSettings;
  39. /**
  40. * @brief Пул всех возможных трапов устройства
  41. */
  42. TRAP_t traps[ALL_TRAPS];
  43. #define TRAP_ADD(trap_num, varbind, flag_enable, get_param) \
  44. do { \
  45. traps[trap_num].trapId = trap_num; \
  46. traps[trap_num].varbindId = varbind; \
  47. traps[trap_num].trapEnable = flag_enable; \
  48. traps[trap_num].handle = get_param; \
  49. } while (0);
  50. #ifdef HARDWARE_BT6709
  51. const char* name_traps[] =
  52. {
  53. "",
  54. "Начало обновл. ПО",
  55. "Успешное обновл. ПО",
  56. "Сброс настроек",
  57. "Перезагрузка",
  58. "Норм. темп. АКБ по верх. границы",
  59. "Авария темп. АКБ по верх. границы",
  60. "Авария на линии",
  61. "Нормализация линии",
  62. "Низкий заряд АКБ",
  63. "Нормализация заряда АКБ",
  64. "Нагрузка в норме",
  65. "Авария нагрузки",
  66. "Авария соединения с ИБП",
  67. "Норм. соединения с ИБП",
  68. "Отключение АКБ",
  69. "Подключение АКБ",
  70. "Норм. темп. АКБ по ниж. границы",
  71. "Авария темп. АКБ по ниж. границы",
  72. "Предупр. о замене АКБ",
  73. "Норм. предупрежд. о замене АКБ",
  74. };
  75. #endif
  76. /**
  77. * @brief Инициализация базы трапов
  78. * @retval
  79. */
  80. void SNMP_InitTrapsBase(void)
  81. {
  82. #define XTRAP(trap_num, varbind, flag_enable, get_param) TRAP_ADD(trap_num, varbind, flag_enable, get_param);
  83. TRAPS_TABLE
  84. #undef XTRAP
  85. }
  86. /**
  87. * @brief Отправка обычного трапа с сообщением, зарегистрированного в базе.
  88. * @retval
  89. */
  90. bool SNMP_SendMessageTrap(TRAP_t trap, char* str, uint8_t len)
  91. {
  92. /*
  93. const uint8_t maxMsgLen = 30;
  94. char msg[30];
  95. struct snmp_varbind *vb;
  96. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  97. if (len <= maxMsgLen)
  98. {
  99. trapObjId.id[trapObjId.len - 1] = trap.trapId;
  100. strcpy(msg, str);
  101. vb = snmp_varbind_alloc(&trapObjId, SNMP_ASN1_OPAQUE, strlen(msg));
  102. vb->value = msg;
  103. trap_msg.outvb.head = vb;
  104. trap_msg.outvb.tail = vb;
  105. trap_msg.outvb.count = 1;
  106. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0);
  107. trap_msg.outvb.head = NULL;
  108. trap_msg.outvb.tail = NULL;
  109. trap_msg.outvb.count = 0;
  110. snmp_varbind_list_free(&trap_msg.outvb);
  111. snmp_varbind_free(vb);
  112. return true;
  113. }
  114. else
  115. return false;
  116. */
  117. }
  118. struct snmp_varbind vb1, vb2, vb;
  119. char msg[50];
  120. uint32_t snmp_time = 0;
  121. struct snmp_obj_id mib2_base_oid_systime ={ 9, { 1, 3, 6, 1, 2, 1, 1, 3, 0 }};
  122. struct snmp_obj_id trap_oid = {11, {1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0}};
  123. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, SNMP_DEV_ROOT_OID, 2, 1}};
  124. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, SNMP_DEV_ROOT_OID, 1, 1}};
  125. /**
  126. * @brief Отправка трапа с переменной, зарегистрированного в базе.
  127. * @retval
  128. */
  129. bool SNMP_SendVarbindTrap(TRAP_t *trap)
  130. {
  131. uint8_t len = 0;
  132. memset(&vb1, 0, sizeof(struct snmp_varbind));
  133. memset(&vb2, 0, sizeof(struct snmp_varbind));
  134. memset(&vb, 0, sizeof(struct snmp_varbind));
  135. trapObjId.id[trapObjId.len - 1] = trap->trapId;
  136. varObjId.id[varObjId.len - 1] = trap->varbindId;
  137. trap->handle(msg, &len);
  138. vb.oid = mib2_base_oid_systime;
  139. vb.type = SNMP_ASN1_TYPE_TIMETICKS;
  140. MIB2_COPY_SYSUPTIME_TO(&snmp_time);
  141. vb.value = &snmp_time;
  142. vb.value_len = sizeof(uint32_t);
  143. vb.next = &vb1;
  144. vb.prev = NULL;
  145. vb1.oid = trap_oid;
  146. vb1.type = SNMP_ASN1_TYPE_OBJECT_ID;
  147. vb1.value = trapObjId.id;
  148. vb1.value_len = 4*trapObjId.len;
  149. vb1.next = &vb2;
  150. vb1.prev = &vb;
  151. vb2.oid = varObjId;
  152. vb2.type = SNMP_ASN1_TYPE_OCTET_STRING;
  153. vb2.value = msg;
  154. vb2.value_len = len;
  155. vb2.next = NULL;
  156. vb2.prev = &vb1;
  157. snmp_send_trap_pduv2(&vb);
  158. //snmp_send_trap(&trapObjId, SNMP_GENTRAP_ENTERPRISE_SPECIFIC, 0, &vb);
  159. return true;
  160. }
  161. /********************************* (C) ROTEK **********************************/