snmp.c 26 KB

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