snmp.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  1. #include "snmp.h"
  2. #include "lwip/apps/snmp.h"
  3. #include "lwip/apps/snmp_mib2.h"
  4. #include "lwip/apps/snmp_opts.h"
  5. #include "lwip/apps/snmpv3.h" // 如果使用 SNMP v3
  6. #include "lwip/apps/snmp_opts.h"
  7. #include "lwip/apps/snmp_core.h"
  8. #include "lwip/apps/snmp_table.h"
  9. #include "lwip/apps/snmp_scalar.h"
  10. #include "string.h"
  11. #include "power.h"
  12. #define SNMP_SMARTPDU_OID {1,3,6,1,4,1,2024}
  13. #define SNMP_SMARTPDU_DEVICE_OID {1,3,6,1,4,1,2024,1}
  14. //#define SNMP_SMARTPDU_CHANNEL_TABLE {1,3,6,1,4,1,2024,1,3,9}
  15. //#define SNMP_SMARTPDU_ALARM_TABLE_IOD {1,3,6,1,4,1,2024,1,6,1}
  16. #define SNMP_SMARTPDU_THR_TABLE_IOD {1,3,6,1,4,1,2024,1,7}
  17. typedef struct
  18. {
  19. uint8_t sysdescr[10];
  20. uint8_t syscontact[5];
  21. uint8_t sysname[3];
  22. uint8_t syslocation[3];
  23. struct snmp_obj_id device_enterprose_oid;
  24. // char *id_manifacture;
  25. // char *id_device;
  26. // char *id_sn;
  27. // char *id_version;
  28. }snmp_smarpdu_t;
  29. static snmp_smarpdu_t snmp_smart={
  30. .sysdescr={"Smart_pdu"},
  31. .syscontact={"KyKy"},
  32. .sysname={"Rt"},
  33. .syslocation={"CN"},
  34. .device_enterprose_oid={
  35. .len = 7,
  36. .id = SNMP_SMARTPDU_OID,
  37. },
  38. // .id_manifacture = "Gowone Industry",
  39. // .id_device = "Smart_PDU",
  40. // .id_sn = "SN123465",
  41. // .id_version = "v1.0.0.0",
  42. };
  43. static s16_t sysinfo_get_value(const struct snmp_scalar_array_node_def *node, void *value)
  44. {
  45. char *var = NULL;
  46. s16_t var_len;
  47. char buff[100]= {0};
  48. switch(node->oid)
  49. {
  50. case 1:
  51. {
  52. sprintf(buff,"%d",0);
  53. }
  54. break;
  55. case 2:
  56. {
  57. sprintf(buff,"%s","smart_pdu");
  58. }
  59. break;
  60. case 3:
  61. {
  62. sprintf(buff,"%s","DC");
  63. }
  64. break;
  65. case 4:
  66. {
  67. sprintf(buff,"%s","SN1235");
  68. }
  69. break;
  70. case 5:
  71. {
  72. sprintf(buff,"%d",12);
  73. }
  74. break;
  75. case 6:
  76. {
  77. sprintf(buff,"%d",7);
  78. }
  79. break;
  80. default:
  81. {
  82. LOGE("sysinfo_get_value(): unknown id: %d\n", node->oid);
  83. return 0;
  84. }
  85. }
  86. var_len = strlen(buff);
  87. memcpy(value, buff, var_len);
  88. return var_len;
  89. }
  90. #define POWER_VALUE 4
  91. typedef struct power_data{
  92. uint8_t id;
  93. char * name;
  94. uint8_t status;
  95. float v;
  96. float i;
  97. float f;
  98. float c;
  99. float fa;
  100. float p;
  101. float r_p;
  102. float a_p;
  103. }p_data_t;
  104. typedef struct alarm_data{
  105. uint8_t id;
  106. uint8_t type;
  107. char * alarm_info;
  108. uint8_t alarm_action;
  109. uint32_t alarm_action_para;
  110. char * date;
  111. char * time;
  112. }p_alarm_t;
  113. typedef struct threshold_data{
  114. uint8_t id;
  115. char *name;
  116. float v_max;
  117. float v_min;
  118. float i_max;
  119. float p_max;
  120. float c_max;
  121. }thr_d_t;
  122. typedef struct thr_sensor_data{
  123. uint8_t id;
  124. char *name;
  125. uint32_t val1_up;
  126. uint32_t val2_up;
  127. uint32_t val1_down;
  128. uint32_t val2_down;
  129. }thr_s_t;
  130. static p_data_t p_data[POWER_VALUE]={
  131. {
  132. .id = 1,
  133. .name = "smart_pdu",
  134. .status = 1,
  135. .v=220.0,
  136. .i = 15.3,
  137. .f = 48.95,
  138. .c = 20.14,
  139. .fa = 0.89,
  140. .p = 480.12,
  141. .r_p = 520.45,
  142. .a_p = 600.12,
  143. },
  144. {
  145. .id = 2,
  146. .name = "smart_pdu",
  147. .status = 1,
  148. .v=218.0,
  149. .i = 15.3,
  150. .f = 49.95,
  151. .c = 20.14,
  152. .fa = 0.89,
  153. .p = 480.12,
  154. .r_p = 520.45,
  155. .a_p = 600.12,
  156. },
  157. {
  158. .id = 3,
  159. .name = "smart_pdu",
  160. .status = 1,
  161. .v=219.0,
  162. .i = 9.3,
  163. .f = 48.95,
  164. .c = 20.14,
  165. .fa = 0.89,
  166. .p = 100.12,
  167. .r_p = 230.45,
  168. .a_p = 460.12,
  169. },
  170. {
  171. .id = 4,
  172. .name = "smart_pdu",
  173. .status = 0,
  174. .v=220.0,
  175. .i = 15.3,
  176. .f = 48.95,
  177. .c = 20.14,
  178. .fa = 0.89,
  179. .p = 480.12,
  180. .r_p = 520.45,
  181. .a_p = 600.12,
  182. },
  183. };
  184. static thr_s_t p_thr_s[POWER_VALUE] = {
  185. {
  186. .id = 1,
  187. .name = "sers_th1",
  188. .val1_up = 23,
  189. .val2_up = 32,
  190. .val1_down = 11,
  191. .val2_down = 12,
  192. },
  193. {
  194. .id = 2,
  195. .name = "sers_th2",
  196. .val1_up = 23,
  197. .val2_up = 32,
  198. .val1_down = 11,
  199. .val2_down = 12,
  200. },
  201. {
  202. .id = 3,
  203. .name = "sers_th3",
  204. .val1_up = 23,
  205. .val2_up = 32,
  206. .val1_down = 11,
  207. .val2_down = 12,
  208. },
  209. {
  210. .id = 4,
  211. .name = "sers_th4",
  212. .val1_up = 23,
  213. .val2_up = 32,
  214. .val1_down = 11,
  215. .val2_down = 12,
  216. },
  217. };
  218. static const struct snmp_oid_range th_table_oid_ranges[] = {
  219. {1, POWER_VALUE},
  220. };
  221. static p_alarm_t p_a_data[POWER_VALUE]={
  222. {
  223. .id = 1,
  224. .type = 3,
  225. .alarm_info="voltage alarm!!!",
  226. .alarm_action = 0,
  227. .alarm_action_para = 4,
  228. .date = "2052.12.20",
  229. .time = "12:30:47",
  230. },
  231. {
  232. .id = 2,
  233. .type = 2,
  234. .alarm_info="current alarm!!!",
  235. .alarm_action = 1,
  236. .alarm_action_para = 2,
  237. .date = "2002-11-20",
  238. .time = "10:30:47",
  239. },
  240. {
  241. .id = 3,
  242. .type = 1,
  243. .alarm_info="power alarm!!!",
  244. .alarm_action = 3,
  245. .alarm_action_para = 6,
  246. .date = "2012-11-20",
  247. .time = "10:59:47",
  248. },
  249. {
  250. .id = 4,
  251. .type = 4,
  252. .alarm_info="consumer alarm!!!",
  253. .alarm_action = 3,
  254. .alarm_action_para = 6,
  255. .date = "2012-11-20",
  256. .time = "10:59:47",
  257. },
  258. };
  259. static thr_d_t p_t_data[POWER_VALUE]=
  260. {
  261. {
  262. .id = 1,
  263. .name="thrould",
  264. .v_max = 250.00,
  265. .v_min = 180.00,
  266. .i_max = 50.00,
  267. .p_max = 20000.00,
  268. .c_max = 10000,
  269. },
  270. {
  271. .id = 2,
  272. .name="thrould",
  273. .v_max = 250.00,
  274. .v_min = 180.00,
  275. .i_max = 50.00,
  276. .p_max = 20000.00,
  277. .c_max = 10000,
  278. },
  279. {
  280. .id = 3,
  281. .name="thrould",
  282. .v_max = 250.00,
  283. .v_min = 180.00,
  284. .i_max = 50.00,
  285. .p_max = 20000.00,
  286. .c_max = 10000,
  287. },
  288. {
  289. .id = 4,
  290. .name="thrould",
  291. .v_max = 250.00,
  292. .v_min = 180.00,
  293. .i_max = 50.00,
  294. .p_max = 20000.00,
  295. .c_max = 10000,
  296. },
  297. };
  298. static snmp_err_t thr_s_set_value(struct snmp_node_instance *instance,u16_t len, void *value)
  299. {
  300. u32_t row = instance->reference.u32;
  301. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  302. switch(col)
  303. {
  304. case COLUMN_PDUSENSORLIMITVALUE1UP:
  305. {
  306. p_thr_s[row-1].val1_up = *(uint32_t *)value;
  307. }
  308. break;
  309. case COLUMN_PDUSENSORLIMITVALUE2UP:
  310. {
  311. p_thr_s[row-1].val2_up = *(uint32_t *)value;
  312. }
  313. break;
  314. case COLUMN_PDUSENSORLIMITVALUE1DOWN:
  315. {
  316. p_thr_s[row-1].val1_down = *(uint32_t *)value;
  317. }
  318. break;
  319. case COLUMN_PDUSENSORLIMITVALUE2DOWN:
  320. {
  321. p_thr_s[row-1].val2_down = *(uint32_t *)value;
  322. }
  323. break;
  324. default:
  325. return SNMP_ERR_NOTWRITABLE;
  326. }
  327. return SNMP_ERR_NOERROR;
  328. }
  329. static s16_t thr_s_get_value(struct snmp_node_instance *instance, void *value)
  330. {
  331. u32_t row = instance->reference.u32;
  332. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  333. char buff[50]= {0};
  334. switch(col)
  335. {
  336. case COLUMN_PDUSENSORLIMITID:
  337. {
  338. *(s32_t *)value = p_thr_s[row-1].id;
  339. return 4;
  340. }
  341. break;
  342. case COLUMN_PDUSENSORLIMITNAME:
  343. {
  344. sprintf(buff,"%s",p_thr_s[row-1].name);
  345. }
  346. break;
  347. case COLUMN_PDUSENSORLIMITVALUE1UP:
  348. {
  349. *(s32_t *)value = p_thr_s[row-1].val1_up;
  350. return 4;
  351. }
  352. break;
  353. case COLUMN_PDUSENSORLIMITVALUE2UP:
  354. {
  355. *(s32_t *)value = p_thr_s[row-1].val2_up;
  356. return 4;
  357. }
  358. break;
  359. case COLUMN_PDUSENSORLIMITVALUE1DOWN:
  360. {
  361. *(s32_t *)value = p_thr_s[row-1].val1_down;
  362. return 4;
  363. }
  364. break;
  365. case COLUMN_PDUSENSORLIMITVALUE2DOWN:
  366. {
  367. *(s32_t *)value = p_thr_s[row-1].val2_down;
  368. return 4;
  369. }
  370. break;
  371. default:
  372. return 0;
  373. }
  374. memcpy(value,buff,strlen(buff));
  375. return strlen(buff);
  376. }
  377. static s16_t thr_get_value(struct snmp_node_instance *instance, void *value)
  378. {
  379. u32_t row = instance->reference.u32;
  380. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  381. char buff[50]= {0};
  382. switch (col)
  383. {
  384. case COLUMN_PDUCHANNELLIMITID:
  385. {
  386. *(s32_t *)value = p_t_data[row-1].id;
  387. return 4;
  388. }
  389. break;
  390. case COLUMN_PDUCHANNELLIMITNAME:
  391. {
  392. sprintf(buff,"%s",p_t_data[row-1].name);
  393. }
  394. break;
  395. case COLUMN_PDUCHANNELCURRENTLIMITUP:
  396. {
  397. sprintf(buff,"%.2f",p_t_data[row-1].i_max);
  398. }
  399. break;
  400. case COLUMN_PDUCHANNELVOLTAGELIMITUP:
  401. {
  402. sprintf(buff,"%.2f",p_t_data[row-1].v_max);
  403. }
  404. break;
  405. case COLUMN_PDUCHANNELVOLTAGELIMITDOWN:
  406. {
  407. sprintf(buff,"%.2f",p_t_data[row-1].v_min);
  408. }
  409. break;
  410. case COLUMN_PDUCHANNELPOWERLIMITUP:
  411. {
  412. sprintf(buff,"%.2f",p_t_data[row-1].p_max);
  413. }
  414. break;
  415. case COLUMN_PDUCHANNELCONSUMPTIONLIMITUP:
  416. {
  417. sprintf(buff,"%.2f",p_t_data[row-1].c_max);
  418. }
  419. break;
  420. default:
  421. return 0;
  422. }
  423. memcpy(value,buff,strlen(buff));
  424. return strlen(buff);
  425. }
  426. static s16_t alarm_get_value(struct snmp_node_instance *instance, void *value)
  427. {
  428. u32_t row = instance->reference.u32;
  429. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  430. char buff[50]= {0};
  431. switch (col)
  432. {
  433. case COLUMN_PDUALARMID:
  434. {
  435. *(s32_t *)value = p_a_data[row-1].id;
  436. return 4;
  437. }
  438. break;
  439. case COLUMN_PDUALARMTYPE:
  440. {
  441. *(s32_t *)value = p_a_data[row-1].type;
  442. return 4;
  443. }
  444. break;
  445. case COLUMN_PDUALARMCONTEXT:
  446. {
  447. sprintf(buff,"%s",p_a_data[row-1].alarm_info);
  448. }
  449. break;
  450. case COLUMN_PDUALARMACTION:
  451. {
  452. *(s32_t *)value = p_a_data[row-1].alarm_action;
  453. return 4;
  454. }
  455. break;
  456. case COLUMN_PDUALARMACTIONPARA:
  457. {
  458. *(s32_t *)value = p_a_data[row-1].alarm_action_para;
  459. return 4;
  460. }
  461. break;
  462. case COLUMN_PDUALARMDATE:
  463. {
  464. sprintf(buff,"%s",p_a_data[row-1].date);
  465. }
  466. break;
  467. case COLUMN_PDUALARMTIME:
  468. {
  469. sprintf(buff,"%s",p_a_data[row-1].time);
  470. }
  471. break;
  472. default:
  473. return 0;
  474. }
  475. memcpy(value,buff,strlen(buff));
  476. return strlen(buff);
  477. }
  478. static snmp_err_t get_instance(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, struct snmp_node_instance *cell_instance)
  479. {
  480. if (!snmp_oid_in_range(row_oid, row_oid_len, th_table_oid_ranges, LWIP_ARRAYSIZE(th_table_oid_ranges)))
  481. return SNMP_ERR_NOSUCHINSTANCE;
  482. cell_instance->reference.u32 = row_oid[0];
  483. return SNMP_ERR_NOERROR;
  484. }
  485. static snmp_err_t get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
  486. {
  487. u8_t i = 0;
  488. struct snmp_next_oid_state state;
  489. u32_t next_oid = 0;
  490. snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
  491. // power_all_t all;
  492. // power_data_get(&all);
  493. for (i = 0; i < POWER_VALUE; i++)
  494. {
  495. u32_t test_oid = i + 1;
  496. snmp_next_oid_check(&state, &test_oid, 1, NULL);
  497. }
  498. if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
  499. {
  500. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  501. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  502. return SNMP_ERR_NOERROR;
  503. }
  504. return SNMP_ERR_NOSUCHINSTANCE;
  505. }
  506. static s16_t power_get_value(struct snmp_node_instance *instance, void *value)
  507. {
  508. u32_t row = instance->reference.u32;
  509. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  510. char buff[100]= {0};
  511. switch (col)
  512. {
  513. case COLUMN_PDUCHANNELID:
  514. {
  515. *(s32_t *)value = p_data[row-1].id;
  516. return 4;
  517. }
  518. break;
  519. case COLUMN_PDUCHANNELNAME:
  520. {
  521. sprintf(buff,"%s",p_data[row-1].name);
  522. }
  523. break;
  524. case COLUMN_PDUCHANNELSTATUS:
  525. {
  526. //sprintf(buff,"%d",p_data[row].status);
  527. *(s32_t *)value = p_data[row-1].status;
  528. return 4;
  529. }
  530. break;
  531. case COLUMN_PDUCHANNELVOLTAGE:
  532. {
  533. sprintf(buff,"%.2f",p_data[row-1].v);
  534. }
  535. break;
  536. case COLUMN_PDUCHANNELCURRENT:
  537. {
  538. sprintf(buff,"%.2f",p_data[row-1].i);
  539. }
  540. break;
  541. case COLUMN_PDUCHANNELFREQUENCY:
  542. {
  543. sprintf(buff,"%.2f",p_data[row-1].f);
  544. }
  545. break;
  546. case COLUMN_PDUCHANNELCONSUMPTION:
  547. {
  548. sprintf(buff,"%.2f",p_data[row-1].c);
  549. }
  550. break;
  551. case COLUMN_PDUCHANNELPOWERFACTOR:
  552. {
  553. sprintf(buff,"%.2f",p_data[row-1].fa);
  554. }
  555. break;
  556. case COLUMN_PDUCHANNELPACTIVEPOWER:
  557. {
  558. sprintf(buff,"%.2f",p_data[row-1].p);
  559. }
  560. break;
  561. case COLUMN_PDUCHANNELREACTIVEPOWER:
  562. {
  563. sprintf(buff,"%.2f",p_data[row-1].r_p);
  564. }
  565. break;
  566. case COLUMN_PDUCHANNELAPPARENTPOWER:
  567. {
  568. sprintf(buff,"%.2f",p_data[row-1].a_p);
  569. }
  570. break;
  571. default:
  572. return 0;
  573. }
  574. memcpy(value,buff,strlen(buff));
  575. return strlen(buff);
  576. }
  577. static snmp_err_t set_test(struct snmp_node_instance *instance, u16_t len, void *value)
  578. {
  579. LOGD("write test\n");
  580. return SNMP_ERR_NOERROR;
  581. }
  582. static snmp_err_t power_set_value (struct snmp_node_instance *instance, u16_t len, void *value)
  583. {
  584. u32_t row = instance->reference.u32;
  585. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  586. switch(col)
  587. {
  588. case COLUMN_PDUCHANNELSTATUS:
  589. {
  590. p_data[row-1].status = *(uint32_t*)value;
  591. }
  592. break;
  593. default:
  594. return SNMP_ERR_NOTWRITABLE;
  595. }
  596. return SNMP_ERR_NOERROR;
  597. }
  598. static snmp_err_t thr_set_value(struct snmp_node_instance *instance,u16_t len, void *value)
  599. {
  600. u32_t row = instance->reference.u32;
  601. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  602. switch(col)
  603. {
  604. case COLUMN_PDUCHANNELCURRENTLIMITUP:
  605. {
  606. p_t_data[row-1].i_max = (float)atof((char *)value);
  607. }
  608. break;
  609. case COLUMN_PDUCHANNELVOLTAGELIMITUP:
  610. {
  611. p_t_data[row-1].v_max = (float)atof((char *)value);
  612. }
  613. break;
  614. case COLUMN_PDUCHANNELVOLTAGELIMITDOWN:
  615. {
  616. p_t_data[row-1].v_min = (float)atof((char *)value);
  617. }
  618. break;
  619. case COLUMN_PDUCHANNELPOWERLIMITUP:
  620. {
  621. p_t_data[row-1].p_max = (float)atof((char *)value);
  622. }
  623. break;
  624. case COLUMN_PDUCHANNELCONSUMPTIONLIMITUP:
  625. {
  626. p_t_data[row-1].c_max = (float)atof((char *)value);
  627. }
  628. break;
  629. default:
  630. return SNMP_ERR_INCONSISTENTNAME;
  631. }
  632. return SNMP_ERR_NOERROR;
  633. }
  634. static const struct snmp_scalar_array_node_def sysinfo_scalars_nodes[] = {
  635. {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product id */
  636. {2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product name */
  637. {3, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product type */
  638. {4, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product firmware */
  639. {5, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product channal number */
  640. {6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product sensor number */
  641. {0,0,0},
  642. };
  643. static const struct snmp_table_col_def power_table_channels[]={
  644. {COLUMN_PDUCHANNELID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  645. {COLUMN_PDUCHANNELNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  646. {COLUMN_PDUCHANNELSTATUS, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE},
  647. {COLUMN_PDUCHANNELVOLTAGE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  648. {COLUMN_PDUCHANNELCURRENT, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  649. {COLUMN_PDUCHANNELFREQUENCY, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  650. {COLUMN_PDUCHANNELCONSUMPTION, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  651. {COLUMN_PDUCHANNELPOWERFACTOR, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  652. {COLUMN_PDUCHANNELPACTIVEPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  653. {COLUMN_PDUCHANNELREACTIVEPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  654. {COLUMN_PDUCHANNELAPPARENTPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  655. {0,0,0},
  656. };
  657. static const struct snmp_table_col_def alarm_history_table[]={
  658. {COLUMN_PDUALARMID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  659. {COLUMN_PDUALARMTYPE, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  660. {COLUMN_PDUALARMCONTEXT, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  661. {COLUMN_PDUALARMACTION, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  662. {COLUMN_PDUALARMACTIONPARA, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  663. {COLUMN_PDUALARMDATE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  664. {COLUMN_PDUALARMTIME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  665. {0,0,0},
  666. };
  667. static const struct snmp_table_col_def threshold_limit_table[] = {
  668. {COLUMN_PDUCHANNELLIMITID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  669. {COLUMN_PDUCHANNELLIMITNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  670. {COLUMN_PDUCHANNELCURRENTLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  671. {COLUMN_PDUCHANNELVOLTAGELIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  672. {COLUMN_PDUCHANNELVOLTAGELIMITDOWN, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  673. {COLUMN_PDUCHANNELPOWERLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  674. {COLUMN_PDUCHANNELCONSUMPTIONLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  675. {0,0,0},
  676. };
  677. static const struct snmp_table_col_def sensor_limit_table[] = {
  678. {COLUMN_PDUSENSORLIMITID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY,},
  679. {COLUMN_PDUSENSORLIMITNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY,},
  680. {COLUMN_PDUSENSORLIMITVALUE1UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  681. {COLUMN_PDUSENSORLIMITVALUE2UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  682. {COLUMN_PDUSENSORLIMITVALUE1DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  683. {COLUMN_PDUSENSORLIMITVALUE2DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  684. {0,0,0},
  685. };
  686. const struct snmp_scalar_array_node sysinfo_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, sysinfo_scalars_nodes, sysinfo_get_value, NULL, NULL);
  687. static const struct snmp_table_node power_table = SNMP_TABLE_CREATE(9, power_table_channels, get_instance, get_next_instance, \
  688. power_get_value, set_test, power_set_value);
  689. static const struct snmp_table_node alarm_table = SNMP_TABLE_CREATE(1, alarm_history_table, get_instance, get_next_instance, \
  690. alarm_get_value, set_test, NULL);
  691. static const struct snmp_table_node thr_table = SNMP_TABLE_CREATE(6, threshold_limit_table, get_instance, get_next_instance, \
  692. thr_get_value, set_test, thr_set_value);
  693. static const struct snmp_table_node thr_s_table = SNMP_TABLE_CREATE(1, sensor_limit_table, get_instance, get_next_instance, \
  694. thr_s_get_value, set_test, thr_s_set_value);
  695. static const struct snmp_node *const alarm_subnodes[]={
  696. &alarm_table.node.node,
  697. };
  698. static const struct snmp_node *const power_subnodes[] = {
  699. &power_table.node.node,
  700. };
  701. static const struct snmp_node *const thr_subnodes[] = {
  702. &thr_table.node.node,
  703. };
  704. static const struct snmp_node *const thr_s_subnodes[] = {
  705. &thr_s_table.node.node,
  706. };
  707. const struct snmp_tree_node power_treenode = SNMP_CREATE_TREE_NODE(3, power_subnodes);
  708. const struct snmp_tree_node alarm_treenode = SNMP_CREATE_TREE_NODE(6, alarm_subnodes);
  709. const struct snmp_tree_node thr_treenode = SNMP_CREATE_TREE_NODE(2, thr_subnodes);
  710. const struct snmp_tree_node thr_s_treenode = SNMP_CREATE_TREE_NODE(3, thr_s_subnodes);
  711. static const struct snmp_node *const mib2_nodes_dev[] =
  712. {
  713. &sysinfo_scalars.node.node,
  714. &power_treenode.node,
  715. &alarm_treenode.node,
  716. //&thr_treenode.node,
  717. };
  718. static const struct snmp_node *const mib2_nodes_dev_2[]={
  719. &thr_treenode.node,
  720. &thr_s_treenode.node,
  721. };
  722. static const struct snmp_tree_node snmp_mib2_root_dev = SNMP_CREATE_TREE_NODE(1, mib2_nodes_dev);
  723. static const struct snmp_tree_node snmp_mib2_thr_dev = SNMP_CREATE_TREE_NODE(7, mib2_nodes_dev_2);
  724. static const u32_t prvmib_base_oid[] = SNMP_SMARTPDU_DEVICE_OID;
  725. static const u32_t thr_base_oid[] = SNMP_SMARTPDU_THR_TABLE_IOD;
  726. const struct snmp_mib mib2_dev = SNMP_MIB_CREATE(prvmib_base_oid, &snmp_mib2_root_dev.node);
  727. const struct snmp_mib mib2_th_dev = SNMP_MIB_CREATE(thr_base_oid, &snmp_mib2_thr_dev.node);
  728. static const struct snmp_mib *dev_mibs[] = {&mib2, &mib2_dev,&mib2_th_dev};
  729. void netif_event_callback(struct netif *netif) {
  730. //snmp_ifType ifType = netif->link_type == NETIF_TYPE_ETHERNET ? ifTypeEthernetCsmacd : ifTypeOther;
  731. //snmp_insert_ipnetif(netif, ifType); // 将网络接口添加到 SNMP MIB-2 中
  732. }
  733. static void mibs_init(void) {
  734. uint16_t len = 0;
  735. len= strlen((const char *)snmp_smart.sysdescr);
  736. snmp_mib2_set_sysdescr(snmp_smart.sysdescr, &len);
  737. len= strlen((const char *)snmp_smart.syscontact);
  738. snmp_mib2_set_syscontact(snmp_smart.syscontact, &len, 0);
  739. len= strlen((const char *)snmp_smart.sysname);
  740. snmp_mib2_set_sysname(snmp_smart.sysname, &len, 0);
  741. len= strlen((const char *)snmp_smart.syslocation);
  742. snmp_mib2_set_syslocation(snmp_smart.syslocation, &len, 0);
  743. snmp_set_device_enterprise_oid(&snmp_smart.device_enterprose_oid);
  744. snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED);
  745. snmp_trap_dst_enable(0, 0);
  746. //snmp_trap_dst_ip_set(0, &test_snmp_trap_ip);
  747. snmp_set_mibs(&dev_mibs[0], LWIP_ARRAYSIZE(dev_mibs));
  748. snmp_set_community("public");
  749. snmp_set_community_write("public");
  750. }
  751. int snmp2_init(void)
  752. {
  753. mibs_init();
  754. snmp_init();
  755. return 0;
  756. }
  757. int snmp2_deinit(void)
  758. {
  759. return 0;
  760. }