private_mib_bt6703.c 44 KB

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