private_mib.c 45 KB

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