private_mib.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131
  1. #include "stm32f4xx.h"
  2. #if 0
  3. #include "private_mib.h"
  4. #include "lwip/snmp.h"
  5. #include "lwip/snmp_msg.h"
  6. #include "lwip/snmp_asn1.h"
  7. #include "lwip/snmp_structs.h"
  8. #include "settings_api.h"
  9. #include "parameters.h"
  10. #include "web_params_api.h"
  11. #include "snmp_api.h"
  12. #include "trap_api.h"
  13. #include "common_config.h"
  14. #include "log.h"
  15. #include "megatec.h"
  16. #include "FreeRTOS.h"
  17. #include "task.h"
  18. #ifdef PRINTF_STDLIB
  19. #include <stdio.h>
  20. #endif
  21. #ifdef PRINTF_CUSTOM
  22. #include "tinystdio.h"
  23. #endif
  24. #include <stdlib.h>
  25. /**
  26. * @brief Общая структура настроек
  27. */
  28. extern SETTINGS_t sSettings;
  29. extern float TimeParamFloat;
  30. extern void ocstrncpy(u8_t *dst, u8_t *src, u16_t n);
  31. char paramStr[255];
  32. uint8_t paramLength = 0;
  33. uint32_t paramInt = 0;
  34. static void system_get_object_def_ee( u8_t ident_len, s32_t *ident, struct obj_def *od );
  35. static void system_get_value_ee(struct obj_def *od, u16_t len, void *value);
  36. static u8_t system_set_test_ee(struct obj_def *od, u16_t len, void *value);
  37. static void system_set_value_ee(struct obj_def *od, u16_t len, void *value);
  38. /* Функции для узла Signals */
  39. static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od);
  40. static void signals_get_value (struct obj_def *od, u16_t len, void *value);
  41. static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value);
  42. static void signals_set_value (struct obj_def *od, u16_t len, void *value);
  43. /*------------------------------------------------------------------------------
  44. Описание узлов
  45. ------------------------------------------------------------------------------*/
  46. /* узел SYSTEM (операции с EEPROM) */
  47. /* 0 1 2 3 4 5 6 */
  48. /* system .1.3.6.1.2.1.1 */
  49. const mib_scalar_node system_scalar_ee = {
  50. &system_get_object_def_ee,
  51. &system_get_value_ee,
  52. &system_set_test_ee,
  53. &system_set_value_ee,
  54. MIB_NODE_SC,
  55. 0
  56. };
  57. // переменные узла SIGNALS ------------------------------------------
  58. const mib_scalar_node signals_var =
  59. {
  60. &signals_get_object_def,
  61. &signals_get_value,
  62. &signals_set_test,
  63. &signals_set_value,
  64. MIB_NODE_SC,
  65. 0
  66. };
  67. // узел SIGNALS -----------------------------------------------------
  68. const s32_t signals_ids[18] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 };
  69. struct mib_node* const signals_nodes[18] =
  70. {
  71. (struct mib_node* const)&signals_var,
  72. (struct mib_node* const)&signals_var,
  73. (struct mib_node* const)&signals_var,
  74. (struct mib_node* const)&signals_var,
  75. (struct mib_node* const)&signals_var,
  76. (struct mib_node* const)&signals_var,
  77. (struct mib_node* const)&signals_var,
  78. (struct mib_node* const)&signals_var,
  79. (struct mib_node* const)&signals_var,
  80. (struct mib_node* const)&signals_var,
  81. (struct mib_node* const)&signals_var,
  82. (struct mib_node* const)&signals_var,
  83. (struct mib_node* const)&signals_var,
  84. (struct mib_node* const)&signals_var,
  85. (struct mib_node* const)&signals_var,
  86. (struct mib_node* const)&signals_var,
  87. (struct mib_node* const)&signals_var,
  88. (struct mib_node* const)&signals_var,
  89. };
  90. const struct mib_array_node signals =
  91. {
  92. &noleafs_get_object_def,
  93. &noleafs_get_value,
  94. &noleafs_set_test,
  95. &noleafs_set_value,
  96. MIB_NODE_AR,
  97. 18,
  98. signals_ids,
  99. signals_nodes
  100. };
  101. // узел BT-6701 ------------------------------------------------------------
  102. const s32_t bt6701_ids[1] = { 1 };
  103. struct mib_node* const bt6701_nodes[1] =
  104. {
  105. (struct mib_node* const)&signals,
  106. };
  107. const struct mib_array_node bt6701 =
  108. {
  109. &noleafs_get_object_def,
  110. &noleafs_get_value,
  111. &noleafs_set_test,
  112. &noleafs_set_value,
  113. MIB_NODE_AR,
  114. 1,
  115. bt6701_ids,
  116. bt6701_nodes
  117. };
  118. // узел swt ------------------------------------------------------------
  119. const s32_t swt_ids[1] = {
  120. 3
  121. };
  122. struct mib_node* const swt_nodes[1] =
  123. {
  124. (struct mib_node* const)&bt6701,
  125. };
  126. const struct mib_array_node swt =
  127. {
  128. &noleafs_get_object_def,
  129. &noleafs_get_value,
  130. &noleafs_set_test,
  131. &noleafs_set_value,
  132. MIB_NODE_AR,
  133. 1,
  134. swt_ids,
  135. swt_nodes
  136. };
  137. // узел ROTEK ------------------------------------------------------------
  138. const s32_t rotek_ids[1] = { 911 };
  139. struct mib_node* const rotek_nodes[1] =
  140. {
  141. (struct mib_node* const)&swt,
  142. };
  143. const struct mib_array_node rotek =
  144. {
  145. &noleafs_get_object_def,
  146. &noleafs_get_value,
  147. &noleafs_set_test,
  148. &noleafs_set_value,
  149. MIB_NODE_AR,
  150. 1,
  151. rotek_ids,
  152. rotek_nodes
  153. };
  154. // узел ENTERPRISES -------------------------------------------------------
  155. const s32_t enterprises_ids[1] = { 41752 };
  156. struct mib_node* const enterprises_nodes[1] =
  157. {
  158. (struct mib_node* const)&rotek
  159. };
  160. const struct mib_array_node enterprises =
  161. {
  162. &noleafs_get_object_def,
  163. &noleafs_get_value,
  164. &noleafs_set_test,
  165. &noleafs_set_value,
  166. MIB_NODE_AR,
  167. 1,
  168. enterprises_ids,
  169. enterprises_nodes
  170. };
  171. // узел PRIVATE -----------------------------------------------------------
  172. const s32_t mib_private_ids[1] = { 1 };
  173. struct mib_node* const mib_pivate_nodes[1] =
  174. {
  175. (struct mib_node* const)&enterprises
  176. };
  177. const struct mib_array_node mib_private =
  178. {
  179. &noleafs_get_object_def,
  180. &noleafs_get_value,
  181. &noleafs_set_test,
  182. &noleafs_set_value,
  183. MIB_NODE_AR,
  184. 1,
  185. mib_private_ids,
  186. mib_pivate_nodes
  187. };
  188. /*------------------------------------------------------------------------------
  189. Функции
  190. ------------------------------------------------------------------------------*/
  191. // Функции для узла SIGNALS
  192. /**-----------------------------------------------------------------------------
  193. \fn static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od)
  194. \brief функция получения свойств переменных узла Identification
  195. \param ident_len - the address length. длина адреса
  196. \param ident - points to objectname.0 (object id trailer)
  197. \param od - points to object definition. указатель на описание переменной
  198. \return нет
  199. ------------------------------------------------------------------------------*/
  200. static void signals_get_object_def (u8_t ident_len, s32_t *ident, struct obj_def *od)
  201. {
  202. u8_t id;
  203. /* return to object name, adding index depth (1) */
  204. ident_len += 1;
  205. ident -= 1;
  206. if (ident_len == 2)
  207. {
  208. od->id_inst_len = ident_len;
  209. od->id_inst_ptr = ident;
  210. id = ident[0];
  211. switch (id)
  212. {
  213. case 1: /* FWVersion */
  214. GetVersionStr(paramStr, &paramLength);
  215. od->instance = MIB_OBJECT_SCALAR;
  216. od->access = MIB_OBJECT_READ_ONLY;
  217. od->asn_type = SNMP_ASN1_OC_STR;
  218. od->v_len = paramLength;
  219. break;
  220. case 2: /* RestoreSignal */
  221. od->instance = MIB_OBJECT_SCALAR;
  222. od->access = MIB_OBJECT_WRITE_ONLY;
  223. od->asn_type = SNMP_ASN1_INTEG;
  224. od->v_len = sizeof(s32_t);
  225. break;
  226. case 3: /* RebootSignal */
  227. od->instance = MIB_OBJECT_SCALAR;
  228. od->access = MIB_OBJECT_WRITE_ONLY;
  229. od->asn_type = SNMP_ASN1_INTEG;
  230. od->v_len = sizeof(s32_t);
  231. break;
  232. case 4: /* UPSModel*/
  233. GetUPSModelStr(paramStr, &paramLength);
  234. od->instance = MIB_OBJECT_SCALAR;
  235. od->access = MIB_OBJECT_READ_ONLY;
  236. od->asn_type = SNMP_ASN1_OC_STR;
  237. od->v_len = paramLength;
  238. break;
  239. case 5: /* DO1*/
  240. GetDOUTStatusStr(paramStr, &paramLength, 0);
  241. od->instance = MIB_OBJECT_SCALAR;
  242. od->access = MIB_OBJECT_READ_WRITE;
  243. od->asn_type = SNMP_ASN1_OC_STR;
  244. od->v_len = paramLength;
  245. break;
  246. case 6: /* DO2*/
  247. GetDOUTStatusStr(paramStr, &paramLength, 1);
  248. od->instance = MIB_OBJECT_SCALAR;
  249. od->access = MIB_OBJECT_READ_WRITE;
  250. od->asn_type = SNMP_ASN1_OC_STR;
  251. od->v_len = paramLength;
  252. break;
  253. case 7: /* BatTest*/
  254. od->instance = MIB_OBJECT_SCALAR;
  255. od->access = MIB_OBJECT_WRITE_ONLY;
  256. od->asn_type = SNMP_ASN1_INTEG;
  257. od->v_len = sizeof(s32_t);
  258. break;
  259. case 8: /* Shutdown UPS*/
  260. od->instance = MIB_OBJECT_SCALAR;
  261. od->access = MIB_OBJECT_WRITE_ONLY;
  262. od->asn_type = SNMP_ASN1_OC_STR;
  263. od->v_len = paramLength;
  264. break;
  265. case 9: /* DIO*/
  266. GetDINStatusStr(paramStr, &paramLength, 0);
  267. od->instance = MIB_OBJECT_SCALAR;
  268. od->access = MIB_OBJECT_READ_ONLY;
  269. od->asn_type = SNMP_ASN1_OC_STR;
  270. od->v_len = paramLength;
  271. break;
  272. case 10: /* IntTemp */
  273. GetInternalTempStr(paramStr, &paramLength);
  274. od->instance = MIB_OBJECT_SCALAR;
  275. od->access = MIB_OBJECT_READ_ONLY;
  276. od->asn_type = SNMP_ASN1_OC_STR;
  277. od->v_len = paramLength;
  278. break;
  279. case 11: /* InFreq */
  280. GetInputFreqStr(paramStr, &paramLength);
  281. od->instance = MIB_OBJECT_SCALAR;
  282. od->access = MIB_OBJECT_READ_ONLY;
  283. od->asn_type = SNMP_ASN1_OC_STR;
  284. od->v_len = paramLength;
  285. break;
  286. case 12: /* InVoltVAC */
  287. GetInputVoltageStr(paramStr, &paramLength);
  288. od->instance = MIB_OBJECT_SCALAR;
  289. od->access = MIB_OBJECT_READ_ONLY;
  290. od->asn_type = SNMP_ASN1_OC_STR;
  291. od->v_len = paramLength;
  292. break;
  293. case 13: /* OutVoltVAC */
  294. GetOutputVoltageStr(paramStr, &paramLength);
  295. od->instance = MIB_OBJECT_SCALAR;
  296. od->access = MIB_OBJECT_READ_ONLY;
  297. od->asn_type = SNMP_ASN1_OC_STR;
  298. od->v_len = paramLength;
  299. break;
  300. case 14: /* Power */
  301. GetPowerStr(paramStr, &paramLength);
  302. od->instance = MIB_OBJECT_SCALAR;
  303. od->access = MIB_OBJECT_READ_ONLY;
  304. od->asn_type = SNMP_ASN1_OC_STR;
  305. od->v_len = paramLength;
  306. break;
  307. case 15: /* BatCap */
  308. GetBatCapacityStr(paramStr, &paramLength);
  309. od->instance = MIB_OBJECT_SCALAR;
  310. od->access = MIB_OBJECT_READ_ONLY;
  311. od->asn_type = SNMP_ASN1_OC_STR;
  312. od->v_len = paramLength;
  313. break;
  314. case 16: /* BatTime */
  315. GetRuntimeStr(paramStr, &paramLength);
  316. od->instance = MIB_OBJECT_SCALAR;
  317. od->access = MIB_OBJECT_READ_ONLY;
  318. od->asn_type = SNMP_ASN1_OC_STR;
  319. od->v_len = paramLength;
  320. break;
  321. case 17: /* ConnectMonitor */
  322. GetConnectMonitorStr(paramStr, &paramLength);
  323. od->instance = MIB_OBJECT_SCALAR;
  324. od->access = MIB_OBJECT_READ_ONLY;
  325. od->asn_type = SNMP_ASN1_OC_STR;
  326. od->v_len = paramLength;
  327. break;
  328. case 18: /* Alarms */
  329. GetAlarmStr(paramStr, &paramLength);
  330. od->instance = MIB_OBJECT_SCALAR;
  331. od->access = MIB_OBJECT_READ_ONLY;
  332. od->asn_type = SNMP_ASN1_OC_STR;
  333. od->v_len = paramLength;
  334. break;
  335. default:
  336. //LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no such object\n"));
  337. od->instance = MIB_OBJECT_NONE;
  338. break;
  339. };
  340. }
  341. else
  342. {
  343. LWIP_DEBUGF(SNMP_MIB_DEBUG,("planar_get_object_def: no scalar\n"));
  344. od->instance = MIB_OBJECT_NONE;
  345. }
  346. }
  347. /**-----------------------------------------------------------------------------
  348. \fn static void Identification_get_value(struct obj_def *od, u16_t len, void *value)
  349. \brief функция получения значения переменных узла Identification
  350. \param obj_def - указатель на описание переменной
  351. \param len - длина переменной в байтах
  352. \param value - указатель на значение переменной
  353. \return нет
  354. ------------------------------------------------------------------------------*/
  355. static void signals_get_value (struct obj_def *od, u16_t len, void *value)
  356. {
  357. u8_t id;
  358. id = od->id_inst_ptr[0];
  359. switch (id)
  360. {
  361. case 1: /* FWVersion */
  362. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  363. break;
  364. case 2: /* RestoreSignal */
  365. *((s32_t*)value) = 0;
  366. break;
  367. case 3: /* RebootSignal */
  368. *((s32_t*)value) = 0;
  369. break;
  370. case 4: /* UPSModel */
  371. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  372. break;
  373. case 5: /* DO1 */
  374. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  375. break;
  376. case 6: /* DO2 */
  377. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  378. break;
  379. case 7: /* BatTest */
  380. *((s32_t*)value) = 0;
  381. break;
  382. case 8: /* Shutdown UPS */
  383. *((s32_t*)value) = 0;
  384. break;
  385. case 9: /* DIO */
  386. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  387. break;
  388. case 10: /* IntTemp */
  389. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  390. break;
  391. case 11: /* InFreq */
  392. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  393. break;
  394. case 12: /* InVoltVAC */
  395. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  396. break;
  397. case 13: /* OutVoltVAC */
  398. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  399. break;
  400. case 14: /* Power */
  401. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  402. break;
  403. case 15: /* BatCap */
  404. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  405. break;
  406. case 16: /* BatTime */
  407. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  408. break;
  409. case 17: /* ConnectMonitor */
  410. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  411. break;
  412. case 18: /* Alarms */
  413. ocstrncpy((u8_t*)value, (u8_t*)paramStr, len);
  414. break;
  415. default :
  416. break;
  417. };
  418. }
  419. /**-----------------------------------------------------------------------------
  420. \fn static void Identification_set_value (struct obj_def *od, u16_t len, void *value)
  421. \brief функция записи значений переменных узла Identification
  422. \param obj_def - указатель на описание переменной
  423. \param len - длина переменной в байтах
  424. \param value - указатель на значение переменной
  425. \return нет
  426. ------------------------------------------------------------------------------*/
  427. static void signals_set_value (struct obj_def *od, u16_t len, void *value)
  428. {
  429. u8_t id;
  430. uint32_t val;
  431. char *val_string;
  432. char str[20];
  433. int8_t res = 0;
  434. memset(str, 0, 20);
  435. id = od->id_inst_ptr[0];
  436. switch (id)
  437. {
  438. case 2: /* RestoreSignal */
  439. val = *((s32_t*)value);
  440. if (val == 1) {
  441. SNMP_SendUserTrap(DEVICE_RESTORED);
  442. log_event_data(LOG_SYSTEM_DEFCONFIG, "Администратор");
  443. vTaskDelay(500);
  444. SETTINGS_SetPartDefault();
  445. SETTINGS_Save();
  446. }
  447. break;
  448. case 3: /* RebootSignal */
  449. val = *((s32_t*)value);
  450. if (val == 1){
  451. #ifndef BT6702_SERVICE
  452. SNMP_SendUserTrap(DEVICE_REBOOTED);
  453. log_event_data(LOG_SYSTEM_BOOT, "Администратор");
  454. vTaskDelay(1010);
  455. LOG_Disable();
  456. #endif
  457. NVIC_SystemReset();
  458. }
  459. break;
  460. case 5: /* DO1 */
  461. if(sSettings.sInOuts.ro_type_source[0] == SNMP_SET){
  462. val_string = (char*)value;
  463. SetROStr(val_string, 0);
  464. if(val_string[0] == 0x31)
  465. strcat(str, "Замкнуто");
  466. else
  467. strcat(str, "Разомкнуто");
  468. SNMP_SendUserTrap(DO0_TOGGLED);
  469. log_event_data(LOG_DO0_STATE, str);
  470. }
  471. break;
  472. case 6: /* DO2 */
  473. if(sSettings.sInOuts.ro_type_source[1] == SNMP_SET){
  474. val_string = (char*)value;
  475. SetROStr(val_string, 1);
  476. if(val_string[0] == 0x31)
  477. strcat(str, "Замкнуто");
  478. else
  479. strcat(str, "Разомкнуто");
  480. SNMP_SendUserTrap(DO1_TOGGLED);
  481. log_event_data(LOG_DO1_STATE, str);
  482. }
  483. break;
  484. case 7: /* BatTest */
  485. val =*((s32_t*)value);
  486. if(val == 0){
  487. res = ups_metac_service_pdu(ups_cancel_test);
  488. if(res == 1){
  489. log_event_data(LOG_TEST_UPS, "Администратор (Останов)");
  490. }
  491. }
  492. else if(val > 0 && val < 100){
  493. TimeParam = val;
  494. res = ups_metac_service_pdu(ups_test_time);
  495. if(res == 1){
  496. log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
  497. }
  498. }
  499. else if(val == 100){
  500. res = ups_metac_service_pdu(ups_test_10sec);
  501. if(res == 1){
  502. log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
  503. }
  504. }
  505. else if(val == 999){
  506. res = ups_metac_service_pdu(ups_test_low_bat);
  507. if(res == 1){
  508. log_event_data(LOG_TEST_UPS, "Администратор (Запущен)");
  509. }
  510. }
  511. break;
  512. case 8: /* Shutdown UPS */
  513. val_string = (char*)value;
  514. float shtdn_val = atof(val_string);
  515. if(shtdn_val == 0){
  516. res = ups_metac_service_pdu(ups_cancel_shut_down);
  517. if(res == 1){
  518. log_event_data(LOG_SHUTDOWN_UPS, "Администратор (Останов)");
  519. }
  520. }
  521. else{
  522. TimeParamFloat = shtdn_val;
  523. res = ups_metac_service_pdu(ups_shutdown);
  524. if(res == 1)
  525. log_event_data(LOG_SHUTDOWN_UPS, "Администратор");
  526. }
  527. break;
  528. default :
  529. break;
  530. };
  531. }
  532. /**-----------------------------------------------------------------------------
  533. \fn static u8_t Identification_set_test (struct obj_def *od, u16_t len, void *value)
  534. \brief функция проверки записываемых значений переменных узла Identification
  535. \param obj_def - указатель на описание переменной
  536. \param len - длина переменной в байтах
  537. \param value - указатель на значение переменной
  538. \return 0 - некорректное значение
  539. 1 - корректное значение
  540. ------------------------------------------------------------------------------*/
  541. static u8_t signals_set_test (struct obj_def *od, u16_t len, void *value)
  542. {
  543. u8_t id, set_ok;
  544. char *val_string;
  545. int32_t val;
  546. LWIP_UNUSED_ARG(value);
  547. set_ok = 0;
  548. id = od->id_inst_ptr[0];
  549. switch (id)
  550. {
  551. case 2:
  552. if ( len == sizeof(s32_t) )
  553. {
  554. set_ok = 1;
  555. }
  556. break;
  557. case 3:
  558. if ( len == sizeof(s32_t) )
  559. {
  560. set_ok = 1;
  561. }
  562. break;
  563. case 5: /* DO1 */
  564. if ( len <= 1 )
  565. {
  566. val_string = (char*)value;
  567. val_string[len] = 0;
  568. if(atoi(val_string) <= 1){
  569. if(sSettings.sInOuts.ro_type_source[0] == SNMP_SET)
  570. set_ok = 1;
  571. }
  572. }
  573. break;
  574. case 6: /* DO2 */
  575. if ( len <= 1 )
  576. {
  577. val_string = (char*)value;
  578. val_string[len] = 0;
  579. if(atoi(val_string) <= 1){
  580. if(sSettings.sInOuts.ro_type_source[1] == SNMP_SET)
  581. set_ok = 1;
  582. }
  583. }
  584. break;
  585. case 7: /* BatTest */
  586. val = *((s32_t*)value);
  587. if((val >= 0 && val <= 100) || val == 999){
  588. set_ok = 1;
  589. }
  590. break;
  591. case 8: /* Shutdown UPS */
  592. if ( len <= 3 )
  593. {
  594. val_string = (char*)value;
  595. val_string[len] = 0;
  596. if(atof(val_string) <= 10){
  597. set_ok = 1;
  598. }
  599. }
  600. break;
  601. };
  602. return set_ok;
  603. }
  604. /**
  605. * Returns systems object definitions (eeprom).
  606. *
  607. * @param ident_len the address length (2)
  608. * @param ident points to objectname.0 (object id trailer)
  609. * @param od points to object definition.
  610. */
  611. static void
  612. system_get_object_def_ee(u8_t ident_len, s32_t *ident, struct obj_def *od)
  613. {
  614. u8_t id;
  615. /* return to object name, adding index depth (1) */
  616. ident_len += 1;
  617. ident -= 1;
  618. if (ident_len == 2)
  619. {
  620. od->id_inst_len = ident_len;
  621. od->id_inst_ptr = ident;
  622. id = ident[0];
  623. //LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def_ee system.%"U16_F".0\n",(u16_t)id));
  624. switch (id)
  625. {
  626. case 4: /* sysContact */
  627. od->instance = MIB_OBJECT_SCALAR;
  628. od->access = MIB_OBJECT_READ_WRITE;
  629. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  630. od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSCONTACT_TYPE)*/;
  631. break;
  632. case 5: /* sysName */
  633. od->instance = MIB_OBJECT_SCALAR;
  634. od->access = MIB_OBJECT_READ_WRITE;
  635. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  636. od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSNAME_TYPE)*/;
  637. break;
  638. case 6: /* sysLocation */
  639. od->instance = MIB_OBJECT_SCALAR;
  640. od->access = MIB_OBJECT_READ_WRITE;
  641. od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
  642. od->v_len = 1 /*GetSnmpStringLen(SNMP_SYSLOCATION_TYPE)*/;
  643. break;
  644. default:
  645. //LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def_ee: no such object\n"));
  646. od->instance = MIB_OBJECT_NONE;
  647. break;
  648. };
  649. }
  650. else
  651. {
  652. LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def_ee: no scalar\n"));
  653. od->instance = MIB_OBJECT_NONE;
  654. }
  655. }
  656. // ----------------------------------------------------------------------------
  657. /**
  658. * Returns system object value.
  659. *
  660. * @param ident_len the address length (2)
  661. * @param ident points to objectname.0 (object id trailer)
  662. * @param len return value space (in bytes)
  663. * @param value points to (varbind) space to copy value into.
  664. */
  665. static void
  666. system_get_value_ee(struct obj_def *od, u16_t len, void *value)
  667. {
  668. u8_t id;
  669. id = od->id_inst_ptr[0];
  670. switch (id)
  671. {
  672. case 4: /* sysContact */
  673. //GetSnmpString(SNMP_SYSCONTACT_TYPE, value, len );
  674. break;
  675. case 5: /* sysName */
  676. //GetSnmpString(SNMP_SYSNAME_TYPE, value, len );
  677. break;
  678. case 6: /* sysLocation */
  679. //GetSnmpString(SNMP_SYSLOCATION_TYPE, value, len );
  680. break;
  681. };
  682. }
  683. // ----------------------------------------------------------------------------
  684. static u8_t
  685. system_set_test_ee(struct obj_def *od, u16_t len, void *value)
  686. {
  687. u8_t id, set_ok;
  688. LWIP_UNUSED_ARG(value);
  689. set_ok = 0;
  690. id = od->id_inst_ptr[0];
  691. switch (id)
  692. {
  693. case 4: /* sysContact */
  694. if ( len <= 255 )
  695. {
  696. set_ok = 1;
  697. }
  698. break;
  699. case 5: /* sysName */
  700. if ( len <= 255 )
  701. {
  702. set_ok = 1;
  703. }
  704. break;
  705. case 6: /* sysLocation */
  706. if ( len <= 255 )
  707. {
  708. set_ok = 1;
  709. }
  710. break;
  711. };
  712. return set_ok;
  713. }
  714. // ----------------------------------------------------------------------------
  715. static void
  716. system_set_value_ee(struct obj_def *od, u16_t len, void *value)
  717. {
  718. u8_t id;
  719. id = od->id_inst_ptr[0];
  720. switch (id)
  721. {
  722. case 4: /* sysContact */
  723. //SetSnmpString(SNMP_SYSCONTACT_TYPE, value, len );
  724. //*syscontact_len_ptr = len;
  725. break;
  726. case 5: /* sysName */
  727. //SetSnmpString(SNMP_SYSNAME_TYPE, value, len );
  728. //*sysname_len_ptr = len;
  729. break;
  730. case 6: /* sysLocation */
  731. //SetSnmpString(SNMP_SYSLOCATION_TYPE, value, len );
  732. //*syslocation_len_ptr = len;
  733. break;
  734. };
  735. }
  736. // ----------------------------------------------------------------------------
  737. /**-----------------------------------------------------------------------------
  738. \fn err_t snmp_send_trap_ex (s8_t generic_trap,
  739. struct snmp_obj_id *eoid,
  740. s32_t specific_trap,
  741. struct snmp_obj_id* varbinds,
  742. u8_t varbinds_num)
  743. \brief функция посылки трапа с возможностью пристыковывать переменные
  744. \param generic_trap - код трапа
  745. \param eoid - указатель на enterprise object identifier
  746. \param specific_trap - used for enterprise traps when generic_trap == 6
  747. \param varbinds - указатель на переменные
  748. \param varbinds_num - число переменных
  749. \return код ошибки
  750. ------------------------------------------------------------------------------*/
  751. err_t snmp_send_trap_ex (s8_t generic_trap,
  752. struct snmp_obj_id *eoid,
  753. s32_t specific_trap,
  754. struct snmp_obj_id* varbinds,
  755. u8_t varbinds_num)
  756. {
  757. uint8_t bSnmpActive = 1;
  758. struct snmp_varbind** vb_list;
  759. struct mib_node* node;
  760. struct obj_def obj;
  761. err_t tResult;
  762. s32_t* VarNum;
  763. struct snmp_name_ptr np;
  764. /* SNMP не готово - ничего не отправляем */
  765. if( !bSnmpActive )
  766. {
  767. return ERR_MEM;
  768. }
  769. /* создаем таблицу указателей переменных */
  770. pvPortMalloc( varbinds_num * sizeof(struct snmp_varbind*) );
  771. /*
  772. if(vb_list == NULL)
  773. {
  774. return ERR_MEM;
  775. }
  776. */
  777. /* создаем сами переменные */
  778. for(u8_t i = 0; i < varbinds_num; i++)
  779. {
  780. /* ищем узел в дереве*/
  781. node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len - 3,
  782. &varbinds[i].id[4], &np );
  783. //node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len,
  784. // &varbinds[i].id[0], &np );
  785. if(node != NULL)
  786. {
  787. /* получаем информацию о переменной узла */
  788. VarNum = &varbinds[i].id[ varbinds[i].len - 1 ];
  789. if( node->node_type == MIB_NODE_EX)
  790. {
  791. struct mib_external_node* node_ex;
  792. node_ex = (struct mib_external_node*)node;
  793. /* TODO: подставить правильный rid вместо 0 */
  794. node_ex->get_object_def_a(0, 1, VarNum, &obj);
  795. }
  796. else
  797. {
  798. node->get_object_def(1, VarNum, &obj);
  799. }
  800. /* создаем переменную */
  801. vb_list[i] = snmp_varbind_alloc(&varbinds[i], obj.asn_type, obj.v_len);
  802. if( vb_list[i] != NULL )
  803. {
  804. {
  805. /* получаем значение переменной */
  806. if( node->node_type == MIB_NODE_EX)
  807. {
  808. struct mib_external_node* node_ex;
  809. node_ex = (struct mib_external_node*)node;
  810. /* TODO: подставить правильный rid вместо 0 */
  811. node_ex->get_value_a(0, &obj, obj.v_len, vb_list[i]->value);
  812. }
  813. else
  814. {
  815. node->get_value(&obj, obj.v_len, vb_list[i]->value);
  816. }
  817. /* добавляем переменную в ловушку */
  818. snmp_varbind_tail_add(&trap_msg.outvb, vb_list[i]);
  819. }
  820. }
  821. }
  822. }
  823. /* посылаем ловушку */
  824. tResult = snmp_send_trap(generic_trap, eoid, specific_trap);
  825. /* удаляем переменные из списка */
  826. snmp_varbind_list_free(&trap_msg.outvb);
  827. /* удаляем указатели переменных */
  828. vPortFree(vb_list);
  829. return tResult;
  830. }
  831. void SNMP_SendTestTrap(void)
  832. {
  833. /*
  834. struct snmp_varbind *vb;
  835. struct snmp_obj_id objid = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 2, 1}};
  836. unsigned char msg[] = "Sex, drugs and LwIP";
  837. unsigned char msglen = 19;
  838. vb = snmp_varbind_alloc(&objid, SNMP_ASN1_OPAQUE, msglen);
  839. vb->value = &msg;
  840. trap_msg.outvb.head = vb;
  841. trap_msg.outvb.tail = vb;
  842. trap_msg.outvb.count = 1;
  843. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &objid, 0);
  844. trap_msg.outvb.head = NULL;
  845. trap_msg.outvb.tail = NULL;
  846. trap_msg.outvb.count = 0;
  847. //vb->value = NULL;
  848. snmp_varbind_free(vb);
  849. */
  850. static struct snmp_obj_id trapObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 2, 1}};
  851. static struct snmp_obj_id varObjId = {11, {1, 3, 6, 1, 4, 1, 41752, 5, 16, 1, 1}};
  852. struct snmp_varbind* vb;
  853. u32_t *u32ptr;
  854. vb = snmp_varbind_alloc(&varObjId, MIB_NODE_SC, 4);
  855. vb->value_len = 4;
  856. vb->value_type = 0x02;
  857. u32ptr = vb->value;
  858. *u32ptr = 23;
  859. if( vb != NULL )
  860. snmp_varbind_tail_add(&trap_msg.outvb, vb);
  861. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0);
  862. /* удаляем переменные из списка */
  863. snmp_varbind_list_free(&trap_msg.outvb);
  864. //snmp_send_trap_ex(SNMP_GENTRAP_ENTERPRISESPC, &trapObjId, 0, &varObjId, 1);
  865. #if 0
  866. struct snmp_varbind** vb_list;
  867. struct mib_node* node;
  868. struct obj_def obj;
  869. err_t tResult;
  870. s32_t* VarNum;
  871. struct snmp_name_ptr np;
  872. /* создаем указатель на переменную */
  873. pvPortMalloc(sizeof(struct snmp_varbind*) );
  874. /* создаем сами переменные */
  875. for(u8_t i = 0; i < varbinds_num; i++)
  876. {
  877. /* ищем узел в дереве*/
  878. node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len - 4,
  879. &varbinds[i].id[4], &np );
  880. //node = snmp_search_tree( (struct mib_node*)&internet, varbinds[i].len,
  881. // &varbinds[i].id[0], &np );
  882. if(node != NULL)
  883. {
  884. /* получаем информацию о переменной узла */
  885. VarNum = &varbinds[i].id[ varbinds[i].len - 1 ];
  886. if( node->node_type == MIB_NODE_EX)
  887. {
  888. struct mib_external_node* node_ex;
  889. node_ex = (struct mib_external_node*)node;
  890. /* TODO: подставить правильный rid вместо 0 */
  891. node_ex->get_object_def_a(0, 1, VarNum, &obj);
  892. }
  893. else
  894. {
  895. node->get_object_def(1, VarNum, &obj);
  896. }
  897. /* создаем переменную */
  898. vb_list[i] = snmp_varbind_alloc(&varbinds[i], obj.asn_type, obj.v_len);
  899. if( vb_list[i] != NULL )
  900. {
  901. {
  902. /* получаем значение переменной */
  903. if( node->node_type == MIB_NODE_EX)
  904. {
  905. struct mib_external_node* node_ex;
  906. node_ex = (struct mib_external_node*)node;
  907. /* TODO: подставить правильный rid вместо 0 */
  908. node_ex->get_value_a(0, &obj, obj.v_len, vb_list[i]->value);
  909. }
  910. else
  911. {
  912. node->get_value(&obj, obj.v_len, vb_list[i]->value);
  913. }
  914. /* добавляем переменную в ловушку */
  915. snmp_varbind_tail_add(&trap_msg.outvb, vb_list[i]);
  916. }
  917. }
  918. }
  919. }
  920. /* посылаем ловушку */
  921. tResult = snmp_send_trap(generic_trap, eoid, specific_trap);
  922. /* удаляем переменные из списка */
  923. snmp_varbind_list_free(&trap_msg.outvb);
  924. /* удаляем указатели переменных */
  925. vPortFree(vb_list);
  926. return tResult;
  927. #endif
  928. }
  929. #define NUM_PRIVATE_TRAP 10
  930. //static unsigned char SNMP_TRAP_0_FLAG = 1;
  931. //static struct ip_addr SNMP_TRAP_0_ADDR;
  932. extern struct snmp_msg_trap trap_msg;
  933. struct private_trap
  934. {
  935. /* source enterprise ID (sysObjectID) */
  936. struct snmp_obj_id *enterprise;
  937. /* trap ID */
  938. struct snmp_obj_id *trap_oid;
  939. /* specific trap code */
  940. u32_t spc_trap;
  941. /* object value ASN1 type */
  942. u8_t value_type;
  943. /* object value length (in u8_t) */
  944. u8_t value_len;
  945. /* object value */
  946. void *value;
  947. /* indicate that the trap is sent */
  948. u8_t in_use;
  949. };
  950. struct private_trap trap_bank[NUM_PRIVATE_TRAP];
  951. struct private_trap * getNextFreePrivateTrap()
  952. {
  953. u8_t index;
  954. void * result = NULL;
  955. for(index = 0; index < NUM_PRIVATE_TRAP; index++)
  956. {
  957. if(!trap_bank[index].in_use)
  958. {
  959. trap_bank[index].in_use = 1;
  960. result = &trap_bank[index];
  961. break;
  962. }
  963. }
  964. return result;
  965. }
  966. void freePrivateTrap(struct private_trap * trap)
  967. {
  968. trap->enterprise = NULL;
  969. trap->trap_oid = NULL;
  970. trap->value = NULL;
  971. trap->in_use = 0;
  972. }
  973. void vSendTrapCallback( void * parameters )
  974. {
  975. struct private_trap * trapToSend;
  976. struct snmp_varbind * vb;
  977. if( parameters != NULL )
  978. {
  979. trapToSend = (struct private_trap *) parameters;
  980. vb = snmp_varbind_alloc(trapToSend->enterprise,
  981. trapToSend->value_type,
  982. trapToSend->value_len);
  983. vb->value = trapToSend->value;
  984. trap_msg.outvb.head = vb;
  985. trap_msg.outvb.tail = vb;
  986. trap_msg.outvb.count = 1;
  987. snmp_send_trap(SNMP_GENTRAP_ENTERPRISESPC, trapToSend->trap_oid, trapToSend->spc_trap);
  988. trap_msg.outvb.head = NULL;
  989. trap_msg.outvb.tail = NULL;
  990. trap_msg.outvb.count = 0;
  991. vb->value = NULL;
  992. snmp_varbind_free(vb);
  993. freePrivateTrap(trapToSend);
  994. }
  995. }
  996. #endif