private_mib.c 44 KB

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