web.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. #include "web.h"
  2. #include "mongoose.h"
  3. #include "thread.h"
  4. #include "list.h"
  5. #include "sys/time.h"
  6. #include "power.h"
  7. #include "paras.h"
  8. #include "sensor.h"
  9. #include "breaker.h"
  10. #include "cascade.h"
  11. #include "cfg.h"
  12. #include "lcd.h"
  13. #include <stdio.h>
  14. #include "datadef.h"
  15. #include "cascade.h"
  16. #include "snmp.h"
  17. #include "net.h"
  18. #include "cfg.h"
  19. #include "lcd.h"
  20. #include "wanning.h"
  21. #include "time.h"
  22. #define TIMER_INTERVAL 1000
  23. #define ONCE_SEND_CNT 13
  24. #define USE_MG716
  25. typedef struct mg_mgr mg_mgr_t;
  26. #ifdef USE_MG716
  27. typedef struct mg_tls_opts mg_tls_t;
  28. #endif
  29. typedef struct {
  30. pthread_t tid;
  31. mg_mgr_t mgr;
  32. #ifdef USE_MG716
  33. mg_tls_t tls;
  34. #else
  35. mg_opts_t opts;
  36. #endif
  37. handle_t list;
  38. char rootDir[MG_PATH_MAX];
  39. char *buf;
  40. int buflen;
  41. uint8_t cur_addr;
  42. }web_handle_t;
  43. typedef struct mg_connection mg_conn_t;
  44. #ifdef USE_MG716
  45. static void timer_fn(void *arg)
  46. {
  47. int r;
  48. web_handle_t *h=(web_handle_t*)arg;
  49. list_node_t *ln=NULL;
  50. mg_conn_t* c;
  51. r = list_take_node(h->list, &ln, 0);
  52. if(r==0) {
  53. node_t *n=&ln->data;
  54. for (c = h->mgr.conns; c != NULL; c = c->next) {
  55. //ws_send_pkt(h, c, n->tp, n->buf, n->dlen, 1);
  56. }
  57. list_back_node(h->list, ln);
  58. }
  59. }
  60. #else
  61. typedef struct mg_serve_http_opts mg_opts_t;
  62. #define MG_PATH_MAX 128
  63. static void set_timer(struct mg_connection *c, int ms)
  64. {
  65. mg_set_timer(c, mg_time()+ms/1000.0f);
  66. }
  67. #endif
  68. typedef struct {
  69. struct mg_connection *c;
  70. int ev;
  71. void *ev_data;
  72. }mg_stream_t;
  73. static web_handle_t webHandle={0};
  74. static int is_ws(mg_conn_t *c)
  75. {
  76. int r=0;
  77. #ifdef USE_MG716
  78. r = c->is_websocket?1:0;
  79. #else
  80. r = (c->flags & MG_F_IS_WEBSOCKET)?1:0;
  81. #endif
  82. return r;
  83. }
  84. static int ws_send(mg_conn_t *c, void *data, int len, int isbin)
  85. {
  86. if(!c || !data || len<=0) {
  87. return -1;
  88. }
  89. //LOGD("____ws_send, len: %d\n", len);
  90. #ifdef USE_MG716
  91. mg_ws_send(c, data, len, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
  92. #else
  93. mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, data, len);
  94. #endif
  95. return 0;
  96. }
  97. static void send_sys(web_handle_t *h, mg_conn_t *c)
  98. {
  99. time_t t=time(NULL);
  100. struct tm *tm=localtime(&t);
  101. paras_data_t* para=paras_get();
  102. pkt_hdr_t *hdr=NULL;
  103. hdr = (pkt_hdr_t*)h->buf;
  104. hdr->magic = PKT_MAGIC;
  105. hdr->addr = 0;
  106. hdr->type = NEW_PKT_TYPE_DEVICE_INFO;
  107. hdr->nack = 0;
  108. hdr->subtype = 0;
  109. web_device_info_t *data_info = (web_device_info_t *)(&hdr->data);
  110. memset(data_info,0,sizeof(web_device_info_t));
  111. sprintf(data_info->date,"%04d%/%02d/%02d",(tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday);
  112. sprintf(data_info->time,"%02d%:%02d:%02d",tm->tm_hour, tm->tm_min, tm->tm_sec);
  113. data_info->zone = (rt_tz_get()/3600);
  114. strcpy(data_info->soft_version,VERSION);
  115. strcpy(data_info->hard_version,VERSION);
  116. data_info->chs = power_get_all()->chs;
  117. data_info->board_cnt = power_data_get_board_cnt();
  118. data_info->power_type = para->prod.type;
  119. hdr->dlen = sizeof(web_device_info_t);
  120. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  121. ws_send(c, h->buf, xlen, 1);
  122. }
  123. static void reboot_sys(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  124. {
  125. system("reboot");
  126. }
  127. static void send_sensor_info(web_handle_t *h, mg_conn_t *c)
  128. {
  129. pkt_hdr_t *hdr=NULL;
  130. hdr = (pkt_hdr_t*)h->buf;
  131. hdr->magic = PKT_MAGIC;
  132. hdr->addr = 0;
  133. hdr->type = NEW_PKT_TYPE_SENSOR;
  134. hdr->nack = 0;
  135. hdr->subtype = 0;
  136. web_sensor_info_t *sensor_info = (web_sensor_info_t *)(&hdr->data);
  137. sensor_all_t *sensor = sensor_get_data();
  138. memset(sensor_info,0,sizeof(web_sensor_info_t)*4);
  139. strcpy(sensor_info[0].name,sensor->data[0].info.name);
  140. sensor_info[0].status = sensor->data[0].info.status;
  141. sensor_info[0].value = sensor->data[0].val[0].value;
  142. sensor_info[0].v_max = sensor->data[0].val[0].thr.max;
  143. sensor_info[0].v_min = sensor->data[0].val[0].thr.min;
  144. sensor_info[0].v_max_wrn = sensor->data[0].val[0].s_alarm.max_up;
  145. sensor_info[0].v_min_wrn = sensor->data[0].val[0].s_alarm.min_down;
  146. strcpy(sensor_info[1].name,sensor->data[0].info.name);
  147. sensor_info[1].status = sensor->data[0].info.status;
  148. sensor_info[1].value = sensor->data[0].val[1].value;
  149. sensor_info[1].v_max = sensor->data[0].val[1].thr.max;
  150. sensor_info[1].v_min = sensor->data[0].val[1].thr.min;
  151. sensor_info[1].v_max_wrn = sensor->data[0].val[1].s_alarm.max_up;
  152. sensor_info[1].v_min_wrn = sensor->data[0].val[1].s_alarm.min_down;
  153. strcpy(sensor_info[2].name,sensor->data[1].info.name);
  154. sensor_info[2].status = sensor->data[1].info.status;
  155. sensor_info[2].value = sensor->data[1].val[0].value;
  156. sensor_info[2].v_max = sensor->data[1].val[0].thr.max;
  157. sensor_info[2].v_min = sensor->data[1].val[0].thr.min;
  158. sensor_info[2].v_max_wrn = sensor->data[1].val[0].s_alarm.max_up;
  159. sensor_info[2].v_min_wrn = sensor->data[1].val[0].s_alarm.min_down;
  160. strcpy(sensor_info[3].name,sensor->data[2].info.name);
  161. sensor_info[3].status = sensor->data[2].info.status;
  162. sensor_info[3].value = sensor->data[2].val[0].value;
  163. sensor_info[3].v_max = sensor->data[2].val[0].thr.max;
  164. sensor_info[3].v_min = sensor->data[2].val[0].thr.min;
  165. sensor_info[3].v_max_wrn = sensor->data[2].val[0].s_alarm.max_up;
  166. sensor_info[3].v_min_wrn = sensor->data[2].val[0].s_alarm.min_down;
  167. hdr->dlen = sizeof(web_sensor_info_t) * 4;
  168. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  169. ws_send(c, h->buf, xlen, 1);
  170. }
  171. static void send_power_info(web_handle_t *h, mg_conn_t *c)
  172. {
  173. pkt_hdr_t *hdr=NULL;
  174. hdr = (pkt_hdr_t*)h->buf;
  175. hdr->magic = PKT_MAGIC;
  176. hdr->addr = 0;
  177. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  178. hdr->nack = 0;
  179. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_INFO;
  180. info_new_t *power_info = (info_new_t *)(&hdr->data);
  181. power_handle_new_t *p_handle = power_get_all();
  182. lock_on(p_handle->lck);
  183. int chn = p_handle->chs;
  184. //max translate 32
  185. for(int i = 0; i < chn;i++)
  186. {
  187. power_info[i] = p_handle->pch[i].info;
  188. }
  189. lock_off(p_handle->lck);
  190. hdr->dlen = sizeof(info_new_t) * chn;
  191. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  192. ws_send(c, h->buf, xlen, 1);
  193. }
  194. static void send_power_all(web_handle_t *h, mg_conn_t *c)
  195. {
  196. pkt_hdr_t *hdr=NULL;
  197. hdr = (pkt_hdr_t*)h->buf;
  198. hdr->magic = PKT_MAGIC;
  199. hdr->addr = 0;
  200. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  201. hdr->nack = 0;
  202. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_ALL;
  203. power_t *power_all = (power_t *)(&hdr->data);
  204. power_handle_new_t *p_handle = power_get_all();
  205. lock_on(p_handle->lck);
  206. power_all[0] = p_handle->total.all;
  207. for(int i =0;i < 3;i++)
  208. {
  209. power_all[i+1] = p_handle->total.all_l[i];
  210. }
  211. lock_off(p_handle->lck);
  212. hdr->dlen = sizeof(power_t) * 4;
  213. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  214. ws_send(c, h->buf, xlen, 1);
  215. }
  216. static void send_power_thr(web_handle_t *h, mg_conn_t *c)
  217. {
  218. pkt_hdr_t *hdr=NULL;
  219. hdr = (pkt_hdr_t*)h->buf;
  220. hdr->magic = PKT_MAGIC;
  221. hdr->addr = 0;
  222. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  223. hdr->nack = 0;
  224. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_THR;
  225. power_handle_new_t *p_handle = power_get_all();
  226. thr_t *_data = (thr_t *)(&hdr->data);
  227. int chn = p_handle->chs;
  228. for(int i =0; i < chn;i++)
  229. {
  230. _data[i] = p_handle->pch[i].thr;
  231. }
  232. hdr->dlen = sizeof(thr_t) * chn;
  233. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  234. ws_send(c, h->buf, xlen, 1);
  235. }
  236. static void set_power_ctrl(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  237. {
  238. power_handle_new_t *p_handle = power_get_all();
  239. uint8_t channle = ctrl->cnt_ctrl.chn;
  240. if(channle > p_handle->chs || ctrl == NULL)
  241. return;
  242. uint8_t saddr = p_handle->pch[channle].info.addr;
  243. uint8_t b_addr = p_handle->pch[channle].info.sch;
  244. p_handle->set_status(saddr,b_addr,ctrl->cnt_ctrl.status);
  245. }
  246. static void set_power_all_ctrl(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  247. {
  248. power_handle_new_t *p_handle = power_get_all();
  249. p_handle->set_all_status(ctrl->all_ctrl.status);
  250. }
  251. static void set_power_consum_clear(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  252. {
  253. power_handle_new_t *p_handle = power_get_all();
  254. uint8_t channle = ctrl->clear.chn;
  255. if(channle > p_handle->chs || ctrl == NULL)
  256. return;
  257. uint8_t saddr = p_handle->pch[channle].info.addr;
  258. uint8_t b_addr = p_handle->pch[channle].info.sch;
  259. p_handle->set_consumer_clear(saddr,b_addr);
  260. }
  261. static void set_power_delay(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  262. {
  263. power_handle_new_t *p_handle = power_get_all();
  264. uint8_t channle = ctrl->delay.chn;
  265. if(channle > p_handle->chs || ctrl == NULL)
  266. return;
  267. uint8_t saddr = p_handle->pch[channle].info.addr;
  268. uint8_t b_addr = p_handle->pch[channle].info.sch;
  269. uint8_t open = ctrl->delay.open;
  270. uint8_t close = ctrl->delay.close;
  271. p_handle->set_delay(saddr,b_addr,open,close);
  272. }
  273. static void set_power_thr(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  274. {
  275. power_handle_new_t *p_handle = power_get_all();
  276. uint8_t channle = ctrl->thr.chn;
  277. thr_t *thr = &ctrl->thr.thr;
  278. if(channle > p_handle->chs || ctrl == NULL)
  279. return;
  280. uint8_t saddr = p_handle->pch[channle].info.addr;
  281. uint8_t b_addr = p_handle->pch[channle].info.sch;
  282. p_handle->set_thr(saddr,b_addr,thr);
  283. }
  284. static void set_power_batch_thr(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  285. {
  286. power_handle_new_t *p_handle = power_get_all();
  287. thr_t *thr = &ctrl->thr.thr;
  288. if(ctrl == NULL)
  289. return;
  290. for(int i=0; i < 32;i++)
  291. {
  292. if(p_handle->board[i].flag)
  293. {
  294. p_handle->set_batch_thr(i,thr);
  295. }
  296. }
  297. }
  298. static void send_power_data(web_handle_t *h, mg_conn_t *c,uint8_t id)
  299. {
  300. pkt_hdr_t *hdr=NULL;
  301. hdr = (pkt_hdr_t*)h->buf;
  302. hdr->magic = PKT_MAGIC;
  303. hdr->addr = 0;
  304. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  305. hdr->nack = 0;
  306. hdr->subtype = id;
  307. power_t *power_data = (power_t *)(&hdr->data);
  308. power_handle_new_t *p_handle = power_get_all();
  309. if(id>=3)
  310. return;
  311. int chn = p_handle->chs;
  312. for(int i =0; i < chn;i++)
  313. {
  314. power_data[i] = p_handle->pch[i].power[id];
  315. }
  316. hdr->dlen = sizeof(power_t) * chn;
  317. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  318. ws_send(c, h->buf, xlen, 1);
  319. }
  320. static void set_sensor_thr(web_handle_t *h,mg_conn_t *c,uint8_t type,wed_set_t *ctrl)
  321. {
  322. sensor_data_t *data_temp = NULL;
  323. sensor_th_t *sensor_temp = NULL;
  324. uint32_t vmax = ctrl->sensor.v_max *100;
  325. uint32_t vmin = ctrl->sensor.v_min *100;
  326. switch(type)
  327. {
  328. case NEW_SUB_PKT_TYPE_HUMI:
  329. {
  330. data_temp = &sensor_get_data()->data[0];
  331. sensor_temp = &paras_get()->sensor.sens[0];
  332. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  333. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  334. sensor_temp->th_max_1 = vmax;
  335. sensor_temp->th_min_1 = vmin;
  336. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  337. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  338. }
  339. break;
  340. case NEW_SUB_PKT_TYPE_TEMP:
  341. {
  342. data_temp = &sensor_get_data()->data[0];
  343. sensor_temp = &paras_get()->sensor.sens[0];
  344. data_temp->val[1].thr.en.th_sen_max_en = vmax ? 1 : 0;
  345. data_temp->val[1].thr.en.th_sen_min_en = vmin ? 1 : 0;
  346. sensor_temp->th_max_2 = vmax;
  347. sensor_temp->th_min_2 = vmin;
  348. data_temp->val[1].thr.max = ctrl->sensor.v_max;
  349. data_temp->val[1].thr.min = ctrl->sensor.v_min;
  350. }
  351. break;
  352. case NEW_SUB_PKT_TYPE_SMOKE:
  353. {
  354. data_temp = &sensor_get_data()->data[1];
  355. sensor_temp = &paras_get()->sensor.sens[1];
  356. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  357. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  358. sensor_temp->th_max_1 = vmax;
  359. sensor_temp->th_min_1 = vmin;
  360. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  361. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  362. }
  363. break;
  364. case NEW_SUB_PKT_TYPE_CO2:
  365. {
  366. data_temp = &sensor_get_data()->data[2];
  367. sensor_temp = &paras_get()->sensor.sens[2];
  368. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  369. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  370. sensor_temp->th_max_1 = vmax;
  371. sensor_temp->th_min_1 = vmin;
  372. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  373. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  374. }
  375. break;
  376. default:
  377. return;
  378. }
  379. paras_save();
  380. }
  381. static void send_net_config(web_handle_t *h, mg_conn_t *c)
  382. {
  383. pkt_hdr_t *hdr=NULL;
  384. hdr = (pkt_hdr_t*)h->buf;
  385. hdr->magic = PKT_MAGIC;
  386. hdr->addr = 0;
  387. hdr->type = NEW_PKT_TYPE_NETWORK;
  388. hdr->nack = 0;
  389. hdr->subtype = 0;
  390. network_data_t *net = (network_data_t *)(&hdr->data);
  391. memset(net,0,sizeof(network_data_t));
  392. paras_data_t* para=paras_get();
  393. *net = para->netwk;
  394. hdr->dlen = sizeof(network_data_t);
  395. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  396. ws_send(c, h->buf, xlen, 1);
  397. }
  398. static void send_rs485_config(web_handle_t *h, mg_conn_t *c)
  399. {
  400. pkt_hdr_t *hdr=NULL;
  401. hdr = (pkt_hdr_t*)h->buf;
  402. hdr->magic = PKT_MAGIC;
  403. hdr->addr = 0;
  404. hdr->type = NEW_PKT_TYPE_RS485;
  405. hdr->nack = 0;
  406. hdr->subtype = 0;
  407. modbus_data_t *md = (modbus_data_t *)(&hdr->data);
  408. memset(md,0,sizeof(modbus_data_t));
  409. paras_data_t* para=paras_get();
  410. *md = para->cas;
  411. hdr->dlen = sizeof(modbus_data_t);
  412. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  413. ws_send(c, h->buf, xlen, 1);
  414. }
  415. static void send_snmp_config(web_handle_t *h, mg_conn_t *c)
  416. {
  417. pkt_hdr_t *hdr=NULL;
  418. hdr = (pkt_hdr_t*)h->buf;
  419. hdr->magic = PKT_MAGIC;
  420. hdr->addr = 0;
  421. hdr->type = NEW_PKT_TYPE_SNMP;
  422. hdr->nack = 0;
  423. hdr->subtype = 0;
  424. snmp_data_t *snmp = (snmp_data_t *)(&hdr->data);
  425. memset(snmp,0,sizeof(snmp_data_t));
  426. paras_data_t* para=paras_get();
  427. *snmp = para->snmp;
  428. hdr->dlen = sizeof(snmp_data_t);
  429. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  430. ws_send(c, h->buf, xlen, 1);
  431. }
  432. static void web_set_network(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  433. {
  434. web_net_t *net = &ctrl->net;
  435. if(net->mode == 0 || net->mode == 1)
  436. {
  437. if(net->mode == 0)
  438. {
  439. if(sys_ip_check(net->dns1) && sys_ip_check(net->dns2));
  440. {
  441. net_ipaddr_set(net);
  442. }
  443. }else
  444. {
  445. if(sys_ip_check(net->dns1)
  446. && sys_ip_check(net->dns2)
  447. && sys_ip_check(net->gateway)
  448. && sys_ip_check(net->ipaddr)
  449. && sys_ip_check(net->mask))
  450. {
  451. net_ipaddr_set(net);
  452. }
  453. }
  454. }
  455. }
  456. static void web_set_rs485(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  457. {
  458. web_rs485_t *rs485 = &ctrl->rs485;
  459. cascade_reset_new(rs485->mode,rs485->addr,rs485->baud);
  460. }
  461. static void web_snmp_set(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  462. {
  463. web_snmp_t *snmp= &ctrl->snmp;
  464. paras_data_t* para=paras_get();
  465. snmp_data_t *p_snmp = &para->snmp;
  466. int len1 = strlen(snmp->publics);
  467. int len2 = strlen(snmp->privates);
  468. if(snmp->trapmode == 1)
  469. {
  470. if(sys_ip_check(snmp->nms_ip))
  471. {
  472. if(len1>0 && len2 > 0)
  473. {
  474. *p_snmp = *snmp;
  475. paras_save();
  476. snmp_strap_set();
  477. }
  478. }
  479. }else
  480. {
  481. if(len1>0 && len2 > 0)
  482. {
  483. strcpy(p_snmp->publics,snmp->publics);
  484. strcpy(p_snmp->privates,snmp->privates);
  485. p_snmp->trapmode = snmp->trapmode;
  486. paras_save();
  487. snmp_strap_set();
  488. }
  489. }
  490. }
  491. static void web_set_ntp(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  492. {
  493. web_device_t *device= &ctrl->device;
  494. paras_data_t* para=paras_get();
  495. para->sys.tzone = device->zone;
  496. rt_tz_set(device->zone * 3600);
  497. int lenth = strlen(device->date_time);
  498. for(int i = 0; i < lenth;i++)
  499. {
  500. if(device->date_time[i] <'0' || device->date_time[i] > '9')
  501. {
  502. device->date_time[i]=' ';
  503. }
  504. }
  505. system(device->date_time);
  506. paras_save();
  507. }
  508. static void send_his_alarm(web_handle_t *h, mg_conn_t *c)
  509. {
  510. pkt_hdr_t *hdr=NULL;
  511. hdr = (pkt_hdr_t*)h->buf;
  512. hdr->magic = PKT_MAGIC;
  513. hdr->addr = 0;
  514. hdr->type = NEW_PKT_TYPE_WANNING;
  515. hdr->nack = 0;
  516. hdr->subtype = 0;
  517. uint16_t *count = (uint16_t *)(&hdr->data[0]);
  518. *count = wanning_get_count();
  519. waning_info_t *wanning = (waning_info_t *)(&hdr->data[2]);
  520. wanning_get(wanning, count);
  521. hdr->dlen = (*count)*sizeof(waning_info_t)+2;
  522. uint32_t xlen = (*count)*sizeof(waning_info_t)+sizeof(pkt_hdr_t) + 2;
  523. ws_send(c, h->buf, xlen, 1);
  524. }
  525. static int ws_handle_new(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
  526. {
  527. int r=0;
  528. if (!is_ws(c)) {
  529. return -1;
  530. }
  531. if(hdr->magic!=PKT_MAGIC) {
  532. LOGE("___ magic: 0x%x is wrong!, correct is: 0x%x\n", hdr->magic, PKT_MAGIC);
  533. return -1;
  534. }
  535. wed_set_t *ctrl = (wed_set_t*)(hdr->data);
  536. switch(hdr->type) {
  537. case NEW_PKT_TYPE_DEVICE_INFO:
  538. {
  539. if(hdr->dlen == 0)
  540. send_sys(h,c);
  541. else
  542. {
  543. reboot_sys(h,c,ctrl);
  544. }
  545. }
  546. break;
  547. case NEW_PKT_TYPE_ELE_INFO:
  548. {
  549. switch (hdr->subtype)
  550. {
  551. case NEW_SUB_PKT_TYPE_ELE_DATA_ALL:
  552. {
  553. send_power_all(h,c);
  554. }
  555. break;
  556. case NEW_SUB_PKT_TYPE_ELE_DATA_INFO:
  557. {
  558. send_power_info(h,c);
  559. }
  560. break;
  561. case NEW_SUB_PKT_TYPE_ELE_DATA_L1:
  562. {
  563. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L1);
  564. }
  565. break;
  566. case NEW_SUB_PKT_TYPE_ELE_DATA_L2:
  567. {
  568. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L2);
  569. }
  570. break;
  571. case NEW_SUB_PKT_TYPE_ELE_DATA_L3:
  572. {
  573. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L3);
  574. }
  575. break;
  576. case NEW_SUB_PKT_TYPE_ELE_DATA_THR:
  577. {
  578. if(hdr->dlen == 0)
  579. send_power_thr(h,c);
  580. else
  581. {
  582. set_power_thr(h,c,ctrl);
  583. }
  584. }
  585. break;
  586. case NEW_SUB_PKT_TYPE_ELE_DELAY:
  587. {
  588. if(hdr->dlen > 0) {
  589. set_power_delay(h,c,ctrl);
  590. }
  591. }
  592. break;
  593. case NEW_SUB_PKT_TYPE_ELE_CTRL:
  594. {
  595. if(hdr->dlen > 0) {
  596. set_power_ctrl(h,c,ctrl);
  597. }
  598. }
  599. break;
  600. case NEW_SUB_PKT_TYPE_ELE_ALL_CTRL:
  601. {
  602. if(hdr->dlen > 0) {
  603. set_power_all_ctrl(h,c,ctrl);
  604. }
  605. }
  606. break;
  607. case NEW_SUB_PKT_TYPE_ELE_CLEAR_CONSUMER:
  608. {
  609. if(hdr->dlen > 0) {
  610. set_power_consum_clear(h,c,ctrl);
  611. }
  612. }
  613. break;
  614. case NEW_SUB_PKT_TYPE_ELE_BATCH:
  615. {
  616. if(hdr->dlen > 0)
  617. {
  618. set_power_batch_thr(h,c,ctrl);
  619. }
  620. }
  621. break;
  622. default:
  623. break;
  624. }
  625. }
  626. break;
  627. case NEW_PKT_TYPE_SENSOR:
  628. {
  629. if(hdr->dlen == 0)
  630. {
  631. send_sensor_info(h,c);
  632. }else
  633. {
  634. set_sensor_thr(h,c,hdr->subtype,ctrl);
  635. }
  636. }
  637. break;
  638. case NEW_PKT_TYPE_NETWORK:
  639. {
  640. if(hdr->dlen == 0)
  641. {
  642. send_net_config(h,c);
  643. }else
  644. {
  645. web_set_network(h,c,ctrl);
  646. }
  647. }
  648. break;
  649. case NEW_PKT_TYPE_RS485:
  650. {
  651. if(hdr->dlen == 0)
  652. {
  653. send_rs485_config(h,c);
  654. }else
  655. {
  656. web_set_rs485(h,c,ctrl);
  657. }
  658. }
  659. break;
  660. case NEW_PKT_TYPE_SNMP:
  661. {
  662. if(hdr->dlen == 0)
  663. {
  664. send_snmp_config(h,c);
  665. }else
  666. {
  667. web_snmp_set(h,c,ctrl);
  668. }
  669. }
  670. break;
  671. case NEW_PKT_TYPE_NTP:
  672. {
  673. web_set_ntp(h,c,ctrl);
  674. }
  675. break;
  676. case NEW_PKT_TYPE_WANNING:
  677. {
  678. if(hdr->dlen == 0)
  679. {
  680. send_his_alarm(h,c);
  681. }else
  682. {
  683. switch(hdr->subtype)
  684. {
  685. case NEW_SUB_PKT_TYPE_WANNING_CLEAN:
  686. wanning_clean();
  687. break;
  688. case NEW_SUB_PKT_TYPE_WANNING_SOUND_LIGHT_CLEAN:
  689. {
  690. led_reset();
  691. beep_reset();
  692. }
  693. break;
  694. }
  695. }
  696. }
  697. break;
  698. default:
  699. break;
  700. }
  701. return 0;
  702. }
  703. static void http_fn(mg_conn_t *c, int ev, void *ev_data)
  704. {
  705. int r,flag=0;
  706. web_handle_t *h=&webHandle;
  707. // LOGD("connect --------%lx\n",c);
  708. #ifdef USE_MG716
  709. if (ev == MG_EV_HTTP_MSG) {
  710. struct mg_http_message *hm = (struct mg_http_message *) ev_data;
  711. if (mg_match(hm->uri, mg_str("/ws"), NULL)) {
  712. mg_ws_upgrade(c, hm, NULL);
  713. } else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
  714. // Serve REST response
  715. mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
  716. } else {
  717. struct mg_http_serve_opts opts = {.root_dir = h->rootDir};
  718. mg_http_serve_dir(c, hm, &opts);
  719. }
  720. }
  721. else if(ev == MG_EV_ACCEPT) {
  722. if (c->fn_data) {
  723. mg_tls_init(c, &h->tls);
  724. }
  725. // paras_data_t *p=paras_get();
  726. // ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  727. }
  728. else if(ev == MG_EV_WS_MSG) {
  729. struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
  730. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data.buf;
  731. ws_handle_new(h, hdr, c);
  732. }else if(ev == MG_EV_CLOSE)
  733. {
  734. //mg_close_conn(c);
  735. }
  736. #else
  737. if (ev == MG_EV_HTTP_REQUEST) {
  738. mg_serve_http(c, (struct http_message *)ev_data, h->opts);
  739. }
  740. else if(ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE) {
  741. paras_data_t *p=paras_get();
  742. ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  743. set_timer(c, TIMER_INTERVAL);
  744. }
  745. else if(ev == MG_EV_WEBSOCKET_FRAME) {
  746. struct websocket_message *wm = (struct websocket_message *) ev_data;
  747. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data;
  748. ws_handle(h, hdr, c);
  749. }
  750. else if(ev==MG_EV_TIMER) {
  751. }
  752. #endif
  753. }
  754. static void web_thread(void *arg)
  755. {
  756. mg_conn_t *nc;
  757. const char *http_addr="http://[::]:80";
  758. const char *https_addr="https://[::]:443";
  759. thread_handle_t *th=(thread_handle_t*)arg;
  760. web_handle_t *h=(web_handle_t*)th->attr->arg;
  761. strcpy(h->rootDir, "/nor/web");
  762. //cs_log_set_level(3);
  763. #ifdef USE_MG716
  764. mg_log_set(MG_LL_ERROR);
  765. mg_mgr_init(&h->mgr);
  766. mg_timer_add(&h->mgr, TIMER_INTERVAL, MG_TIMER_REPEAT, timer_fn, h);
  767. if (mg_http_listen(&h->mgr, http_addr, http_fn, NULL) == NULL) {
  768. MG_ERROR(("cannot listen on %s\n", http_addr));
  769. }
  770. //if (mg_http_listen(&h->mgr, https_addr, http_fn, (void*)1) == NULL) {
  771. // MG_ERROR(("cannot listen on %s\n", https_addr));
  772. //}
  773. //mh->tls.cert = mg_str(file_load2("/root/run/app/cert/server.crt",0));
  774. //mh->tls.key = mg_str(file_load2("/root/run/app/cert/server.key",0));
  775. //mh->tls.name = mg_url_host(https_addr);
  776. #else
  777. mg_mgr_init(&h->mgr, NULL);
  778. nc = mg_bind(&h->mgr, "80", http_fn);
  779. strcpy(h->rootDir, "/nor/web");
  780. mg_set_protocol_http_websocket(nc);
  781. h->opts.document_root = h->rootDir;
  782. h->opts.enable_directory_listing = "yes";
  783. #endif
  784. //mg_set_timer(nc,500);
  785. //mg_timer_add(&h->mgr, 500, MG_TIMER_REPEAT, timer_fn, h);
  786. while(th->quit==0) {
  787. mg_mgr_poll(&h->mgr, 50);
  788. }
  789. mg_mgr_free(&h->mgr);
  790. }
  791. int web_init(void)
  792. {
  793. list_cfg_t lc={0,0,10};
  794. web_handle_t *h=&webHandle;
  795. memset(h, 0, sizeof(web_handle_t));
  796. h->list = list_init(&lc);
  797. h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)*ONCE_SEND_CNT+8;
  798. h->buf = (char*)malloc(h->buflen);
  799. thread_start(THREAD_ID_WEB, web_thread, h);
  800. return 0;
  801. }
  802. int web_post(int type, void *data, int len)
  803. {
  804. struct mg_connection *c;
  805. web_handle_t *h=&webHandle;
  806. return list_append(h->list, type, data, len);
  807. }