snmp.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298
  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. power_handle_new_t *all = power_get_all();
  56. paras_data_t *p=paras_get();
  57. switch(node->oid)
  58. {
  59. case 1:
  60. {
  61. sprintf(buff,"GCG-GD32F427-%d",p->cas.addr);
  62. }
  63. break;
  64. case 2:
  65. {
  66. sprintf(buff,"%s",p->prod.name);
  67. }
  68. break;
  69. case 3:
  70. {
  71. sprintf(buff,"%s",(p->prod.type == 0) ? "AC-AC" :
  72. (p->prod.type == 1) ? "DC-DC" :
  73. (p->prod.type == 3) ? "AC3-AC3" :
  74. ((p->prod.type == 4) || (p->prod.type == 5)) ? "AC3-AC1" :
  75. (p->prod.type == 6) ? "AC3-AC2" : "Other");
  76. }
  77. break;
  78. case 4:
  79. {
  80. sprintf(buff,"%s",p->prod.pnumber);
  81. }
  82. break;
  83. case 5:
  84. {
  85. sprintf(buff,"%d",all->chs);
  86. }
  87. break;
  88. case 6:
  89. {
  90. sprintf(buff,"%d",3);
  91. }
  92. break;
  93. default:
  94. {
  95. LOGE("sysinfo_get_value(): unknown id: %d\n", node->oid);
  96. return 0;
  97. }
  98. }
  99. var_len = strlen(buff);
  100. memcpy(value, buff, var_len);
  101. return var_len;
  102. }
  103. static s16_t total_get_value(const struct snmp_scalar_array_node_def *node, void *value)
  104. {
  105. char *var = NULL;
  106. s16_t var_len;
  107. char buff[100]= {0};
  108. power_handle_new_t *all = power_get_all();
  109. uint8_t id = 0;
  110. switch(node->oid)
  111. {
  112. case SCALAR_VOLTAGE:
  113. {
  114. sprintf(buff,"%.2f",all->total.all.voltage);
  115. }
  116. break;
  117. case SCALAR_CURRENT:
  118. {
  119. sprintf(buff,"%.2f",all->total.all.current);
  120. }
  121. break;
  122. case SCALAR_CONSUMEPTION:
  123. {
  124. sprintf(buff,"%.2f",all->total.all.consump);
  125. }
  126. break;
  127. case SCALAR_POWER_FACTOR:
  128. {
  129. sprintf(buff,"%.2f",all->total.all.factor);
  130. }
  131. break;
  132. case SCALAR_PACTIVE_POWER:
  133. {
  134. sprintf(buff,"%.2f",all->total.all.power);
  135. }
  136. break;
  137. case SCALAR_REACTIVE_POWER:
  138. {
  139. sprintf(buff,"%.2f",all->total.all.reactive_power);
  140. }
  141. break;
  142. case SCALAR_APPARENT_POWER:
  143. {
  144. sprintf(buff,"%.2f",all->total.all.app_power);
  145. }
  146. break;
  147. default:
  148. return 0;
  149. }
  150. var_len = strlen(buff);
  151. memcpy(value, buff, var_len);
  152. return var_len;
  153. }
  154. #define POWER_VALUE 4
  155. typedef struct power_data{
  156. uint8_t id;
  157. char * name;
  158. uint8_t status;
  159. float v;
  160. float i;
  161. float f;
  162. float c;
  163. float fa;
  164. float p;
  165. float r_p;
  166. float a_p;
  167. }p_data_t;
  168. typedef struct alarm_data{
  169. uint8_t id;
  170. uint8_t type;
  171. char * alarm_info;
  172. uint8_t alarm_action;
  173. uint32_t alarm_action_para;
  174. char * date;
  175. char * time;
  176. }p_alarm_t;
  177. typedef struct threshold_data{
  178. uint8_t id;
  179. char *name;
  180. float v_max;
  181. float v_min;
  182. float i_max;
  183. float p_max;
  184. float c_max;
  185. }thr_d_t;
  186. typedef struct thr_sensor_data{
  187. uint8_t id;
  188. char *name;
  189. uint32_t val1_up;
  190. uint32_t val2_up;
  191. uint32_t val1_down;
  192. uint32_t val2_down;
  193. }thr_s_t;
  194. static struct snmp_oid_range th_table_oid_ranges[] = {
  195. {1, POWER_VALUE},
  196. };
  197. static struct snmp_oid_range th_sensor_oid_ranges[] = {
  198. {1,MAX_SENSOR},
  199. };
  200. static s16_t thr_s_get_info(struct snmp_node_instance *instance, void *value)
  201. {
  202. u32_t row = instance->reference.u32;
  203. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  204. sensor_all_t *sensor = sensor_get_data();
  205. char buff[50]= {0};
  206. if(!sensor)
  207. return 0;
  208. switch(col)
  209. {
  210. case COLUMN_PDUSENSORID:
  211. {
  212. *(s32_t *)value = row;
  213. return 4;
  214. }
  215. case COLUMN_PDUSENSORNAME:
  216. {
  217. sprintf(buff,"%s",sensor->data[row-1].info.name);
  218. }
  219. break;
  220. case COLUMN_PDUSENSORTYPE:
  221. {
  222. sprintf(buff,"%d",sensor->data[row-1].info.type);
  223. }
  224. break;
  225. case COLUMN_PDUSENSORDATACHENNEL:
  226. {
  227. sprintf(buff,"%d",sensor->data[row-1].info.num_val);
  228. }
  229. break;
  230. case COLUMN_PDUSENSORMODBUSADDRESS:
  231. {
  232. //sprintf(buff,"%d",sensor->data[row-1].info.addr);
  233. *(s32_t *)value = sensor->data[row-1].info.addr;
  234. return 4;
  235. }
  236. break;
  237. case COLUMN_PDUSENSORSTATUS:
  238. {
  239. //sprintf(buff,"%d",sensor->data[row-1].info.status);
  240. *(s32_t *)value = sensor->data[row-1].info.status;
  241. return 4;
  242. }
  243. break;
  244. case COLUMN_PDUSENSORVALUENUM:
  245. {
  246. //sprintf(buff,"%d",sensor->data[row-1].info.num_val);
  247. *(s32_t *)value = sensor->data[row-1].info.num_val;
  248. return 4;
  249. }
  250. break;
  251. case COLUMN_PDUSENSORVALUE1:
  252. {
  253. sprintf(buff,"%.2f",sensor->data[row-1].val[0].value);
  254. }
  255. break;
  256. case COLUMN_PDUSENSORVALUE2:
  257. {
  258. sprintf(buff,"%.2f",sensor->data[row-1].val[1].value);
  259. }
  260. break;
  261. default:
  262. break;
  263. }
  264. memcpy(value,buff,strlen(buff));
  265. return strlen(buff);
  266. }
  267. static snmp_err_t thr_s_set_value(struct snmp_node_instance *instance,u16_t len, void *value)
  268. {
  269. u32_t row = instance->reference.u32;
  270. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  271. sensor_all_t * sensor = sensor_get_data();
  272. paras_data_t *p=paras_get();
  273. uint32_t val = *(uint32_t *)value;
  274. if(sensor->data == 0)
  275. {
  276. return SNMP_ERR_NOTWRITABLE;
  277. }
  278. switch(col)
  279. {
  280. case COLUMN_PDUSENSORLIMITVALUE1UP:
  281. {
  282. sensor->data[row-1].val[0].thr.max = (val/100.0);
  283. p->sensor.sens[row-1].th_max_1 = val;
  284. if(val)
  285. {
  286. sensor->data[row-1].val[0].thr.en.th_sen_max_en = 1;
  287. }else
  288. {
  289. sensor->data[row-1].val[0].thr.en.th_sen_max_en = 0;
  290. }
  291. }
  292. break;
  293. case COLUMN_PDUSENSORLIMITVALUE2UP:
  294. {
  295. sensor->data[row-1].val[1].thr.max = (val/100.0);
  296. p->sensor.sens[row-1].th_max_2 = val;
  297. if(val)
  298. {
  299. sensor->data[row-1].val[1].thr.en.th_sen_max_en = 1;
  300. }else
  301. {
  302. sensor->data[row-1].val[1].thr.en.th_sen_max_en = 0;
  303. }
  304. }
  305. break;
  306. case COLUMN_PDUSENSORLIMITVALUE1DOWN:
  307. {
  308. sensor->data[row-1].val[0].thr.min = (val/100.0);
  309. p->sensor.sens[row-1].th_min_1 = val;
  310. if(val)
  311. {
  312. sensor->data[row-1].val[0].thr.en.th_sen_min_en = 1;
  313. }else
  314. {
  315. sensor->data[row-1].val[0].thr.en.th_sen_min_en = 0;
  316. }
  317. }
  318. break;
  319. case COLUMN_PDUSENSORLIMITVALUE2DOWN:
  320. {
  321. sensor->data[row-1].val[1].thr.min = (val/100.0);
  322. p->sensor.sens[row-1].th_min_2 = val;
  323. if(val)
  324. {
  325. sensor->data[row-1].val[1].thr.en.th_sen_min_en = 1;
  326. }else
  327. {
  328. sensor->data[row-1].val[1].thr.en.th_sen_min_en = 0;
  329. }
  330. }
  331. break;
  332. default:
  333. return SNMP_ERR_NOTWRITABLE;
  334. }
  335. paras_save();
  336. return SNMP_ERR_NOERROR;
  337. }
  338. static s16_t thr_s_get_value(struct snmp_node_instance *instance, void *value)
  339. {
  340. u32_t row = instance->reference.u32;
  341. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  342. sensor_all_t *sensor = sensor_get_data();
  343. char buff[50]= {0};
  344. switch(col)
  345. {
  346. case COLUMN_PDUSENSORLIMITID:
  347. {
  348. *(s32_t *)value = row;
  349. return 4;
  350. }
  351. break;
  352. case COLUMN_PDUSENSORLIMITNAME:
  353. {
  354. sprintf(buff,"%s",sensor->data[row-1].info.name);
  355. }
  356. break;
  357. case COLUMN_PDUSENSORLIMITVALUE1UP:
  358. {
  359. *(s32_t *)value = (sensor->data[row-1].val[0].thr.max * 100);
  360. return 4;
  361. }
  362. break;
  363. case COLUMN_PDUSENSORLIMITVALUE2UP:
  364. {
  365. *(s32_t *)value = (sensor->data[row-1].val[1].thr.max * 100);
  366. return 4;
  367. }
  368. break;
  369. case COLUMN_PDUSENSORLIMITVALUE1DOWN:
  370. {
  371. *(s32_t *)value = (sensor->data[row-1].val[0].thr.min * 100);
  372. return 4;
  373. }
  374. break;
  375. case COLUMN_PDUSENSORLIMITVALUE2DOWN:
  376. {
  377. *(s32_t *)value = (sensor->data[row-1].val[1].thr.min * 100);
  378. return 4;
  379. }
  380. break;
  381. default:
  382. return 0;
  383. }
  384. memcpy(value,buff,strlen(buff));
  385. return strlen(buff);
  386. }
  387. static s16_t thr_get_value(struct snmp_node_instance *instance, void *value)
  388. {
  389. power_handle_new_t *all = power_get_all();
  390. u32_t row = instance->reference.u32;
  391. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  392. char buff[50]= {0};
  393. switch (col)
  394. {
  395. case COLUMN_PDUCHANNELLIMITID:
  396. {
  397. *(s32_t *)value = row-1;
  398. return 4;
  399. }
  400. break;
  401. case COLUMN_PDUCHANNELLIMITNAME:
  402. {
  403. sprintf(buff,"%s",all->pch[row-1].info.name);
  404. }
  405. break;
  406. case COLUMN_PDUCHANNELCURRENTLIMITUP:
  407. {
  408. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.c_upper));
  409. }
  410. break;
  411. case COLUMN_PDUCHANNELVOLTAGELIMITUP:
  412. {
  413. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.v_upper));
  414. }
  415. break;
  416. case COLUMN_PDUCHANNELVOLTAGELIMITDOWN:
  417. {
  418. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.v_lower));
  419. }
  420. break;
  421. case COLUMN_PDUCHANNELPOWERLIMITUP:
  422. {
  423. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.p_upper));
  424. }
  425. break;
  426. case COLUMN_PDUCHANNELCONSUMPTIONLIMITUP:
  427. {
  428. sprintf(buff,"%.2f",((float)all->pch[row-1].thr.w_upper));
  429. }
  430. break;
  431. default:
  432. return 0;
  433. }
  434. memcpy(value,buff,strlen(buff));
  435. return strlen(buff);
  436. }
  437. static s16_t alarm_get_value(struct snmp_node_instance *instance, void *value)
  438. {
  439. u32_t row = instance->reference.u32;
  440. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  441. waning_info_t *info = {0};
  442. info = waning_get_info(row-1);
  443. char buff[50]= {0};
  444. switch (col)
  445. {
  446. case COLUMN_PDUALARMID:
  447. {
  448. *(s32_t *)value = row-1;
  449. return 4;
  450. }
  451. break;
  452. case COLUMN_PDUALARMTYPE:
  453. {
  454. *(s32_t *)value = info->type;
  455. return 4;
  456. }
  457. break;
  458. case COLUMN_PDUALARMCONTEXT:
  459. {
  460. sprintf(buff,"%s",info->waning_context);
  461. }
  462. break;
  463. case COLUMN_PDUALARMACTION:
  464. {
  465. *(s32_t *)value = 0;
  466. return 4;
  467. }
  468. break;
  469. case COLUMN_PDUALARMACTIONPARA:
  470. {
  471. *(s32_t *)value = 0;
  472. return 4;
  473. }
  474. break;
  475. case COLUMN_PDUALARMDATE:
  476. {
  477. snprintf(buff,10,"%s",info->date);
  478. }
  479. break;
  480. case COLUMN_PDUALARMTIME:
  481. {
  482. char * _info = &(info->date[11]);
  483. snprintf(buff,8,"%s",_info);
  484. }
  485. break;
  486. default:
  487. return 0;
  488. }
  489. memcpy(value,buff,strlen(buff));
  490. return strlen(buff);
  491. }
  492. 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)
  493. {
  494. power_handle_new_t *all = power_get_all();
  495. th_table_oid_ranges[0].max = all->chs;
  496. if (!snmp_oid_in_range(row_oid, row_oid_len, th_table_oid_ranges, LWIP_ARRAYSIZE(th_table_oid_ranges)))
  497. return SNMP_ERR_NOSUCHINSTANCE;
  498. cell_instance->reference.u32 = row_oid[0];
  499. return SNMP_ERR_NOERROR;
  500. }
  501. 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)
  502. {
  503. if (!snmp_oid_in_range(row_oid, row_oid_len, th_table_oid_ranges, LWIP_ARRAYSIZE(th_table_oid_ranges)))
  504. return SNMP_ERR_NOSUCHINSTANCE;
  505. cell_instance->reference.u32 = row_oid[0];
  506. return SNMP_ERR_NOERROR;
  507. }
  508. 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)
  509. {
  510. if (!snmp_oid_in_range(row_oid, row_oid_len, th_sensor_oid_ranges, LWIP_ARRAYSIZE(th_sensor_oid_ranges)))
  511. return SNMP_ERR_NOSUCHINSTANCE;
  512. cell_instance->reference.u32 = row_oid[0];
  513. return SNMP_ERR_NOERROR;
  514. }
  515. static snmp_err_t get_sensor_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
  516. {
  517. u8_t i = 0;
  518. struct snmp_next_oid_state state;
  519. u32_t next_oid = 0;
  520. snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
  521. for (i = 0; i < th_sensor_oid_ranges[0].max; i++)
  522. {
  523. u32_t test_oid = i + 1;
  524. snmp_next_oid_check(&state, &test_oid, 1, NULL);
  525. }
  526. if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
  527. {
  528. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  529. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  530. return SNMP_ERR_NOERROR;
  531. }
  532. return SNMP_ERR_NOSUCHINSTANCE;
  533. }
  534. static uint8_t ph_cont = 0;
  535. static snmp_err_t power_get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
  536. {
  537. u8_t i = 0;
  538. struct snmp_next_oid_state state;
  539. u32_t next_oid = 0;
  540. snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
  541. //power_data_get(&snmp_smart.all);
  542. power_handle_new_t *all = power_get_all();
  543. for (i = 0; i < all->chs; i++)
  544. {
  545. u32_t test_oid = i + 1;
  546. snmp_next_oid_check(&state, &test_oid, 1, NULL);
  547. }
  548. if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
  549. {
  550. #if 0
  551. if(all->ttl.type == PDU_AC_I3O3)
  552. {
  553. if(ph_cont==3)
  554. {
  555. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  556. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  557. cell_instance->reference.u32++;
  558. ph_cont=0;
  559. }
  560. }else if(all->ttl.type == PDU_AC_I3O2)
  561. {
  562. if(ph_cont == 2)
  563. {
  564. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  565. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  566. cell_instance->reference.u32++;
  567. ph_cont=0;
  568. }
  569. }else
  570. #endif
  571. {
  572. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  573. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  574. //cell_instance->reference.u32++;
  575. }
  576. return SNMP_ERR_NOERROR;
  577. }
  578. return SNMP_ERR_NOSUCHINSTANCE;
  579. }
  580. static snmp_err_t get_next_instance(const u32_t *column, struct snmp_obj_id *row_oid, struct snmp_node_instance *cell_instance)
  581. {
  582. u8_t i = 0;
  583. struct snmp_next_oid_state state;
  584. u32_t next_oid = 0;
  585. wanning_get_count();
  586. snmp_next_oid_init(&state, row_oid->id, row_oid->len, &next_oid, 1);
  587. //power_all_t *all = power_get_all();
  588. //power_data_get(&snmp_smart.all);
  589. for (i = 0; i < wanning_get_count(); i++)
  590. {
  591. u32_t test_oid = i + 1;
  592. snmp_next_oid_check(&state, &test_oid, 1, NULL);
  593. }
  594. if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS)
  595. {
  596. snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);
  597. cell_instance->reference.u32 = *state.next_oid; /* 下个节点行OID */
  598. return SNMP_ERR_NOERROR;
  599. }
  600. return SNMP_ERR_NOSUCHINSTANCE;
  601. }
  602. static s16_t alarm_power_get(struct snmp_node_instance *instance, void *value)
  603. {
  604. power_handle_new_t *all = power_get_all();
  605. u32_t row = instance->reference.u32;
  606. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  607. switch (col)
  608. {
  609. case COLUMN_PDUCHANNELPOWERALARMID:
  610. {
  611. *(s32_t *)value = row-1;
  612. }
  613. break;
  614. case COLUMN_PDUCHANNELPOWERALARMVOLTAGEUP:
  615. {
  616. *(s32_t *)value = all->pch[row-1].info.alarm.l1_v_upper;
  617. }
  618. break;
  619. case COLUMN_PDUCHANNELPOWERALARMVOLTAGEDOWN:
  620. {
  621. *(s32_t *)value = all->pch[row-1].info.alarm.l1_v_lower;
  622. }
  623. break;
  624. case COLUMN_PDUCHANNELPOWERALARMCURRENTUP:
  625. {
  626. *(s32_t *)value = all->pch[row-1].info.alarm.l1_c_upper;
  627. }
  628. break;
  629. case COLUMN_PDUCHANNELPOWERALARMPOWERUP:
  630. {
  631. *(s32_t *)value = all->pch[row-1].info.alarm.l1_p_upper;
  632. }
  633. break;
  634. case COLUMN_PDUCHANNELPOWERALARMCONSUMPTIONUP:
  635. {
  636. *(s32_t *)value = all->pch[row-1].info.alarm.l1_w_upper;
  637. }
  638. break;
  639. default:
  640. return 0;
  641. }
  642. return 4;
  643. }
  644. static s16_t alarm_sensor_get(struct snmp_node_instance *instance, void *value)
  645. {
  646. sensor_all_t *sensor = sensor_get_data();
  647. u32_t row = instance->reference.u32;
  648. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  649. switch (col)
  650. {
  651. case COLUMN_PDUSENSORALARMID:
  652. {
  653. *(s32_t *)value = row-1;
  654. }
  655. break;
  656. case COLUMN_PDUSENSORALARMVALUE1UP:
  657. {
  658. *(s32_t *)value = sensor->data[row-1].val[0].s_alarm.max_up;
  659. }
  660. break;
  661. case COLUMN_PDUSENSORALARMVALUE1DOWN:
  662. {
  663. *(s32_t *)value = sensor->data[row-1].val[0].s_alarm.min_down;
  664. }
  665. break;
  666. case COLUMN_PDUSENSORALARMVALUE2UP:
  667. {
  668. *(s32_t *)value = sensor->data[row-1].val[1].s_alarm.max_up;
  669. }
  670. break;
  671. case COLUMN_PDUSENSORALARMVALUE2DOWN:
  672. {
  673. *(s32_t *)value = sensor->data[row-1].val[0].s_alarm.min_down;
  674. }
  675. break;
  676. default:
  677. return 0;
  678. }
  679. return 4;
  680. }
  681. static s16_t power_get_value(struct snmp_node_instance *instance, void *value)
  682. {
  683. power_handle_new_t *all = power_get_all();
  684. u32_t row = instance->reference.u32;
  685. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  686. char buff[100]= {0};
  687. uint8_t id = 0;
  688. if( all->power_type == PDU_AC_I3O1 || all->power_type == PDU_AC_I3O1_H)
  689. {
  690. id = all->pch[row-1].info.pse.ph -1;
  691. }else if(all->power_type == PDU_AC_I3O2)
  692. {
  693. id = all->pch[row-1].info.pse.ph2.ph_l - 1;
  694. }
  695. switch (col)
  696. {
  697. case COLUMN_PDUCHANNELID:
  698. {
  699. *(s32_t *)value = row-1;
  700. return 4;
  701. }
  702. break;
  703. case COLUMN_PDUCHANNELNAME:
  704. {
  705. sprintf(buff,"%s",all->pch[row-1].info.name);
  706. }
  707. break;
  708. case COLUMN_PDUCHANNELSTATUS:
  709. {
  710. //sprintf(buff,"%d",p_data[row].status);
  711. //*(s32_t *)value = p_data[row-1].status;
  712. *(s32_t *)value = all->pch[row-1].info.status;
  713. return 4;
  714. }
  715. break;
  716. case COLUMN_PDUCHANNELVOLTAGE:
  717. {
  718. sprintf(buff,"%.2f",(float)all->pch[row-1].power[id].voltage);
  719. }
  720. break;
  721. case COLUMN_PDUCHANNELCURRENT:
  722. {
  723. sprintf(buff,"%.2f",((float)all->pch[row-1].power[id].current));
  724. }
  725. break;
  726. case COLUMN_PDUCHANNELFREQUENCY:
  727. {
  728. sprintf(buff,"%.2f",((float)all->pch[row-1].power[id].freq));
  729. }
  730. break;
  731. case COLUMN_PDUCHANNELCONSUMPTION:
  732. {
  733. sprintf(buff,"%.2f",((float)all->pch[row-1].power[id].consump));
  734. }
  735. break;
  736. case COLUMN_PDUCHANNELPOWERFACTOR:
  737. {
  738. sprintf(buff,"%.2f",((float)all->pch[row-1].power[id].factor));
  739. }
  740. break;
  741. case COLUMN_PDUCHANNELPACTIVEPOWER:
  742. {
  743. sprintf(buff,"%.2f",((float)all->pch[row-1].power[id].power));
  744. }
  745. break;
  746. case COLUMN_PDUCHANNELREACTIVEPOWER:
  747. {
  748. sprintf(buff,"%.2f",((float)all->pch[row-1].power[id].reactive_power));
  749. }
  750. break;
  751. case COLUMN_PDUCHANNELAPPARENTPOWER:
  752. {
  753. sprintf(buff,"%.2f",((float)all->pch[row-1].power[id].app_power));
  754. }
  755. break;
  756. default:
  757. return 0;
  758. }
  759. memcpy(value,buff,strlen(buff));
  760. return strlen(buff);
  761. }
  762. static snmp_err_t set_test(struct snmp_node_instance *instance, u16_t len, void *value)
  763. {
  764. LOGD("write test\n");
  765. return SNMP_ERR_NOERROR;
  766. }
  767. static snmp_err_t power_set_value (struct snmp_node_instance *instance, u16_t len, void *value)
  768. {
  769. power_handle_new_t *all = power_get_all();
  770. u32_t row = instance->reference.u32;
  771. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  772. if(row == 0)
  773. return SNMP_ERR_NOERROR;
  774. int ch = row -1;
  775. power_ch_new_t *pch = &all->pch[ch];
  776. switch(col)
  777. {
  778. case COLUMN_PDUCHANNELSTATUS:
  779. {
  780. uint32_t val = *(uint32_t*)value;
  781. all->set_status(pch->info.addr,pch->info.sch,val);
  782. }
  783. break;
  784. default:
  785. return SNMP_ERR_NOTWRITABLE;
  786. }
  787. return SNMP_ERR_NOERROR;
  788. }
  789. static snmp_err_t thr_set_value(struct snmp_node_instance *instance,u16_t len, void *value)
  790. {
  791. u32_t row = instance->reference.u32;
  792. u32_t col = SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id);
  793. if(row == 0)
  794. return SNMP_ERR_NOERROR;
  795. power_handle_new_t *all = power_get_all();
  796. thr_t th = all->pch[row-1].thr;
  797. switch(col)
  798. {
  799. case COLUMN_PDUCHANNELCURRENTLIMITUP:
  800. {
  801. th.c_upper = (float)atof((char *)value);
  802. }
  803. break;
  804. case COLUMN_PDUCHANNELVOLTAGELIMITUP:
  805. {
  806. th.v_upper = (float)atof((char *)value);
  807. }
  808. break;
  809. case COLUMN_PDUCHANNELVOLTAGELIMITDOWN:
  810. {
  811. th.v_lower = (float)atof((char *)value);
  812. }
  813. break;
  814. case COLUMN_PDUCHANNELPOWERLIMITUP:
  815. {
  816. th.p_upper = (float)atof((char *)value);
  817. }
  818. break;
  819. case COLUMN_PDUCHANNELCONSUMPTIONLIMITUP:
  820. {
  821. th.w_upper = (float)atof((char *)value);
  822. }
  823. break;
  824. default:
  825. return SNMP_ERR_INCONSISTENTNAME;
  826. }
  827. all->set_thr(all->pch[row-1].info.addr,all->pch[row-1].info.sch,&th);
  828. return SNMP_ERR_NOERROR;
  829. }
  830. static const struct snmp_scalar_array_node_def sysinfo_scalars_nodes[] = {
  831. {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product id */
  832. {2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product name */
  833. {3, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product type */
  834. {4, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product firmware */
  835. {5, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product channal number */
  836. {6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY}, /* product sensor number */
  837. {0,0,0},
  838. };
  839. static const struct snmp_table_col_def power_table_channels[]={
  840. {COLUMN_PDUCHANNELID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  841. {COLUMN_PDUCHANNELNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  842. {COLUMN_PDUCHANNELSTATUS, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE},
  843. {COLUMN_PDUCHANNELVOLTAGE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  844. {COLUMN_PDUCHANNELCURRENT, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  845. {COLUMN_PDUCHANNELFREQUENCY, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  846. {COLUMN_PDUCHANNELCONSUMPTION, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  847. {COLUMN_PDUCHANNELPOWERFACTOR, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  848. {COLUMN_PDUCHANNELPACTIVEPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  849. {COLUMN_PDUCHANNELREACTIVEPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  850. {COLUMN_PDUCHANNELAPPARENTPOWER, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  851. {0,0,0},
  852. };
  853. static const struct snmp_table_col_def alarm_history_table[]={
  854. {COLUMN_PDUALARMID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  855. {COLUMN_PDUALARMTYPE, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  856. {COLUMN_PDUALARMCONTEXT, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  857. {COLUMN_PDUALARMACTION, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  858. {COLUMN_PDUALARMACTIONPARA, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  859. {COLUMN_PDUALARMDATE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  860. {COLUMN_PDUALARMTIME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  861. {0,0,0},
  862. };
  863. static const struct snmp_table_col_def alarm_power_table[]={
  864. {COLUMN_PDUCHANNELPOWERALARMID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  865. {COLUMN_PDUCHANNELPOWERALARMVOLTAGEUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  866. {COLUMN_PDUCHANNELPOWERALARMVOLTAGEDOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  867. {COLUMN_PDUCHANNELPOWERALARMCURRENTUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  868. {COLUMN_PDUALARMACTIONPARA, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  869. {COLUMN_PDUCHANNELPOWERALARMPOWERUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  870. {COLUMN_PDUCHANNELPOWERALARMCONSUMPTIONUP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  871. {0,0,0},
  872. };
  873. static const struct snmp_table_col_def alarm_sensor_table[]={
  874. {COLUMN_PDUSENSORALARMID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  875. {COLUMN_PDUSENSORALARMVALUE1UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  876. {COLUMN_PDUSENSORALARMVALUE1DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  877. {COLUMN_PDUSENSORALARMVALUE2UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  878. {COLUMN_PDUSENSORALARMVALUE2DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  879. {0,0,0},
  880. };
  881. static const struct snmp_table_col_def threshold_limit_table[] = {
  882. {COLUMN_PDUCHANNELLIMITID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  883. {COLUMN_PDUCHANNELLIMITNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  884. {COLUMN_PDUCHANNELCURRENTLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  885. {COLUMN_PDUCHANNELVOLTAGELIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  886. {COLUMN_PDUCHANNELVOLTAGELIMITDOWN, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  887. {COLUMN_PDUCHANNELPOWERLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  888. {COLUMN_PDUCHANNELCONSUMPTIONLIMITUP, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE},
  889. {0,0,0},
  890. };
  891. static const struct snmp_table_col_def sensor_limit_table[] = {
  892. {COLUMN_PDUSENSORLIMITID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY,},
  893. {COLUMN_PDUSENSORLIMITNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY,},
  894. {COLUMN_PDUSENSORLIMITVALUE1UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  895. {COLUMN_PDUSENSORLIMITVALUE2UP, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  896. {COLUMN_PDUSENSORLIMITVALUE1DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  897. {COLUMN_PDUSENSORLIMITVALUE2DOWN, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE,},
  898. {0,0,0},
  899. };
  900. static const struct snmp_table_col_def sensor_info_table[] = {
  901. {COLUMN_PDUSENSORID, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  902. {COLUMN_PDUSENSORNAME, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  903. {COLUMN_PDUSENSORTYPE, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  904. {COLUMN_PDUSENSORDATACHENNEL, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  905. {COLUMN_PDUSENSORMODBUSADDRESS, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  906. {COLUMN_PDUSENSORSTATUS, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  907. {COLUMN_PDUSENSORVALUENUM, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_ONLY},
  908. {COLUMN_PDUSENSORVALUE1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  909. {COLUMN_PDUSENSORVALUE2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},
  910. {0,0,0},
  911. };
  912. const struct snmp_scalar_array_node sysinfo_scalars = SNMP_SCALAR_CREATE_ARRAY_NODE(1, sysinfo_scalars_nodes, sysinfo_get_value, NULL, NULL);
  913. static s16_t get_total_scalar_value(struct snmp_node_instance *instance , void* data)
  914. {
  915. power_handle_new_t *all = power_get_all();
  916. char buff[100] = {0};
  917. switch(instance->node->oid)
  918. {
  919. case SCALAR_VOLTAGE:
  920. sprintf(buff,"%.2f",all->total.all.voltage);
  921. break;
  922. case SCALAR_CURRENT:
  923. sprintf(buff,"%.2f",all->total.all.current);
  924. break;
  925. case SCALAR_CONSUMEPTION:
  926. sprintf(buff,"%.2f",all->total.all.consump);
  927. break;
  928. case SCALAR_POWER_FACTOR:
  929. sprintf(buff,"%.2f",all->total.all.factor);
  930. break;
  931. case SCALAR_PACTIVE_POWER:
  932. sprintf(buff,"%.2f",all->total.all.power);
  933. break;
  934. case SCALAR_REACTIVE_POWER:
  935. sprintf(buff,"%.2f",all->total.all.reactive_power);
  936. break;
  937. case SCALAR_APPARENT_POWER:
  938. sprintf(buff,"%.2f",all->total.all.app_power);
  939. break;
  940. default:
  941. return 0;
  942. }
  943. memcpy(data,buff,strlen(buff));
  944. return strlen(buff);
  945. }
  946. 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);
  947. 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);
  948. 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);
  949. 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);
  950. 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);
  951. 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);
  952. 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);
  953. static const struct snmp_table_node power_table = SNMP_TABLE_CREATE(9, power_table_channels, power_get_instance, power_get_next_instance, \
  954. power_get_value, set_test, power_set_value);
  955. static const struct snmp_table_node alarm_table = SNMP_TABLE_CREATE(1, alarm_history_table, get_instance, get_next_instance, \
  956. alarm_get_value, set_test, NULL);
  957. static const struct snmp_table_node thr_table = SNMP_TABLE_CREATE(6, threshold_limit_table, power_get_instance, power_get_next_instance, \
  958. thr_get_value, set_test, thr_set_value);
  959. static const struct snmp_table_node thr_s_table = SNMP_TABLE_CREATE(1, sensor_limit_table, get_sensor_instance, get_sensor_next_instance, \
  960. thr_s_get_value, set_test, thr_s_set_value);
  961. static const struct snmp_table_node sensor_table = SNMP_TABLE_CREATE(1,sensor_info_table,get_sensor_instance,get_sensor_next_instance,\
  962. thr_s_get_info,set_test,thr_s_set_value);
  963. static const struct snmp_table_node alarm_p_table = SNMP_TABLE_CREATE(2,alarm_power_table,power_get_instance,power_get_next_instance,\
  964. alarm_power_get,NULL,NULL);
  965. static const struct snmp_table_node alarm_s_table = SNMP_TABLE_CREATE(3,alarm_sensor_table,get_sensor_instance,get_sensor_next_instance,\
  966. alarm_sensor_get,NULL,NULL);
  967. static const struct snmp_node *const alarm_subnodes[]={
  968. &alarm_table.node.node,
  969. &alarm_p_table.node.node,
  970. &alarm_s_table.node.node
  971. };
  972. static const struct snmp_node *const power_subnodes[] = {
  973. &power_table.node.node,
  974. &voltage_scalar.node.node,
  975. &current_scalar.node.node,
  976. &consumer_scalar.node.node,
  977. &factor_scalar.node.node,
  978. &pactive_scalar.node.node,
  979. &reactive_scalar.node.node,
  980. &appactive_scalar.node.node,
  981. };
  982. static const struct snmp_node *const thr_subnodes[] = {
  983. &thr_table.node.node,
  984. };
  985. static const struct snmp_node *const thr_s_subnodes[] = {
  986. &thr_s_table.node.node,
  987. };
  988. static const struct snmp_node *const sensor_subnodes[] = {
  989. &sensor_table.node.node,
  990. };
  991. const struct snmp_tree_node power_treenode = SNMP_CREATE_TREE_NODE(3, power_subnodes);
  992. const struct snmp_tree_node alarm_treenode = SNMP_CREATE_TREE_NODE(6, alarm_subnodes);
  993. const struct snmp_tree_node thr_treenode = SNMP_CREATE_TREE_NODE(2, thr_subnodes);
  994. const struct snmp_tree_node thr_s_treenode = SNMP_CREATE_TREE_NODE(3, thr_s_subnodes);
  995. const struct snmp_tree_node sensor_treenode = SNMP_CREATE_TREE_NODE(4, sensor_subnodes);
  996. static const struct snmp_node *const mib2_nodes_dev[] =
  997. {
  998. &sysinfo_scalars.node.node,
  999. &power_treenode.node,
  1000. &alarm_treenode.node,
  1001. &sensor_treenode.node,
  1002. };
  1003. static const struct snmp_node *const mib2_nodes_dev_2[]={
  1004. &thr_treenode.node,
  1005. &thr_s_treenode.node,
  1006. };
  1007. static const struct snmp_tree_node snmp_mib2_root_dev = SNMP_CREATE_TREE_NODE(1, mib2_nodes_dev);
  1008. static const struct snmp_tree_node snmp_mib2_thr_dev = SNMP_CREATE_TREE_NODE(7, mib2_nodes_dev_2);
  1009. static const u32_t prvmib_base_oid[] = SNMP_SMARTPDU_DEVICE_OID;
  1010. static const u32_t thr_base_oid [] = SNMP_SMARTPDU_THR_TABLE_IOD;
  1011. const struct snmp_mib mib2_dev = SNMP_MIB_CREATE(prvmib_base_oid, &snmp_mib2_root_dev.node);
  1012. const struct snmp_mib mib2_th_dev = SNMP_MIB_CREATE(thr_base_oid, &snmp_mib2_thr_dev.node);
  1013. static const struct snmp_mib *dev_mibs[] = {&mib2, &mib2_dev,&mib2_th_dev};
  1014. AlarmTrapinfo data;
  1015. void snmp_alarm_trap(AlarmTrapinfo *data, uint8_t flag)
  1016. {
  1017. struct snmp_varbind vb={0},vb1={0},vb2={0},vb3={0};
  1018. int a= 1,b=2,c=3;
  1019. u32_t oid_1[9] = {1,3,6,1,4,1,2024,2};
  1020. if(flag == 0)
  1021. {
  1022. oid_1[8] = 1;
  1023. }else
  1024. {
  1025. oid_1[8] = 2;
  1026. }
  1027. //const u32_t oid_1[]={1,3,6,1,4,1,2024,2,1};
  1028. const u32_t pduAlarmID_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,2,data->ID};
  1029. const u32_t pduAlarmContext_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,3,data->ID};
  1030. const u32_t pduAlarmDate_oid[] = { 1,3,6,1,4,1,2024,1,6,1,1,6,data->ID};
  1031. snmp_oid_assign(&vb.oid, oid_1, LWIP_ARRAYSIZE(oid_1));
  1032. snmp_oid_assign(&vb1.oid, pduAlarmID_oid, LWIP_ARRAYSIZE(pduAlarmID_oid));
  1033. snmp_oid_assign(&vb2.oid, pduAlarmContext_oid, LWIP_ARRAYSIZE(pduAlarmContext_oid));
  1034. snmp_oid_assign(&vb3.oid, pduAlarmDate_oid, LWIP_ARRAYSIZE(pduAlarmDate_oid));
  1035. vb.type = SNMP_ASN1_TYPE_INTEGER;
  1036. vb.value = (void*)&(data->ID);
  1037. vb.value_len = 4;
  1038. vb1.type = SNMP_ASN1_TYPE_INTEGER;
  1039. vb1.value = (void*)&(data->Alarmid);
  1040. vb1.value_len = 4;
  1041. vb2.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1042. vb2.value = (void*)(&data->AlarmContext);
  1043. vb2.value_len = strlen(data->AlarmContext);
  1044. vb3.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1045. vb3.value = (void*)(&data->AlarmDate);
  1046. vb3.value_len = strlen(data->AlarmDate);
  1047. vb.next = &vb1;
  1048. vb1.next = &vb2;
  1049. vb2.next = &vb3;
  1050. vb3.prev = &vb2;
  1051. vb2.prev = &vb1;
  1052. vb1.prev = &vb;
  1053. snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb);
  1054. //snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb1);
  1055. //snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb2);
  1056. //snmp_send_trap_specific(SNMP_GENTRAP_COLDSTART, &vb3);
  1057. }
  1058. void cmd_snmp_test(int argc, char **argv)
  1059. {
  1060. #if 0
  1061. struct snmp_varbind vb;
  1062. memset(&vb, 0, sizeof(struct snmp_varbind));
  1063. char *str = "trap test";
  1064. static const u32_t oid[] = {1, 3, 6, 1, 4, 1, 5888, 1, 5, 0};
  1065. snmp_oid_assign(&vb.oid, oid, LWIP_ARRAYSIZE(oid));
  1066. vb.type = SNMP_ASN1_TYPE_OCTET_STRING;
  1067. vb.value = (void *)str;
  1068. vb.value_len = strlen(str);
  1069. snmp_send_trap_specific(0, &vb);
  1070. snmp_power_alarm_trap(&data,0);
  1071. #endif
  1072. // snmp_send_trap_generic(SNMP_GENTRAP_COLDSTART);
  1073. }
  1074. MSH_CMD_EXPORT_ALIAS(cmd_snmp_test, snmp, snmp agent test);
  1075. void netif_event_callback(struct netif *netif) {
  1076. }
  1077. static char read_only[32] = {0};
  1078. static char read_write[32] = {0};
  1079. static void mibs_init(void) {
  1080. paras_data_t *para = paras_get();
  1081. snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED);
  1082. snmp_strap_set();
  1083. snmp_set_mibs(&dev_mibs[0], LWIP_ARRAYSIZE(dev_mibs));
  1084. snmp_set_community(para->snmp.publics); //only read
  1085. snmp_set_community_write(para->snmp.privates); //read write
  1086. }
  1087. int snmp2_init(void)
  1088. {
  1089. mibs_init();
  1090. snmp_init();
  1091. return 0;
  1092. }
  1093. void snmp_strap_set(void)
  1094. {
  1095. paras_data_t* para=paras_get();
  1096. if(para->snmp.trapmode == 1)
  1097. {
  1098. ip_addr_t ip_addr={0};
  1099. if(ipaddr_aton(para->snmp.nms_ip,&ip_addr))
  1100. {
  1101. snmp_trap_dst_enable(0, 1);
  1102. snmp_trap_dst_ip_set(0, &ip_addr);
  1103. }else
  1104. {
  1105. LOG_E("snmp trap ip error!!!!\n");
  1106. snmp_trap_dst_enable(0, 0);
  1107. }
  1108. }else
  1109. {
  1110. snmp_trap_dst_enable(0, 0);
  1111. }
  1112. }
  1113. int snmp2_deinit(void)
  1114. {
  1115. return 0;
  1116. }