trap_api.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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 "stm32f4xx.h"
  13. #include "trap_api.h"
  14. #include "parameters.h"
  15. #include "settings_api.h"
  16. #include "snmp_trap_pdu2.h"
  17. #include "lwip/apps/snmp.h"
  18. #include "lwip/snmp.h"
  19. #include "lwip/sys.h"
  20. /*
  21. #include "lwip/snmp.h"
  22. #include "lwip/snmp_msg.h"
  23. #include "lwip/snmp_asn1.h"
  24. #include "lwip/snmp_structs.h"
  25. */
  26. #ifdef PRINTF_STDLIB
  27. #include <stdio.h>
  28. #endif
  29. #ifdef PRINTF_CUSTOM
  30. #include "tinystdio.h"
  31. #endif
  32. #include <string.h>
  33. #include <stdbool.h>
  34. /**
  35. * @brief Общая структура настроек
  36. */
  37. extern SETTINGS_t sSettings;
  38. /**
  39. * @brief Пул всех возможных трапов устройства
  40. */
  41. TRAP_t traps[ALL_TRAPS];
  42. #ifdef HARDWARE_BT6709
  43. const char* name_traps[] =
  44. {
  45. "",
  46. "Начало обновл. ПО",
  47. "Успешное обновл. ПО",
  48. "Сброс настроек",
  49. "Перезагрузка",
  50. "Норм. темп. АКБ по верх. границы",
  51. "Авария темп. АКБ по верх. границы",
  52. "Авария на линии",
  53. "Нормализация линии",
  54. "Низкий заряд АКБ",
  55. "Нормализация заряда АКБ",
  56. "Нагрузка в норме",
  57. "Авария нагрузки",
  58. "Авария соединения с ИБП",
  59. "Норм. соединения с ИБП",
  60. "Отключение АКБ",
  61. "Подключение АКБ",
  62. "Норм. темп. АКБ по ниж. границы",
  63. "Авария темп. АКБ по ниж. границы",
  64. "Предупр. о замене АКБ",
  65. "Норм. предупрежд. о замене АКБ",
  66. };
  67. #endif
  68. /**
  69. * @brief Инициализация базы трапов
  70. * @retval
  71. */
  72. void SNMP_InitTrapsBase(void)
  73. {
  74. /* 1. FWVersionUpdate */ // +
  75. traps[FW_VERSION_UPDATE].trapId = FW_VERSION_UPDATE;
  76. traps[FW_VERSION_UPDATE].varbindId = 1;
  77. traps[FW_VERSION_UPDATE].trapEnable = true;
  78. traps[FW_VERSION_UPDATE].handle = GetVersionStr; /* FWVersion */
  79. /* 2. FWVersionUpdated */ // +
  80. traps[FW_VERSION_UPDATED].trapId = FW_VERSION_UPDATED;
  81. traps[FW_VERSION_UPDATED].varbindId = 1;
  82. traps[FW_VERSION_UPDATED].trapEnable = true;
  83. traps[FW_VERSION_UPDATED].handle = GetVersionStr; /* FWVersion */
  84. /* 3. DeviceRestored */ // +
  85. traps[DEVICE_RESTORED].trapId = DEVICE_RESTORED;
  86. traps[DEVICE_RESTORED].varbindId = 1;
  87. traps[DEVICE_RESTORED].trapEnable = true;
  88. traps[DEVICE_RESTORED].handle = GetVersionStr;//GetRestore; /* RestoreSignal */
  89. /* 4. DeviceRebooted */ // +
  90. traps[DEVICE_REBOOTED].trapId = DEVICE_REBOOTED;
  91. traps[DEVICE_REBOOTED].varbindId = 1;
  92. traps[DEVICE_REBOOTED].trapEnable = true;
  93. traps[DEVICE_REBOOTED].handle = GetVersionStr;//GetReboot; /* RebootSignal */
  94. #ifndef HARDWARE_BT6709
  95. /* 5. DI0Norm */ // +
  96. traps[DI0_NORM].trapId = DI0_NORM;
  97. #ifdef HARDWARE_BT6703
  98. traps[DI0_NORM].varbindId = 9;
  99. #elif defined HARDWARE_BT6707
  100. traps[DI0_NORM].varbindId = 10;
  101. #endif
  102. traps[DI0_NORM].trapEnable = true;
  103. traps[DI0_NORM].handle = GetDIN0StatusStr; /* State DIN */
  104. /* 6. DI0Alarm */ // +
  105. traps[DI0_ALARM].trapId = DI0_ALARM;
  106. #ifdef HARDWARE_BT6703
  107. traps[DI0_ALARM].varbindId = 9;
  108. #elif defined HARDWARE_BT6707
  109. traps[DI0_ALARM].varbindId = 10;
  110. #endif
  111. traps[DI0_ALARM].trapEnable = true;
  112. traps[DI0_ALARM].handle = GetDIN0StatusStr; /* State DIN */
  113. /* 7. DO0Toggle */ // +
  114. traps[DO0_TOGGLED].trapId = DO0_TOGGLED;
  115. traps[DO0_TOGGLED].varbindId = 5;
  116. traps[DO0_TOGGLED].trapEnable = true;
  117. traps[DO0_TOGGLED].handle = GetDOUT0StatusStr; /* State DO0 */
  118. /* 8. DO1Toggle */ // +
  119. traps[DO1_TOGGLED].trapId = DO1_TOGGLED;
  120. traps[DO1_TOGGLED].varbindId = 6;
  121. traps[DO1_TOGGLED].trapEnable = true;
  122. traps[DO1_TOGGLED].handle = GetDOUT1StatusStr; /* State DO1 */
  123. #if defined HARDWARE_BT6707
  124. /* 8. DO1Toggle */ // +
  125. traps[DO2_TOGGLED].trapId = DO2_TOGGLED;
  126. traps[DO2_TOGGLED].varbindId = 7;
  127. traps[DO2_TOGGLED].trapEnable = true;
  128. traps[DO2_TOGGLED].handle = GetDOUT2StatusStr; /* State DO2 */
  129. #endif
  130. #endif
  131. /* 9. BatteryTemperatureNorm */ // +
  132. traps[BATTERY_HIGH_TEMPERATURE_NORM].trapId = BATTERY_HIGH_TEMPERATURE_NORM;
  133. #ifdef HARDWARE_BT6703
  134. traps[BATTERY_HIGH_TEMPERATURE_NORM].varbindId = 10;
  135. #elif defined HARDWARE_BT6707
  136. traps[BATTERY_HIGH_TEMPERATURE_NORM].varbindId = 11;
  137. #elif defined HARDWARE_BT6709
  138. traps[BATTERY_HIGH_TEMPERATURE_NORM].varbindId = 9;
  139. #endif
  140. traps[BATTERY_HIGH_TEMPERATURE_NORM].trapEnable = true;
  141. traps[BATTERY_HIGH_TEMPERATURE_NORM].handle = GetInternalTempStr; /* BatteryTemperature */
  142. /* 10. BatteryTemperatureAlarm */ // +
  143. traps[BATTERY_HIGH_TEMPERATURE_ALARM].trapId = BATTERY_HIGH_TEMPERATURE_ALARM;
  144. #ifdef HARDWARE_BT6703
  145. traps[BATTERY_HIGH_TEMPERATURE_ALARM].varbindId = 10;
  146. #elif defined HARDWARE_BT6707
  147. traps[BATTERY_HIGH_TEMPERATURE_ALARM].varbindId = 11;
  148. #elif defined HARDWARE_BT608
  149. traps[BATTERY_HIGH_TEMPERATURE_ALARM].varbindId = 9;
  150. #endif
  151. traps[BATTERY_HIGH_TEMPERATURE_ALARM].trapEnable = true;
  152. traps[BATTERY_HIGH_TEMPERATURE_ALARM].handle = GetInternalTempStr; /* BatteryTemperature */
  153. /* 11. LineAlarm */ // +
  154. traps[LINE_ALARM].trapId = LINE_ALARM;
  155. #ifdef HARDWARE_BT6703
  156. traps[LINE_ALARM].varbindId = 12;
  157. #elif defined HARDWARE_BT6707
  158. traps[LINE_ALARM].varbindId = 13;
  159. #elif defined HARDWARE_BT6709
  160. traps[LINE_ALARM].varbindId = 11;
  161. #endif
  162. traps[LINE_ALARM].trapEnable = true;
  163. traps[LINE_ALARM].handle = GetInputVoltageStr; /* LineAlarm */
  164. /* 12. LineNorm */ // +
  165. traps[LINE_NORM].trapId = LINE_NORM;
  166. #ifdef HARDWARE_BT6703
  167. traps[LINE_NORM].varbindId = 12;
  168. #elif defined HARDWARE_BT6707
  169. traps[LINE_NORM].varbindId = 13;
  170. #elif defined HARDWARE_BT6709
  171. traps[LINE_NORM].varbindId = 11;
  172. #endif
  173. traps[LINE_NORM].trapEnable = true;
  174. traps[LINE_NORM].handle = GetInputVoltageStr; /* LineNorm */
  175. /* 13. LowBatAlarm */ // +
  176. traps[LOW_BAT_ALARM].trapId = LOW_BAT_ALARM;
  177. #ifdef HARDWARE_BT6703
  178. traps[LOW_BAT_ALARM].varbindId = 15;
  179. #elif defined HARDWARE_BT6707
  180. traps[LOW_BAT_ALARM].varbindId = 16;
  181. #elif defined HARDWARE_BT6709
  182. traps[LOW_BAT_ALARM].varbindId = 14;
  183. #endif
  184. traps[LOW_BAT_ALARM].trapEnable = true;
  185. traps[LOW_BAT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  186. /* 14. LowBatNorm */ // +
  187. traps[LOW_BAT_NORM].trapId = LOW_BAT_NORM;
  188. #ifdef HARDWARE_BT6703
  189. traps[LOW_BAT_NORM].varbindId = 15;
  190. #elif defined HARDWARE_BT6707
  191. traps[LOW_BAT_NORM].varbindId = 16;
  192. #elif defined HARDWARE_BT6709
  193. traps[LOW_BAT_NORM].varbindId = 14;
  194. #endif
  195. traps[LOW_BAT_NORM].trapEnable = true;
  196. traps[LOW_BAT_NORM].handle = GetBatCapacityStr; /* LowBatNorm */
  197. /* 15. PowerAlarm */ // +
  198. traps[POWER_ALARM].trapId = POWER_ALARM;
  199. #ifdef HARDWARE_BT6703
  200. traps[POWER_ALARM].varbindId = 14;
  201. #elif defined HARDWARE_BT6707
  202. traps[POWER_ALARM].varbindId = 15;
  203. #elif defined HARDWARE_BT6709
  204. traps[POWER_ALARM].varbindId = 13;
  205. #endif
  206. traps[POWER_ALARM].trapEnable = true;
  207. traps[POWER_ALARM].handle = GetPowerStr; /* PowerAlarm */
  208. /* 16. PowerNorm */ // +
  209. traps[POWER_NORM].trapId = POWER_NORM;
  210. #ifdef HARDWARE_BT6703
  211. traps[POWER_NORM].varbindId = 14;
  212. #elif defined HARDWARE_BT6707
  213. traps[POWER_NORM].varbindId = 15;
  214. #elif defined HARDWARE_BT6709
  215. traps[POWER_NORM].varbindId = 13;
  216. #endif
  217. traps[POWER_NORM].trapEnable = true;
  218. traps[POWER_NORM].handle = GetPowerStr; /* PowerNorm */
  219. /* 17. ConnectMonitorAlarm */ //
  220. traps[CONNECT_MONITOR_ALARM].trapId = CONNECT_MONITOR_ALARM;
  221. #ifdef HARDWARE_BT6703
  222. traps[CONNECT_MONITOR_ALARM].varbindId = 17;
  223. #elif defined HARDWARE_BT6707
  224. traps[CONNECT_MONITOR_ALARM].varbindId = 18;
  225. #elif defined HARDWARE_BT6709
  226. traps[CONNECT_MONITOR_ALARM].varbindId = 16;
  227. #endif
  228. traps[CONNECT_MONITOR_ALARM].trapEnable = true;
  229. traps[CONNECT_MONITOR_ALARM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  230. /* 18. ConnectMonitorNorm */ //
  231. traps[CONNECT_MONITOR_NORM].trapId = CONNECT_MONITOR_NORM;
  232. #ifdef HARDWARE_BT6703
  233. traps[CONNECT_MONITOR_NORM].varbindId = 17;
  234. #elif defined HARDWARE_BT6707
  235. traps[CONNECT_MONITOR_NORM].varbindId = 18;
  236. #elif defined HARDWARE_BT6709
  237. traps[CONNECT_MONITOR_NORM].varbindId = 16;
  238. #endif
  239. traps[CONNECT_MONITOR_NORM].trapEnable = true;
  240. traps[CONNECT_MONITOR_NORM].handle = GetConnectMonitorStr;//GetConnectMonitorStr; /* ConnectMonitor */
  241. /* 19. BatteryConnectAlarm */ // +
  242. traps[BATTERY_CONNECT_ALARM].trapId = BATTERY_CONNECT_ALARM;
  243. #ifdef HARDWARE_BT6703
  244. traps[BATTERY_CONNECT_ALARM].varbindId = 15;
  245. #elif defined HARDWARE_BT6707
  246. traps[BATTERY_CONNECT_ALARM].varbindId = 16;
  247. #elif defined HARDWARE_BT6709
  248. traps[BATTERY_CONNECT_ALARM].varbindId = 14;
  249. #endif
  250. traps[BATTERY_CONNECT_ALARM].trapEnable = true;
  251. traps[BATTERY_CONNECT_ALARM].handle = GetBatCapacityStr; /* LowBatAlarm */
  252. /* 20. BatteryConnectNorm */ // +
  253. traps[BATTERY_CONNECT_NORM].trapId = BATTERY_CONNECT_NORM;
  254. #ifdef HARDWARE_BT6703
  255. traps[BATTERY_CONNECT_NORM].varbindId = 15;
  256. #elif defined HARDWARE_BT6707
  257. traps[BATTERY_CONNECT_NORM].varbindId = 16;
  258. #elif defined HARDWARE_BT6709
  259. traps[BATTERY_CONNECT_NORM].varbindId = 14;
  260. #endif
  261. traps[BATTERY_CONNECT_NORM].trapEnable = true;
  262. traps[BATTERY_CONNECT_NORM].handle = GetBatCapacityStr; /* LowBatNorm */
  263. /* 21. BatteryTemperatureNorm */ // +
  264. traps[BATTERY_LOW_TEMPERATURE_NORM].trapId = BATTERY_LOW_TEMPERATURE_NORM;
  265. #ifdef HARDWARE_BT6703
  266. traps[BATTERY_LOW_TEMPERATURE_NORM].varbindId = 10;
  267. #elif defined HARDWARE_BT6707
  268. traps[BATTERY_HIGH_TEMPERATURE_NORM].varbindId = 11;
  269. #elif defined HARDWARE_BT6709
  270. traps[BATTERY_HIGH_TEMPERATURE_NORM].varbindId = 9;
  271. #endif
  272. traps[BATTERY_LOW_TEMPERATURE_NORM].trapEnable = true;
  273. traps[BATTERY_LOW_TEMPERATURE_NORM].handle = GetInternalTempStr; /* BatteryTemperature */
  274. /* 22. BatteryTemperatureAlarm */ // +
  275. traps[BATTERY_LOW_TEMPERATURE_ALARM].trapId = BATTERY_HIGH_TEMPERATURE_ALARM;
  276. #ifdef HARDWARE_BT6703
  277. traps[BATTERY_LOW_TEMPERATURE_ALARM].varbindId = 10;
  278. #elif defined HARDWARE_BT6707
  279. traps[BATTERY_LOW_TEMPERATURE_ALARM].varbindId = 11;
  280. #elif defined HARDWARE_BT609
  281. traps[BATTERY_LOW_TEMPERATURE_ALARM].varbindId = 9;
  282. #endif
  283. traps[BATTERY_LOW_TEMPERATURE_ALARM].trapEnable = true;
  284. traps[BATTERY_LOW_TEMPERATURE_ALARM].handle = GetInternalTempStr; /* BatteryTemperature */
  285. #ifdef HARDWARE_BT6709
  286. /* 23. AKBChangeAlarm */ // +
  287. traps[BATTERY_CHANGE_ALARM].trapId = BATTERY_CHANGE_ALARM;
  288. traps[BATTERY_CHANGE_ALARM].varbindId = 49;
  289. traps[BATTERY_CHANGE_ALARM].trapEnable = true;
  290. traps[BATTERY_CHANGE_ALARM].handle = GetDataNextChangeAKBStr; /* data next change AKB */
  291. /* 24. AKBChangeNorm */ // +
  292. traps[BATTERY_CHANGE_MORM].trapId = BATTERY_CHANGE_MORM;
  293. traps[BATTERY_CHANGE_MORM].varbindId = 49;
  294. traps[BATTERY_CHANGE_MORM].trapEnable = true;
  295. traps[BATTERY_CHANGE_MORM].handle = GetDataNextChangeAKBStr; /* data next change AKB */
  296. #endif
  297. }
  298. /**
  299. * @brief Отправка обычного трапа с сообщением, зарегистрированного в базе.
  300. * @retval
  301. */
  302. bool SNMP_SendMessageTrap(TRAP_t trap, char* str, uint8_t len)
  303. {
  304. /*
  305. const uint8_t maxMsgLen = 30;
  306. char msg[30];
  307. struct snmp_varbind *vb;
  308. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 3, 2, 1}};
  309. if (len <= maxMsgLen)
  310. {
  311. trapObjId.id[trapObjId.len - 1] = trap.trapId;
  312. strcpy(msg, str);
  313. vb = snmp_varbind_alloc(&trapObjId, SNMP_ASN1_OPAQUE, strlen(msg));
  314. vb->value = msg;
  315. trap_msg.outvb.head = vb;
  316. trap_msg.outvb.tail = vb;
  317. trap_msg.outvb.count = 1;
  318. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0);
  319. trap_msg.outvb.head = NULL;
  320. trap_msg.outvb.tail = NULL;
  321. trap_msg.outvb.count = 0;
  322. snmp_varbind_list_free(&trap_msg.outvb);
  323. snmp_varbind_free(vb);
  324. return true;
  325. }
  326. else
  327. return false;
  328. */
  329. }
  330. struct snmp_varbind vb1, vb2, vb;
  331. char msg[50];
  332. uint32_t snmp_time = 0;
  333. struct snmp_obj_id mib2_base_oid_systime ={ 9, { 1, 3, 6, 1, 2, 1, 1, 3, 0 }};
  334. struct snmp_obj_id trap_oid = {11, {1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0}};
  335. #ifdef HARDWARE_BT6703
  336. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 6, 2, 1}};
  337. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 6, 1, 1}};
  338. #elif defined HARDWARE_BT6707
  339. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 7, 2, 1}};
  340. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 7, 1, 1}};
  341. #elif defined HARDWARE_BT6709
  342. struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 8, 2, 1}};
  343. struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 911, 8, 1, 1}};
  344. #endif
  345. /**
  346. * @brief Отправка трапа с переменной, зарегистрированного в базе.
  347. * @retval
  348. */
  349. bool SNMP_SendVarbindTrap(TRAP_t *trap)
  350. {
  351. uint8_t len = 0;
  352. memset(&vb1, 0, sizeof(struct snmp_varbind));
  353. memset(&vb2, 0, sizeof(struct snmp_varbind));
  354. memset(&vb, 0, sizeof(struct snmp_varbind));
  355. trapObjId.id[trapObjId.len - 1] = trap->trapId;
  356. varObjId.id[varObjId.len - 1] = trap->varbindId;
  357. trap->handle(msg, &len);
  358. vb.oid = mib2_base_oid_systime;
  359. vb.type = SNMP_ASN1_TYPE_TIMETICKS;
  360. MIB2_COPY_SYSUPTIME_TO(&snmp_time);
  361. vb.value = &snmp_time;
  362. vb.value_len = sizeof(uint32_t);
  363. vb.next = &vb1;
  364. vb.prev = NULL;
  365. vb1.oid = trap_oid;
  366. vb1.type = SNMP_ASN1_TYPE_OBJECT_ID;
  367. vb1.value = trapObjId.id;
  368. vb1.value_len = 4*trapObjId.len;
  369. vb1.next = &vb2;
  370. vb1.prev = &vb;
  371. vb2.oid = varObjId;
  372. vb2.type = SNMP_ASN1_TYPE_OCTET_STRING;
  373. vb2.value = msg;
  374. vb2.value_len = len;
  375. vb2.next = NULL;
  376. vb2.prev = &vb1;
  377. snmp_send_trap_pduv2(&vb);
  378. //snmp_send_trap(&trapObjId, SNMP_GENTRAP_ENTERPRISE_SPECIFIC, 0, &vb);
  379. return true;
  380. }
  381. /********************************* (C) ROTEK **********************************/