private_mib.c 35 KB

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