snmp.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562
  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. #include "sensor.h"
  14. #include "paras.h"
  15. #include "pthread.h"
  16. #include "rtthread.h"
  17. #include "wanning.h"
  18. #define SNMP_SMARTPDU_OID {1,3,6,1,2,1,1}
  19. #define SNMP_SMARTPDU_DEVICE_OID {1,3,6,1,4,1,2024,1}
  20. //#define SNMP_SMARTPDU_CHANNEL_TABLE {1,3,6,1,4,1,2024,1,3,9}
  21. //#define SNMP_SMARTPDU_ALARM_TABLE_IOD {1,3,6,1,4,1,2024,1,6,1}
  22. #define SNMP_SMARTPDU_THR_TABLE_IOD {1,3,6,1,4,1,2024,1,7}
  23. #define SNMP_SMARTPDU_TOTAL_OID {1,3,6,1,4,1,2024,1,3}
  24. typedef struct
  25. {
  26. uint8_t sysdescr[10];
  27. uint8_t syscontact[5];
  28. uint8_t sysname[3];
  29. uint8_t syslocation[3];
  30. struct snmp_obj_id device_enterprose_oid;
  31. // char *id_manifacture;
  32. // char *id_device;
  33. // char *id_sn;
  34. // char *id_version;
  35. // power_all_t all;
  36. pthread_mutex_t mutex;
  37. pthread_cond_t cond;
  38. pthread_t id;
  39. }snmp_smarpdu_t;
  40. static snmp_smarpdu_t snmp_smart={
  41. .sysdescr={"Smart_pdu"},
  42. .syscontact={"KyKy"},
  43. .sysname={"Rt"},
  44. .syslocation={"CN"},
  45. .device_enterprose_oid={
  46. .len = 7,
  47. .id = SNMP_SMARTPDU_OID,
  48. },
  49. };
  50. static s16_t sysinfo_get_value(const struct snmp_scalar_array_node_def *node, void *value)
  51. {
  52. char *var = NULL;
  53. s16_t var_len;
  54. char buff[100]= {0};
  55. switch(node->oid)
  56. {
  57. case 1:
  58. {
  59. sprintf(buff,"%d",0);
  60. }
  61. break;
  62. case 2:
  63. {
  64. sprintf(buff,"%s","smart_pdu");
  65. }
  66. break;
  67. case 3:
  68. {
  69. sprintf(buff,"%s","DC");
  70. }
  71. break;
  72. case 4:
  73. {
  74. sprintf(buff,"%s","SN1235");
  75. }
  76. break;
  77. case 5:
  78. {
  79. sprintf(buff,"%d",12);
  80. }
  81. break;
  82. case 6:
  83. {
  84. sprintf(buff,"%d",7);
  85. }
  86. break;
  87. default:
  88. {
  89. LOGE("sysinfo_get_value(): unknown id: %d\n", node->oid);
  90. return 0;
  91. }
  92. }
  93. var_len = strlen(buff);
  94. memcpy(value, buff, var_len);
  95. return var_len;
  96. }
  97. static s16_t total_get_value(const struct snmp_scalar_array_node_def *node, void *value)
  98. {
  99. char *var = NULL;
  100. s16_t var_len;
  101. char buff[100]= {0};
  102. power_all_t *all = power_get_all();
  103. switch(node->oid)
  104. {
  105. case SCALAR_VOLTAGE:
  106. {
  107. sprintf(buff,"%.2f",all->ttl.total[0].voltage);
  108. }
  109. break;
  110. case SCALAR_CURRENT:
  111. {
  112. sprintf(buff,"%.2f",all->ttl.total[0].current);
  113. }
  114. break;
  115. case SCALAR_CONSUMEPTION:
  116. {
  117. sprintf(buff,"%.2f",all->ttl.total[0].consump);
  118. }
  119. break;
  120. case SCALAR_POWER_FACTOR:
  121. {
  122. sprintf(buff,"%.2f",all->ttl.total[0].factor);
  123. }
  124. break;
  125. case SCALAR_PACTIVE_POWER:
  126. {
  127. sprintf(buff,"%.2f",all->ttl.total[0].power);
  128. }
  129. break;
  130. case SCALAR_REACTIVE_POWER:
  131. {
  132. sprintf(buff,"%.2f",all->ttl.total[0].reactive);
  133. }
  134. break;
  135. case SCALAR_APPARENT_POWER:
  136. {
  137. sprintf(buff,"%.2f",all->ttl.total[0].active);
  138. }
  139. break;
  140. default:
  141. return 0;
  142. }
  143. var_len = strlen(buff);
  144. memcpy(value, buff, var_len);
  145. return var_len;
  146. }
  147. #define POWER_VALUE 4
  148. typedef struct power_data{
  149. uint8_t id;
  150. char * name;
  151. uint8_t status;
  152. float v;
  153. float i;
  154. float f;
  155. float c;
  156. float fa;
  157. float p;
  158. float r_p;
  159. float a_p;
  160. }p_data_t;
  161. typedef struct alarm_data{
  162. uint8_t id;
  163. uint8_t type;
  164. char * alarm_info;
  165. uint8_t alarm_action;
  166. uint32_t alarm_action_para;
  167. char * date;
  168. char * time;
  169. }p_alarm_t;
  170. typedef struct threshold_data{
  171. uint8_t id;
  172. char *name;
  173. float v_max;
  174. float v_min;
  175. float i_max;
  176. float p_max;
  177. float c_max;
  178. }thr_d_t;
  179. typedef struct thr_sensor_data{
  180. uint8_t id;
  181. char *name;
  182. uint32_t val1_up;
  183. uint32_t val2_up;
  184. uint32_t val1_down;
  185. uint32_t val2_down;
  186. }thr_s_t;
  187. static p_data_t p_data[POWER_VALUE]={
  188. {
  189. .id = 1,
  190. .name = "smart_pdu",
  191. .status = 1,
  192. .v=220.0,
  193. .i = 15.3,
  194. .f = 48.95,
  195. .c = 20.14,
  196. .fa = 0.89,
  197. .p = 480.12,
  198. .r_p = 520.45,
  199. .a_p = 600.12,
  200. },
  201. {
  202. .id = 2,
  203. .name = "smart_pdu",
  204. .status = 1,
  205. .v=218.0,
  206. .i = 15.3,
  207. .f = 49.95,
  208. .c = 20.14,
  209. .fa = 0.89,
  210. .p = 480.12,
  211. .r_p = 520.45,
  212. .a_p = 600.12,
  213. },
  214. {
  215. .id = 3,
  216. .name = "smart_pdu",
  217. .status = 1,
  218. .v=219.0,
  219. .i = 9.3,
  220. .f = 48.95,
  221. .c = 20.14,
  222. .fa = 0.89,
  223. .p = 100.12,
  224. .r_p = 230.45,
  225. .a_p = 460.12,
  226. },
  227. {
  228. .id = 4,
  229. .name = "smart_pdu",
  230. .status = 0,
  231. .v=220.0,
  232. .i = 15.3,
  233. .f = 48.95,
  234. .c = 20.14,
  235. .fa = 0.89,
  236. .p = 480.12,
  237. .r_p = 520.45,
  238. .a_p = 600.12,
  239. },
  240. };
  241. static thr_s_t p_thr_s[POWER_VALUE] = {
  242. {
  243. .id = 1,
  244. .name = "sers_th1",
  245. .val1_up = 23,
  246. .val2_up = 32,
  247. .val1_down = 11,
  248. .val2_down = 12,
  249. },
  250. {
  251. .id = 2,
  252. .name = "sers_th2",
  253. .val1_up = 23,
  254. .val2_up = 32,
  255. .val1_down = 11,
  256. .val2_down = 12,
  257. },
  258. {
  259. .id = 3,
  260. .name = "sers_th3",
  261. .val1_up = 23,
  262. .val2_up = 32,
  263. .val1_down = 11,
  264. .val2_down = 12,
  265. },
  266. {
  267. .id = 4,
  268. .name = "sers_th4",
  269. .val1_up = 23,
  270. .val2_up = 32,
  271. .val1_down = 11,
  272. .val2_down = 12,
  273. },
  274. };
  275. static struct snmp_oid_range th_table_oid_ranges[] = {
  276. {1, POWER_VALUE},
  277. };
  278. static struct snmp_oid_range th_sensor_oid_ranges[] = {
  279. {1,MAX_SENSOR},
  280. };
  281. static p_alarm_t p_a_data[POWER_VALUE]={
  282. {
  283. .id = 1,
  284. .type = 3,
  285. .alarm_info="voltage alarm!!!",
  286. .alarm_action = 0,
  287. .alarm_action_para = 4,
  288. .date = "2052.12.20",
  289. .time = "12:30:47",
  290. },
  291. {
  292. .id = 2,
  293. .type = 2,
  294. .alarm_info="current alarm!!!",
  295. .alarm_action = 1,
  296. .alarm_action_para = 2,
  297. .date = "2002-11-20",
  298. .time = "10:30:47",
  299. },
  300. {
  301. .id = 3,
  302. .type = 1,
  303. .alarm_info="power alarm!!!",
  304. .alarm_action = 3,
  305. .alarm_action_para = 6,
  306. .date = "2012-11-20",
  307. .time = "10:59:47",
  308. },
  309. {
  310. .id = 4,
  311. .type = 4,
  312. .alarm_info="consumer alarm!!!",
  313. .alarm_action = 3,
  314. .alarm_action_para = 6,
  315. .date = "2012-11-20",
  316. .time = "10:59:47",
  317. },
  318. };
  319. static thr_d_t p_t_data[POWER_VALUE]=
  320. {
  321. {
  322. .id = 1,
  323. .name="thrould",
  324. .v_max = 250.00,
  325. .v_min = 180.00,
  326. .i_max = 50.00,
  327. .p_max = 20000.00,
  328. .c_max = 10000,
  329. },
  330. {
  331. .id = 2,
  332. .name="thrould",
  333. .v_max = 250.00,
  334. .v_min = 180.00,
  335. .i_max = 50.00,
  336. .p_max = 20000.00,
  337. .c_max = 10000,
  338. },
  339. {
  340. .id = 3,
  341. .name="thrould",
  342. .v_max = 250.00,
  343. .v_min = 180.00,
  344. .i_max = 50.00,
  345. .p_max = 20000.00,
  346. .c_max = 10000,
  347. },
  348. {
  349. .id = 4,
  350. .name="thrould",
  351. .v_max = 250.00,
  352. .v_min = 180.00,
  353. .i_max = 50.00,
  354. .p_max = 20000.00,
  355. .c_max = 10000,
  356. },
  357. };
  358. static s16_t thr_s_get_info(struct snmp_node_instance *instance, void *value)
  359. {
  360. u32_t row = instance->reference.u32;
  361. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  362. sensor_all_t *sensor = sensor_get_data();
  363. char buff[50]= {0};
  364. if(!sensor)
  365. return 0;
  366. switch(col)
  367. {
  368. case COLUMN_PDUSENSORID:
  369. {
  370. *(s32_t *)value = row;
  371. return 4;
  372. }
  373. case COLUMN_PDUSENSORNAME:
  374. {
  375. sprintf(buff,"%s",sensor->data[row-1].info.name);
  376. }
  377. break;
  378. case COLUMN_PDUSENSORTYPE:
  379. {
  380. sprintf(buff,"%d",sensor->data[row-1].info.type);
  381. }
  382. break;
  383. case COLUMN_PDUSENSORDATACHENNEL:
  384. {
  385. sprintf(buff,"%d",sensor->data[row-1].info.num_val);
  386. }
  387. break;
  388. case COLUMN_PDUSENSORMODBUSADDRESS:
  389. {
  390. //sprintf(buff,"%d",sensor->data[row-1].info.addr);
  391. *(s32_t *)value = sensor->data[row-1].info.addr;
  392. return 4;
  393. }
  394. break;
  395. case COLUMN_PDUSENSORSTATUS:
  396. {
  397. //sprintf(buff,"%d",sensor->data[row-1].info.status);
  398. *(s32_t *)value = sensor->data[row-1].info.status;
  399. return 4;
  400. }
  401. break;
  402. case COLUMN_PDUSENSORVALUENUM:
  403. {
  404. //sprintf(buff,"%d",sensor->data[row-1].info.num_val);
  405. *(s32_t *)value = sensor->data[row-1].info.num_val;
  406. return 4;
  407. }
  408. break;
  409. case COLUMN_PDUSENSORVALUE1:
  410. {
  411. sprintf(buff,"%.2f",sensor->data[row-1].val[0].value);
  412. }
  413. break;
  414. case COLUMN_PDUSENSORVALUE2:
  415. {
  416. sprintf(buff,"%.2f",sensor->data[row-1].val[1].value);
  417. }
  418. break;
  419. default:
  420. break;
  421. }
  422. memcpy(value,buff,strlen(buff));
  423. return strlen(buff);
  424. }
  425. static snmp_err_t thr_s_set_value(struct snmp_node_instance *instance,u16_t len, void *value)
  426. {
  427. u32_t row = instance->reference.u32;
  428. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  429. sensor_all_t * sensor = sensor_get_data();
  430. paras_data_t *p=paras_get();
  431. uint32_t val = *(uint32_t *)value;
  432. if(sensor->data == 0)
  433. {
  434. return SNMP_ERR_NOTWRITABLE;
  435. }
  436. switch(col)
  437. {
  438. case COLUMN_PDUSENSORLIMITVALUE1UP:
  439. {
  440. sensor->data[row-1].val[0].thr.max = (val/100.0);
  441. p->sensor[row-1].th_max_1 = val;
  442. if(val)
  443. {
  444. sensor->data[row-1].val[0].thr.en.th_sen_max_en = 1;
  445. }else
  446. {
  447. sensor->data[row-1].val[0].thr.en.th_sen_max_en = 0;
  448. }
  449. }
  450. break;
  451. case COLUMN_PDUSENSORLIMITVALUE2UP:
  452. {
  453. sensor->data[row-1].val[1].thr.max = (val/100.0);
  454. p->sensor[row-1].th_max_2 = val;
  455. if(val)
  456. {
  457. sensor->data[row-1].val[1].thr.en.th_sen_max_en = 1;
  458. }else
  459. {
  460. sensor->data[row-1].val[1].thr.en.th_sen_max_en = 0;
  461. }
  462. }
  463. break;
  464. case COLUMN_PDUSENSORLIMITVALUE1DOWN:
  465. {
  466. sensor->data[row-1].val[0].thr.min = (val/100.0);
  467. p->sensor[row-1].th_min_1 = val;
  468. if(val)
  469. {
  470. sensor->data[row-1].val[0].thr.en.th_sen_min_en = 1;
  471. }else
  472. {
  473. sensor->data[row-1].val[0].thr.en.th_sen_min_en = 0;
  474. }
  475. }
  476. break;
  477. case COLUMN_PDUSENSORLIMITVALUE2DOWN:
  478. {
  479. sensor->data[row-1].val[1].thr.min = (val/100.0);
  480. p->sensor[row-1].th_min_2 = val;
  481. if(val)
  482. {
  483. sensor->data[row-1].val[1].thr.en.th_sen_min_en = 1;
  484. }else
  485. {
  486. sensor->data[row-1].val[1].thr.en.th_sen_min_en = 0;
  487. }
  488. }
  489. break;
  490. default:
  491. return SNMP_ERR_NOTWRITABLE;
  492. }
  493. paras_save();
  494. return SNMP_ERR_NOERROR;
  495. }
  496. static s16_t thr_s_get_value(struct snmp_node_instance *instance, void *value)
  497. {
  498. u32_t row = instance->reference.u32;
  499. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  500. sensor_all_t *sensor = sensor_get_data();
  501. char buff[50]= {0};
  502. switch(col)
  503. {
  504. case COLUMN_PDUSENSORLIMITID:
  505. {
  506. *(s32_t *)value = row;
  507. return 4;
  508. }
  509. break;
  510. case COLUMN_PDUSENSORLIMITNAME:
  511. {
  512. sprintf(buff,"%s",sensor->data[row-1].info.name);
  513. }
  514. break;
  515. case COLUMN_PDUSENSORLIMITVALUE1UP:
  516. {
  517. *(s32_t *)value = (sensor->data[row-1].val[0].thr.max * 100);
  518. return 4;
  519. }
  520. break;
  521. case COLUMN_PDUSENSORLIMITVALUE2UP:
  522. {
  523. *(s32_t *)value = (sensor->data[row-1].val[1].thr.max * 100);
  524. return 4;
  525. }
  526. break;
  527. case COLUMN_PDUSENSORLIMITVALUE1DOWN:
  528. {
  529. *(s32_t *)value = (sensor->data[row-1].val[0].thr.min * 100);
  530. return 4;
  531. }
  532. break;
  533. case COLUMN_PDUSENSORLIMITVALUE2DOWN:
  534. {
  535. *(s32_t *)value = (sensor->data[row-1].val[1].thr.min * 100);
  536. return 4;
  537. }
  538. break;
  539. default:
  540. return 0;
  541. }
  542. memcpy(value,buff,strlen(buff));
  543. return strlen(buff);
  544. }
  545. static s16_t thr_get_value(struct snmp_node_instance *instance, void *value)
  546. {
  547. power_all_t *all = power_get_all();
  548. u32_t row = instance->reference.u32;
  549. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  550. char buff[50]= {0};
  551. switch (col)
  552. {
  553. case COLUMN_PDUCHANNELLIMITID:
  554. {
  555. *(s32_t *)value = row-1;
  556. return 4;
  557. }
  558. break;
  559. case COLUMN_PDUCHANNELLIMITNAME:
  560. {
  561. sprintf(buff,"%s",all->pch[row-1].info.name);
  562. }
  563. break;
  564. case COLUMN_PDUCHANNELCURRENTLIMITUP:
  565. {
  566. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.c_upper/10.0));
  567. }
  568. break;
  569. case COLUMN_PDUCHANNELVOLTAGELIMITUP:
  570. {
  571. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.v_upper/10.0));
  572. }
  573. break;
  574. case COLUMN_PDUCHANNELVOLTAGELIMITDOWN:
  575. {
  576. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.v_lower/10.0));
  577. }
  578. break;
  579. case COLUMN_PDUCHANNELPOWERLIMITUP:
  580. {
  581. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.p_upper/10.0));
  582. }
  583. break;
  584. case COLUMN_PDUCHANNELCONSUMPTIONLIMITUP:
  585. {
  586. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.w_upper/10.0));
  587. }
  588. break;
  589. default:
  590. return 0;
  591. }
  592. memcpy(value,buff,strlen(buff));
  593. return strlen(buff);
  594. }
  595. static s16_t alarm_get_value(struct snmp_node_instance *instance, void *value)
  596. {
  597. u32_t row = instance->reference.u32;
  598. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  599. waning_info_t *info = {0};
  600. info = waning_get_info(row-1);
  601. char buff[50]= {0};
  602. switch (col)
  603. {
  604. case COLUMN_PDUALARMID:
  605. {
  606. *(s32_t *)value = row-1;
  607. return 4;
  608. }
  609. break;
  610. case COLUMN_PDUALARMTYPE:
  611. {
  612. *(s32_t *)value = info->type;
  613. return 4;
  614. }
  615. break;
  616. case COLUMN_PDUALARMCONTEXT:
  617. {
  618. sprintf(buff,"%s",info->waning_context);
  619. }
  620. break;
  621. case COLUMN_PDUALARMACTION:
  622. {
  623. *(s32_t *)value = 0;
  624. return 4;
  625. }
  626. break;
  627. case COLUMN_PDUALARMACTIONPARA:
  628. {
  629. *(s32_t *)value = 0;
  630. return 4;
  631. }
  632. break;
  633. case COLUMN_PDUALARMDATE:
  634. {
  635. snprintf(buff,10,"%s",info->date);
  636. //sprintf(buff,"%s",p_a_data[row-1].date);
  637. }
  638. break;
  639. case COLUMN_PDUALARMTIME:
  640. {
  641. char * _info = &(info->date[11]);
  642. snprintf(buff,8,"%s",_info);
  643. // sprintf(buff,"%s",p_a_data[row-1].time);
  644. }
  645. break;
  646. default:
  647. return 0;
  648. }
  649. memcpy(value,buff,strlen(buff));
  650. return strlen(buff);
  651. }
  652. 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)
  653. {
  654. power_all_t *all = power_get_all();
  655. th_table_oid_ranges[0].max = all->chs-1;
  656. if (!snmp_oid_in_range(row_oid, row_oid_len, th_table_oid_ranges, LWIP_ARRAYSIZE(th_table_oid_ranges)))
  657. return SNMP_ERR_NOSUCHINSTANCE;
  658. cell_instance->reference.u32 = row_oid[0];
  659. return SNMP_ERR_NOERROR;
  660. }
  661. 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)
  662. {
  663. if (!snmp_oid_in_range(row_oid, row_oid_len, th_table_oid_ranges, LWIP_ARRAYSIZE(th_table_oid_ranges)))
  664. return SNMP_ERR_NOSUCHINSTANCE;
  665. cell_instance->reference.u32 = row_oid[0];
  666. return SNMP_ERR_NOERROR;
  667. }
  668. static snmp_err_t get_sensor_instance(const u32_t *column, const u32_t *row_oid, u8_t row_oid_len, struct snmp_node_instance *cell_instance)
  669. {
  670. if (!snmp_oid_in_range(row_oid, row_oid_len, th_sensor_oid_ranges, LWIP_ARRAYSIZE(th_sensor_oid_ranges)))
  671. return SNMP_ERR_NOSUCHINSTANCE;
  672. cell_instance->reference.u32 = row_oid[0];
  673. return SNMP_ERR_NOERROR;
  674. }
  675. static snmp_err_t get_sensor_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
  676. {
  677. u8_t i = 0;
  678. struct snmp_next_oid_state state;
  679. u32_t next_oid = 0;
  680. snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
  681. for (i = 0; i < th_sensor_oid_ranges[0].max; i++)
  682. {
  683. u32_t test_oid = i + 1;
  684. snmp_next_oid_check(&state, &test_oid, 1, NULL);
  685. }
  686. if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
  687. {
  688. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  689. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  690. return SNMP_ERR_NOERROR;
  691. }
  692. return SNMP_ERR_NOSUCHINSTANCE;
  693. }
  694. static uint8_t ph_cont = 0;
  695. static snmp_err_t power_get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
  696. {
  697. u8_t i = 0;
  698. struct snmp_next_oid_state state;
  699. u32_t next_oid = 0;
  700. snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
  701. //power_data_get(&snmp_smart.all);
  702. power_all_t *all = power_get_all();
  703. for (i = 0; i < all->chs-1; i++)
  704. {
  705. u32_t test_oid = i + 1;
  706. snmp_next_oid_check(&state, &test_oid, 1, NULL);
  707. }
  708. if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
  709. {
  710. #if 0
  711. if(all->ttl.type == PDU_AC_I3O3)
  712. {
  713. if(ph_cont==3)
  714. {
  715. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  716. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  717. cell_instance->reference.u32++;
  718. ph_cont=0;
  719. }
  720. }else if(all->ttl.type == PDU_AC_I3O2)
  721. {
  722. if(ph_cont == 2)
  723. {
  724. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  725. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  726. cell_instance->reference.u32++;
  727. ph_cont=0;
  728. }
  729. }else
  730. #endif
  731. {
  732. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  733. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  734. cell_instance->reference.u32++;
  735. }
  736. return SNMP_ERR_NOERROR;
  737. }
  738. return SNMP_ERR_NOSUCHINSTANCE;
  739. }
  740. static snmp_err_t get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
  741. {
  742. u8_t i = 0;
  743. struct snmp_next_oid_state state;
  744. u32_t next_oid = 0;
  745. wanning_get_count();
  746. snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
  747. //power_all_t *all = power_get_all();
  748. //power_data_get(&snmp_smart.all);
  749. for (i = 0; i < wanning_get_count(); i++)
  750. {
  751. u32_t test_oid = i + 1;
  752. snmp_next_oid_check(&state, &test_oid, 1, NULL);
  753. }
  754. if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
  755. {
  756. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  757. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  758. return SNMP_ERR_NOERROR;
  759. }
  760. return SNMP_ERR_NOSUCHINSTANCE;
  761. }
  762. static s16_t alarm_power_get(struct snmp_node_instance *instance, void *value)
  763. {
  764. power_all_t *all = power_get_all();
  765. u32_t row = instance->reference.u32;
  766. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  767. switch (col)
  768. {
  769. case COLUMN_PDUCHANNELPOWERALARMID:
  770. {
  771. *(s32_t *)value = row-1;
  772. }
  773. break;
  774. case COLUMN_PDUCHANNELPOWERALARMVOLTAGEUP:
  775. {
  776. *(s32_t *)value = all->pch[row-1].alarm.l1_v_upper;
  777. }
  778. break;
  779. case COLUMN_PDUCHANNELPOWERALARMVOLTAGEDOWN:
  780. {
  781. *(s32_t *)value = all->pch[row-1].alarm.l1_v_lower;
  782. }
  783. break;
  784. case COLUMN_PDUCHANNELPOWERALARMCURRENTUP:
  785. {
  786. *(s32_t *)value = all->pch[row-1].alarm.l1_c_upper;
  787. }
  788. break;
  789. case COLUMN_PDUCHANNELPOWERALARMPOWERUP:
  790. {
  791. *(s32_t *)value = all->pch[row-1].alarm.l1_p_upper;
  792. }
  793. break;
  794. case COLUMN_PDUCHANNELPOWERALARMCONSUMPTIONUP:
  795. {
  796. *(s32_t *)value = all->pch[row-1].alarm.l1_w_upper;
  797. }
  798. break;
  799. default:
  800. return 0;
  801. }
  802. return 4;
  803. }
  804. static s16_t alarm_sensor_get(struct snmp_node_instance *instance, void *value)
  805. {
  806. sensor_all_t *sensor = sensor_get_data();
  807. u32_t row = instance->reference.u32;
  808. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  809. switch (col)
  810. {
  811. case COLUMN_PDUSENSORALARMID:
  812. {
  813. *(s32_t *)value = row-1;
  814. }
  815. break;
  816. case COLUMN_PDUSENSORALARMVALUE1UP:
  817. {
  818. *(s32_t *)value = sensor->data[row-1].val[0].s_alarm.max_up;
  819. }
  820. break;
  821. case COLUMN_PDUSENSORALARMVALUE1DOWN:
  822. {
  823. *(s32_t *)value = sensor->data[row-1].val[0].s_alarm.min_down;
  824. }
  825. break;
  826. case COLUMN_PDUSENSORALARMVALUE2UP:
  827. {
  828. *(s32_t *)value = sensor->data[row-1].val[1].s_alarm.max_up;
  829. }
  830. break;
  831. case COLUMN_PDUSENSORALARMVALUE2DOWN:
  832. {
  833. *(s32_t *)value = sensor->data[row-1].val[0].s_alarm.min_down;
  834. }
  835. break;
  836. default:
  837. return 0;
  838. }
  839. return 4;
  840. }
  841. static s16_t power_get_value(struct snmp_node_instance *instance, void *value)
  842. {
  843. power_all_t *all = power_get_all();
  844. u32_t row = instance->reference.u32;
  845. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  846. char buff[100]= {0};
  847. switch (col)
  848. {
  849. case COLUMN_PDUCHANNELID:
  850. {
  851. *(s32_t *)value = row-1;
  852. return 4;
  853. }
  854. break;
  855. case COLUMN_PDUCHANNELNAME:
  856. {
  857. sprintf(buff,"%s",all->pch[row-1].info.name);
  858. }
  859. break;
  860. case COLUMN_PDUCHANNELSTATUS:
  861. {
  862. //sprintf(buff,"%d",p_data[row].status);
  863. //*(s32_t *)value = p_data[row-1].status;
  864. *(s32_t *)value = all->pch[row-1].status;
  865. return 4;
  866. }
  867. break;
  868. case COLUMN_PDUCHANNELVOLTAGE:
  869. {
  870. sprintf(buff,"%.2f",((float)all->pch[row-1].power[0].voltage)/100.0);
  871. }
  872. break;
  873. case COLUMN_PDUCHANNELCURRENT:
  874. {
  875. sprintf(buff,"%.2f",((float)all->pch[row-1].power[0].current)/100.0);
  876. }
  877. break;
  878. case COLUMN_PDUCHANNELFREQUENCY:
  879. {
  880. sprintf(buff,"%.2f",((float)all->pch[row-1].power[0].freq)/100.0);
  881. }
  882. break;
  883. case COLUMN_PDUCHANNELCONSUMPTION:
  884. {
  885. sprintf(buff,"%.2f",((float)all->pch[row-1].power[0].consump)/100.0);
  886. }
  887. break;
  888. case COLUMN_PDUCHANNELPOWERFACTOR:
  889. {
  890. sprintf(buff,"%.2f",((float)all->pch[row-1].power[0].factor)/100.0);
  891. }
  892. break;
  893. case COLUMN_PDUCHANNELPACTIVEPOWER:
  894. {
  895. sprintf(buff,"%.2f",((float)all->pch[row-1].power[0].power)/100.0);
  896. }
  897. break;
  898. case COLUMN_PDUCHANNELREACTIVEPOWER:
  899. {
  900. float reactive = 0.0;
  901. if(all->pch[row-1].power[0].power > 0)
  902. {
  903. reactive = (float)(all->pch[row-1].power[0].power) / all->pch[row-1].power[0].factor - ((float)all->pch[row-1].power[0].power/100.0);
  904. }
  905. sprintf(buff,"%.2f",reactive);
  906. }
  907. break;
  908. case COLUMN_PDUCHANNELAPPARENTPOWER:
  909. {
  910. float app_power = 0.0;
  911. if(all->pch[row-1].power[0].power > 0)
  912. app_power = (float)(all->pch[row-1].power[0].power) / all->pch[row-1].power[0].factor;
  913. sprintf(buff,"%.2f",app_power);
  914. }
  915. break;
  916. default:
  917. return 0;
  918. }
  919. memcpy(value,buff,strlen(buff));
  920. return strlen(buff);
  921. }
  922. static snmp_err_t set_test(struct snmp_node_instance *instance, u16_t len, void *value)
  923. {
  924. LOGD("write test\n");
  925. return SNMP_ERR_NOERROR;
  926. }
  927. static snmp_err_t power_set_value (struct snmp_node_instance *instance, u16_t len, void *value)
  928. {
  929. power_all_t *all = power_get_all();
  930. u32_t row = instance->reference.u32;
  931. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  932. switch(col)
  933. {
  934. case COLUMN_PDUCHANNELSTATUS:
  935. {
  936. //p_data[row-1].status = *(uint32_t*)value;
  937. all->pch[row].status = *(uint32_t*)value;
  938. power_set_ch_sw_n(&all->pch[row]);
  939. }
  940. break;
  941. default:
  942. return SNMP_ERR_NOTWRITABLE;
  943. }
  944. return SNMP_ERR_NOERROR;
  945. }
  946. static snmp_err_t thr_set_value(struct snmp_node_instance *instance,u16_t len, void *value)
  947. {
  948. u32_t row = instance->reference.u32;
  949. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  950. power_all_t *all = power_get_all();
  951. switch(col)
  952. {
  953. case COLUMN_PDUCHANNELCURRENTLIMITUP:
  954. {
  955. all->pch[row].thr.c_upper = (float)atof((char *)value) * 100;
  956. //p_t_data[row-1].i_max = (float)atof((char *)value);
  957. //all->pch[row-1]
  958. power_set_threshold(&all->pch[row]);
  959. }
  960. break;
  961. case COLUMN_PDUCHANNELVOLTAGELIMITUP:
  962. {
  963. //p_t_data[row-1].v_max = (float)atof((char *)value);
  964. all->pch[row].thr.v_upper = (float)atof((char *)value) * 100;
  965. power_set_threshold(&all->pch[row]);
  966. }
  967. break;
  968. case COLUMN_PDUCHANNELVOLTAGELIMITDOWN:
  969. {
  970. all->pch[row].thr.v_lower = (float)atof((char *)value) * 100;
  971. power_set_threshold(&all->pch[row]);
  972. //p_t_data[row-1].v_min = (float)atof((char *)value);
  973. //all->pch[row-1].thr.v_upper = (float)atof((char *)value) * 10;
  974. }
  975. break;
  976. case COLUMN_PDUCHANNELPOWERLIMITUP:
  977. {
  978. //p_t_data[row-1].p_max = (float)atof((char *)value);
  979. all->pch[row].thr.p_upper = (float)atof((char *)value) * 100;
  980. power_set_threshold(&all->pch[row]);
  981. }
  982. break;
  983. case COLUMN_PDUCHANNELCONSUMPTIONLIMITUP:
  984. {
  985. //p_t_data[row-1].c_max = (float)atof((char *)value);
  986. all->pch[row].thr.w_upper = (float)atof((char *)value) * 100;
  987. power_set_threshold(&all->pch[row]);
  988. }
  989. break;
  990. default:
  991. return SNMP_ERR_INCONSISTENTNAME;
  992. }
  993. return SNMP_ERR_NOERROR;
  994. }
  995. static const struct snmp_scalar_array_node_def sysinfo_scalars_nodes[] = {
  996. {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product id */
  997. {2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product name */
  998. {3, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product type */
  999. {4, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product firmware */
  1000. {5, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product channal number */
  1001. {6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product sensor number */
  1002. {0,0,0},
  1003. };
  1004. static const struct snmp_table_col_def power_table_channels[]={
  1005. {COLUMN_PDUCHANNELID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1006. {COLUMN_PDUCHANNELNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1007. {COLUMN_PDUCHANNELSTATUS, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE},
  1008. {COLUMN_PDUCHANNELVOLTAGE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1009. {COLUMN_PDUCHANNELCURRENT, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1010. {COLUMN_PDUCHANNELFREQUENCY, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1011. {COLUMN_PDUCHANNELCONSUMPTION, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1012. {COLUMN_PDUCHANNELPOWERFACTOR, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1013. {COLUMN_PDUCHANNELPACTIVEPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1014. {COLUMN_PDUCHANNELREACTIVEPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1015. {COLUMN_PDUCHANNELAPPARENTPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1016. {0,0,0},
  1017. };
  1018. static const struct snmp_table_col_def alarm_history_table[]={
  1019. {COLUMN_PDUALARMID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1020. {COLUMN_PDUALARMTYPE, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1021. {COLUMN_PDUALARMCONTEXT, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1022. {COLUMN_PDUALARMACTION, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1023. {COLUMN_PDUALARMACTIONPARA, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1024. {COLUMN_PDUALARMDATE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1025. {COLUMN_PDUALARMTIME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1026. {0,0,0},
  1027. };
  1028. static const struct snmp_table_col_def alarm_power_table[]={
  1029. {COLUMN_PDUCHANNELPOWERALARMID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1030. {COLUMN_PDUCHANNELPOWERALARMVOLTAGEUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1031. {COLUMN_PDUCHANNELPOWERALARMVOLTAGEDOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1032. {COLUMN_PDUCHANNELPOWERALARMCURRENTUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1033. {COLUMN_PDUALARMACTIONPARA, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1034. {COLUMN_PDUCHANNELPOWERALARMPOWERUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1035. {COLUMN_PDUCHANNELPOWERALARMCONSUMPTIONUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1036. {0,0,0},
  1037. };
  1038. static const struct snmp_table_col_def alarm_sensor_table[]={
  1039. {COLUMN_PDUSENSORALARMID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1040. {COLUMN_PDUSENSORALARMVALUE1UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1041. {COLUMN_PDUSENSORALARMVALUE1DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1042. {COLUMN_PDUSENSORALARMVALUE2UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1043. {COLUMN_PDUSENSORALARMVALUE2DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1044. {0,0,0},
  1045. };
  1046. static const struct snmp_table_col_def threshold_limit_table[] = {
  1047. {COLUMN_PDUCHANNELLIMITID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1048. {COLUMN_PDUCHANNELLIMITNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1049. {COLUMN_PDUCHANNELCURRENTLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  1050. {COLUMN_PDUCHANNELVOLTAGELIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  1051. {COLUMN_PDUCHANNELVOLTAGELIMITDOWN, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  1052. {COLUMN_PDUCHANNELPOWERLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  1053. {COLUMN_PDUCHANNELCONSUMPTIONLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  1054. {0,0,0},
  1055. };
  1056. static const struct snmp_table_col_def sensor_limit_table[] = {
  1057. {COLUMN_PDUSENSORLIMITID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY,},
  1058. {COLUMN_PDUSENSORLIMITNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY,},
  1059. {COLUMN_PDUSENSORLIMITVALUE1UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  1060. {COLUMN_PDUSENSORLIMITVALUE2UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  1061. {COLUMN_PDUSENSORLIMITVALUE1DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  1062. {COLUMN_PDUSENSORLIMITVALUE2DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  1063. {0,0,0},
  1064. };
  1065. static const struct snmp_table_col_def sensor_info_table[] = {
  1066. {COLUMN_PDUSENSORID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1067. {COLUMN_PDUSENSORNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1068. {COLUMN_PDUSENSORTYPE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1069. {COLUMN_PDUSENSORDATACHENNEL, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1070. {COLUMN_PDUSENSORMODBUSADDRESS, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1071. {COLUMN_PDUSENSORSTATUS, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1072. {COLUMN_PDUSENSORVALUENUM, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  1073. {COLUMN_PDUSENSORVALUE1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1074. {COLUMN_PDUSENSORVALUE2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  1075. {0,0,0},
  1076. };
  1077. const struct snmp_scalar_array_node sysinfo_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, sysinfo_scalars_nodes, sysinfo_get_value, NULL, NULL);
  1078. static s16_t get_total_scalar_value(struct snmp_node_instance *instance , void* data)
  1079. {
  1080. power_all_t *all = power_get_all();
  1081. char buff[100] = {0};
  1082. switch(instance->node->oid)
  1083. {
  1084. case SCALAR_VOLTAGE:
  1085. sprintf(buff,"%.2f",all->ttl.total[0].voltage);
  1086. break;
  1087. case SCALAR_CURRENT:
  1088. sprintf(buff,"%.2f",all->ttl.total[0].current);
  1089. break;
  1090. case SCALAR_CONSUMEPTION:
  1091. sprintf(buff,"%.2f",all->ttl.total[0].consump);
  1092. break;
  1093. case SCALAR_POWER_FACTOR:
  1094. sprintf(buff,"%.2f",all->ttl.total[0].factor);
  1095. break;
  1096. case SCALAR_PACTIVE_POWER:
  1097. sprintf(buff,"%.2f",all->ttl.total[0].power);
  1098. break;
  1099. case SCALAR_REACTIVE_POWER:
  1100. sprintf(buff,"%.2f",all->ttl.total[0].reactive);
  1101. break;
  1102. case SCALAR_APPARENT_POWER:
  1103. sprintf(buff,"%.2f",all->ttl.total[0].active);
  1104. break;
  1105. default:
  1106. return 0;
  1107. }
  1108. memcpy(data,buff,strlen(buff));
  1109. return strlen(buff);
  1110. }
  1111. const struct snmp_scalar_node voltage_scalar = SNMP_SCALAR_CREATE_NODE(SCALAR_VOLTAGE,SNMP_NODE_INSTANCE_READ_ONLY,SNMP_ASN1_TYPE_OCTET_STRING,get_total_scalar_value,NULL,NULL);
  1112. const struct snmp_scalar_node current_scalar = SNMP_SCALAR_CREATE_NODE(SCALAR_CURRENT,SNMP_NODE_INSTANCE_READ_ONLY,SNMP_ASN1_TYPE_OCTET_STRING,get_total_scalar_value,NULL,NULL);
  1113. const struct snmp_scalar_node consumer_scalar = SNMP_SCALAR_CREATE_NODE(SCALAR_CONSUMEPTION,SNMP_NODE_INSTANCE_READ_ONLY,SNMP_ASN1_TYPE_OCTET_STRING,get_total_scalar_value,NULL,NULL);
  1114. const struct snmp_scalar_node factor_scalar = SNMP_SCALAR_CREATE_NODE(SCALAR_POWER_FACTOR,SNMP_NODE_INSTANCE_READ_ONLY,SNMP_ASN1_TYPE_OCTET_STRING,get_total_scalar_value,NULL,NULL);
  1115. const struct snmp_scalar_node pactive_scalar = SNMP_SCALAR_CREATE_NODE(SCALAR_PACTIVE_POWER,SNMP_NODE_INSTANCE_READ_ONLY,SNMP_ASN1_TYPE_OCTET_STRING,get_total_scalar_value,NULL,NULL);
  1116. const struct snmp_scalar_node reactive_scalar = SNMP_SCALAR_CREATE_NODE(SCALAR_REACTIVE_POWER,SNMP_NODE_INSTANCE_READ_ONLY,SNMP_ASN1_TYPE_OCTET_STRING,get_total_scalar_value,NULL,NULL);
  1117. const struct snmp_scalar_node appactive_scalar = SNMP_SCALAR_CREATE_NODE(SCALAR_APPARENT_POWER,SNMP_NODE_INSTANCE_READ_ONLY,SNMP_ASN1_TYPE_OCTET_STRING,get_total_scalar_value,NULL,NULL);
  1118. static const struct snmp_table_node power_table = SNMP_TABLE_CREATE(9, power_table_channels, power_get_instance, power_get_next_instance, \
  1119. power_get_value, set_test, power_set_value);
  1120. static const struct snmp_table_node alarm_table = SNMP_TABLE_CREATE(1, alarm_history_table, get_instance, get_next_instance, \
  1121. alarm_get_value, set_test, NULL);
  1122. static const struct snmp_table_node thr_table = SNMP_TABLE_CREATE(6, threshold_limit_table, power_get_instance, power_get_next_instance, \
  1123. thr_get_value, set_test, thr_set_value);
  1124. static const struct snmp_table_node thr_s_table = SNMP_TABLE_CREATE(1, sensor_limit_table, get_sensor_instance, get_sensor_next_instance, \
  1125. thr_s_get_value, set_test, thr_s_set_value);
  1126. static const struct snmp_table_node sensor_table = SNMP_TABLE_CREATE(1,sensor_info_table,get_sensor_instance,get_sensor_next_instance,\
  1127. thr_s_get_info,set_test,thr_s_set_value);
  1128. static const struct snmp_table_node alarm_p_table = SNMP_TABLE_CREATE(2,alarm_power_table,power_get_instance,power_get_next_instance,\
  1129. alarm_power_get,NULL,NULL);
  1130. static const struct snmp_table_node alarm_s_table = SNMP_TABLE_CREATE(3,alarm_sensor_table,get_sensor_instance,get_sensor_next_instance,\
  1131. alarm_sensor_get,NULL,NULL);
  1132. static const struct snmp_node *const alarm_subnodes[]={
  1133. &alarm_table.node.node,
  1134. &alarm_p_table.node.node,
  1135. &alarm_s_table.node.node
  1136. };
  1137. static const struct snmp_node *const power_subnodes[] = {
  1138. &power_table.node.node,
  1139. &voltage_scalar.node.node,
  1140. &current_scalar.node.node,
  1141. &consumer_scalar.node.node,
  1142. &factor_scalar.node.node,
  1143. &pactive_scalar.node.node,
  1144. &reactive_scalar.node.node,
  1145. &appactive_scalar.node.node,
  1146. };
  1147. static const struct snmp_node *const thr_subnodes[] = {
  1148. &thr_table.node.node,
  1149. };
  1150. static const struct snmp_node *const thr_s_subnodes[] = {
  1151. &thr_s_table.node.node,
  1152. };
  1153. static const struct snmp_node *const sensor_subnodes[] = {
  1154. &sensor_table.node.node,
  1155. };
  1156. const struct snmp_tree_node power_treenode = SNMP_CREATE_TREE_NODE(3, power_subnodes);
  1157. const struct snmp_tree_node alarm_treenode = SNMP_CREATE_TREE_NODE(6, alarm_subnodes);
  1158. const struct snmp_tree_node thr_treenode = SNMP_CREATE_TREE_NODE(2, thr_subnodes);
  1159. const struct snmp_tree_node thr_s_treenode = SNMP_CREATE_TREE_NODE(3, thr_s_subnodes);
  1160. const struct snmp_tree_node sensor_treenode = SNMP_CREATE_TREE_NODE(4, sensor_subnodes);
  1161. static const struct snmp_node *const mib2_nodes_dev[] =
  1162. {
  1163. &sysinfo_scalars.node.node,
  1164. &power_treenode.node,
  1165. &alarm_treenode.node,
  1166. &sensor_treenode.node,
  1167. };
  1168. static const struct snmp_node *const mib2_nodes_dev_2[]={
  1169. &thr_treenode.node,
  1170. &thr_s_treenode.node,
  1171. };
  1172. static const struct snmp_tree_node snmp_mib2_root_dev = SNMP_CREATE_TREE_NODE(1, mib2_nodes_dev);
  1173. static const struct snmp_tree_node snmp_mib2_thr_dev = SNMP_CREATE_TREE_NODE(7, mib2_nodes_dev_2);
  1174. static const u32_t prvmib_base_oid[] = SNMP_SMARTPDU_DEVICE_OID;
  1175. static const u32_t thr_base_oid [] = SNMP_SMARTPDU_THR_TABLE_IOD;
  1176. const struct snmp_mib mib2_dev = SNMP_MIB_CREATE(prvmib_base_oid, &snmp_mib2_root_dev.node);
  1177. const struct snmp_mib mib2_th_dev = SNMP_MIB_CREATE(thr_base_oid, &snmp_mib2_thr_dev.node);
  1178. static const struct snmp_mib *dev_mibs[] = {&mib2, &mib2_dev,&mib2_th_dev};
  1179. void snmp_power_alarm_trap(AlarmTrapinfo *data)
  1180. {
  1181. struct snmp_varbind vb={0},vb1={0},vb2={0},vb3={0};
  1182. int a= 1,b=2,c=3;
  1183. const u32_t oid_1[]={1,3,6,1,4,1,2024,2,1};
  1184. const u32_t pduAlarmID_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,2,data->ID};
  1185. const u32_t pduAlarmContext_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,3,data->ID};
  1186. const u32_t pduAlarmDate_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,6,data->ID};
  1187. snmp_oid_assign(&vb.oid, oid_1, LWIP_ARRAYSIZE(oid_1));
  1188. snmp_oid_assign(&vb1.oid, pduAlarmID_oid, LWIP_ARRAYSIZE(pduAlarmID_oid));
  1189. snmp_oid_assign(&vb2.oid, pduAlarmContext_oid, LWIP_ARRAYSIZE(pduAlarmContext_oid));
  1190. snmp_oid_assign(&vb3.oid, pduAlarmDate_oid, LWIP_ARRAYSIZE(pduAlarmDate_oid));
  1191. vb.type = SNMP_ASN1_TYPE_INTEGER;
  1192. vb.value = (void*)&(data->ID);
  1193. vb.value_len = 4;
  1194. vb1.type = SNMP_ASN1_TYPE_INTEGER;
  1195. vb1.value = (void*)&(data->Alarmid);
  1196. vb1.value_len = 4;
  1197. vb2.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1198. vb2.value = (void*)(&data->AlarmContext);
  1199. vb2.value_len = strlen(data->AlarmContext);
  1200. vb3.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1201. vb3.value = (void*)(&data->AlarmDate);
  1202. vb3.value_len = strlen(data->AlarmDate);
  1203. vb.next = &vb1;
  1204. vb1.next = &vb2;
  1205. vb2.next = &vb3;
  1206. vb3.prev = &vb2;
  1207. vb2.prev = &vb1;
  1208. vb1.prev = &vb;
  1209. snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb);
  1210. //snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb1);
  1211. //snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb2);
  1212. //snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb3);
  1213. }
  1214. void snmp_sensor_alarm_trap(AlarmTrapinfo *data)
  1215. {
  1216. struct snmp_varbind vb={0},vb1={0},vb2={0},vb3={0};
  1217. int a= 1,b=2,c=3;
  1218. const u32_t oid_1[]={1,3,6,1,4,1,2024,2,2};
  1219. const u32_t pduAlarmID_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,2, data->ID};
  1220. const u32_t pduAlarmContext_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,3, data->ID};
  1221. const u32_t pduAlarmDate_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,6,data->ID};
  1222. snmp_oid_assign(&vb.oid, oid_1, LWIP_ARRAYSIZE(oid_1));
  1223. snmp_oid_assign(&vb1.oid, pduAlarmID_oid, LWIP_ARRAYSIZE(pduAlarmID_oid));
  1224. snmp_oid_assign(&vb2.oid, pduAlarmContext_oid, LWIP_ARRAYSIZE(pduAlarmContext_oid));
  1225. snmp_oid_assign(&vb3.oid, pduAlarmDate_oid, LWIP_ARRAYSIZE(pduAlarmDate_oid));
  1226. vb.type = SNMP_ASN1_TYPE_INTEGER;
  1227. vb.value = (void*)&(data->ID);;
  1228. vb.value_len = 4;
  1229. vb1.type = SNMP_ASN1_TYPE_INTEGER;
  1230. vb1.value = (void*)&data->Alarmid;
  1231. vb1.value_len = 4;
  1232. vb2.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1233. vb2.value = (void*)&data->AlarmContext;
  1234. vb2.value_len = strlen(data->AlarmContext);
  1235. vb3.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1236. vb3.value = (void*)&data->AlarmDate;
  1237. vb3.value_len = strlen(data->AlarmDate);
  1238. vb.next = &vb1;
  1239. vb1.next = &vb2;
  1240. vb2.next = &vb3;
  1241. vb3.prev = &vb2;
  1242. vb2.prev = &vb1;
  1243. vb1.prev = &vb;
  1244. snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb);
  1245. }
  1246. AlarmTrapinfo data = {
  1247. 2,
  1248. 1,
  1249. "dasdasdasdas",
  1250. "dasdasdjkhasdjia"
  1251. };
  1252. //void *snmp_thread(void *args)
  1253. //{
  1254. // while(1)
  1255. // {
  1256. // pthread_mutex_lock(&snmp_smart.mutex);
  1257. // while(pthread_cond_wait(&snmp_smart.cond, &snmp_smart.mutex));
  1258. // if(paras_get()->snmp.trapmode == 1)
  1259. // snmp_power_alarm_trap(&data);
  1260. //// system("snmp");
  1261. //
  1262. // pthread_mutex_unlock(&snmp_smart.mutex);
  1263. // }
  1264. //}
  1265. //void send_snmp_tarp(void)
  1266. //{
  1267. // pthread_mutex_lock(&snmp_smart.mutex);
  1268. // pthread_cond_signal(&snmp_smart.cond);
  1269. // pthread_mutex_unlock(&snmp_smart.mutex);
  1270. //}
  1271. void cmd_snmp_test(int argc, char **argv)
  1272. {
  1273. #if 0
  1274. struct snmp_varbind vb;
  1275. memset(&vb, 0, sizeof(struct snmp_varbind));
  1276. char *str = "trap test";
  1277. static const u32_t oid[] = {1, 3, 6, 1, 4, 1, 5888, 1, 5, 0};
  1278. snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
  1279. vb.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1280. vb.value = (void *)str;
  1281. vb.value_len = strlen(str);
  1282. snmp_send_trap_specific(0, &vb);
  1283. #endif
  1284. snmp_power_alarm_trap(&data);
  1285. // snmp_send_trap_generic(SNMP_GENTRAP_COLDSTART);
  1286. }
  1287. MSH_CMD_EXPORT_ALIAS(cmd_snmp_test, snmp, snmp agent test);
  1288. void netif_event_callback(struct netif *netif) {
  1289. }
  1290. static void mibs_init(void) {
  1291. paras_data_t *para = paras_get();
  1292. //snmp_v2c_enable(1);
  1293. //snmp_v2c_enabled();
  1294. // uint16_t len = 0;
  1295. // len= strlen((const char *)snmp_smart.sysdescr);
  1296. // snmp_mib2_set_sysdescr(snmp_smart.sysdescr, &len);
  1297. //
  1298. // len= strlen((const char *)snmp_smart.syscontact);
  1299. // snmp_mib2_set_syscontact(snmp_smart.syscontact, &len, 0);
  1300. //
  1301. // len= strlen((const char *)snmp_smart.sysname);
  1302. // snmp_mib2_set_sysname(snmp_smart.sysname, &len, 0);
  1303. //
  1304. // len= strlen((const char *)snmp_smart.syslocation);
  1305. // snmp_mib2_set_syslocation(snmp_smart.syslocation, &len, 0);
  1306. //
  1307. // snmp_set_device_enterprise_oid(&snmp_smart.device_enterprose_oid);
  1308. // pthread_mutex_init(&snmp_smart.mutex,NULL);
  1309. // pthread_cond_init(&snmp_smart.cond,NULL);
  1310. //
  1311. snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED);
  1312. snmp_strap_set();
  1313. snmp_set_mibs(&dev_mibs[0], LWIP_ARRAYSIZE(dev_mibs));
  1314. snmp_set_community("public");
  1315. if(strncmp(para->snmp.publics,"public",strlen("public")))
  1316. {
  1317. snmp_set_community_write("public");
  1318. }else
  1319. {
  1320. snmp_set_community_write("private");
  1321. }
  1322. //snmp_send_trap_specific();
  1323. // pthread_create(&snmp_smart.id,NULL,snmp_thread,NULL);
  1324. //pthread_detach(snmp_smart.id);
  1325. }
  1326. int snmp2_init(void)
  1327. {
  1328. mibs_init();
  1329. snmp_init();
  1330. return 0;
  1331. }
  1332. void snmp_strap_set(void)
  1333. {
  1334. paras_data_t* para=paras_get();
  1335. if(para->snmp.trapmode == 1)
  1336. {
  1337. ip_addr_t ip_addr={0};
  1338. if(ipaddr_aton(para->snmp.nms_ip,&ip_addr))
  1339. {
  1340. snmp_trap_dst_enable(0, 1);
  1341. snmp_trap_dst_ip_set(0, &ip_addr);
  1342. }else
  1343. {
  1344. LOG_E("snmp trap ip error!!!!\n");
  1345. snmp_trap_dst_enable(0, 0);
  1346. }
  1347. }else
  1348. {
  1349. snmp_trap_dst_enable(0, 0);
  1350. }
  1351. }
  1352. int snmp2_deinit(void)
  1353. {
  1354. return 0;
  1355. }