web.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  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. typedef struct mg_connection mg_conn_t;
  27. #ifdef USE_MG716
  28. typedef struct mg_tls_opts mg_tls_t;
  29. static void timer_fn(void *arg)
  30. {
  31. int r;
  32. web_handle_t *h=(web_handle_t*)arg;
  33. list_node_t *ln=NULL;
  34. mg_conn_t* c;
  35. r = list_take_node(h->list, &ln, 0);
  36. if(r==0) {
  37. node_t *n=&ln->data;
  38. for (c = h->mgr.conns; c != NULL; c = c->next) {
  39. ws_send_pkt(h, c, n->tp, n->buf, n->dlen, 1);
  40. }
  41. list_back_node(h->list, ln);
  42. }
  43. }
  44. #else
  45. typedef struct mg_serve_http_opts mg_opts_t;
  46. #define MG_PATH_MAX 128
  47. static void set_timer(struct mg_connection *c, int ms)
  48. {
  49. mg_set_timer(c, mg_time()+ms/1000.0f);
  50. }
  51. #endif
  52. typedef struct {
  53. struct mg_connection *c;
  54. int ev;
  55. void *ev_data;
  56. }mg_stream_t;
  57. typedef struct {
  58. pthread_t tid;
  59. mg_mgr_t mgr;
  60. #ifdef USE_MG716
  61. mg_tls_t tls;
  62. #else
  63. mg_opts_t opts;
  64. #endif
  65. handle_t list;
  66. char rootDir[MG_PATH_MAX];
  67. char *buf;
  68. int buflen;
  69. uint8_t cur_addr;
  70. }web_handle_t;
  71. static web_handle_t webHandle={0};
  72. static int is_ws(mg_conn_t *c)
  73. {
  74. int r=0;
  75. #ifdef USE_MG716
  76. r = c->is_websocket?1:0;
  77. #else
  78. r = (c->flags & MG_F_IS_WEBSOCKET)?1:0;
  79. #endif
  80. return r;
  81. }
  82. static int ws_send(mg_conn_t *c, void *data, int len, int isbin)
  83. {
  84. if(!c || !data || len<=0) {
  85. return -1;
  86. }
  87. //LOGD("____ws_send, len: %d\n", len);
  88. #ifdef USE_MG716
  89. mg_ws_send(c, data, len, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
  90. #else
  91. mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, data, len);
  92. #endif
  93. return 0;
  94. }
  95. static int ws_send_pkt(web_handle_t *h, mg_conn_t *c, uint8_t addr, uint8_t type, void *data, int len, int isbin)
  96. {
  97. pkt_hdr_t *hdr=NULL;
  98. if(!h->buf || !len || h->buflen<sizeof(pkt_hdr_t)+len) {
  99. LOGE("____ws_send, para are invalid\n");
  100. return -1;
  101. }
  102. hdr = (pkt_hdr_t*)h->buf;
  103. hdr->magic = PKT_MAGIC;
  104. hdr->addr = addr;
  105. hdr->type = type;
  106. hdr->nack = 0;
  107. hdr->dlen = len;
  108. memcpy(hdr->data, data, len);
  109. ws_send(c, hdr, len+sizeof(pkt_hdr_t), isbin);
  110. return 0;
  111. }
  112. //static uint8_t l1_status = 0;
  113. //static rt_tick_t set_stick = 0;
  114. static void send_powerc(web_handle_t *h, mg_conn_t *c, uint8_t addr)
  115. {
  116. int i=0,j,xlen,offset,times,left;
  117. pkt_hdr_t *hdr=NULL;
  118. power_all_t all;
  119. if(addr==0) {
  120. power_data_get(&all);
  121. }
  122. else {
  123. cascade_power_get(&all);
  124. }
  125. if(all.chs==0 || h->buf==NULL ) {
  126. return;
  127. }
  128. hdr = (pkt_hdr_t*)h->buf;
  129. hdr->magic = PKT_MAGIC;
  130. hdr->addr = addr;
  131. hdr->type = PKT_TYPE_POWER_CH;
  132. hdr->nack = 0;
  133. int count = all.chs;
  134. int bag = 0;
  135. #if 1
  136. do{
  137. bag ++;
  138. if(count <= ONCE_SEND_CNT)
  139. {
  140. for(j=0;j<count;j++)
  141. {
  142. offset = j*sizeof(power_ch_t);
  143. memcpy(hdr->data+offset, &all.pch[i+j],sizeof(power_ch_t));
  144. hdr->flag = (-1);
  145. // if(l1_status != all.pch[1].status)
  146. // {
  147. //
  148. // rt_tick_t end_tick = rt_tick_get();
  149. // LOGD("web close_open.........%ld ms\n",((end_tick-set_stick)*1000)/RT_TICK_PER_SECOND);
  150. // l1_status = all.pch[1].status;
  151. // }
  152. // if((i+j) == 3)
  153. // {
  154. // if(all.pch[i+j].status == 1)
  155. // {
  156. // extern rt_tick_t start_tick;
  157. //
  158. // rt_tick_t end_tick = rt_tick_get();
  159. // LOGD("web close_open ms.........%ld\n",((end_tick-start_tick)*1000)/RT_TICK_PER_SECOND);
  160. // }
  161. // }
  162. }
  163. xlen = sizeof(power_ch_t) * count + sizeof(pkt_hdr_t);
  164. hdr->dlen = xlen-sizeof(pkt_hdr_t);
  165. i += count;
  166. count -= count;
  167. }else
  168. {
  169. for(j=0;j < ONCE_SEND_CNT;j++)
  170. {
  171. offset =j*sizeof(power_ch_t);
  172. memcpy(hdr->data+offset, &all.pch[i+j],sizeof(power_ch_t));
  173. }
  174. xlen = sizeof(power_ch_t) * ONCE_SEND_CNT + sizeof(pkt_hdr_t);
  175. hdr->dlen = xlen-sizeof(pkt_hdr_t);
  176. count -= ONCE_SEND_CNT;
  177. hdr->flag = bag;
  178. i += ONCE_SEND_CNT;
  179. }
  180. ws_send(c, h->buf, xlen, 1);
  181. }while(count > 0);
  182. #endif
  183. }
  184. static void send_powert(web_handle_t *h, mg_conn_t *c, uint8_t addr)
  185. {
  186. int i,r;
  187. power_all_t all;
  188. if(addr==0) {
  189. power_data_get(&all);
  190. }
  191. else {
  192. cascade_power_get(&all);
  193. }
  194. ws_send_pkt(h, c, addr, PKT_TYPE_POWER_TOTAL, &all.ttl, sizeof(power_total_t), 1);
  195. }
  196. static void send_sensor(web_handle_t *h, mg_conn_t *c, uint8_t addr)
  197. {
  198. int i,j,xlen,offset,times,left;
  199. pkt_hdr_t *hdr=NULL;
  200. sensor_all_t all;
  201. sensor_data_get(&all);
  202. if(all.cnt==0 || h->buf==NULL ) {
  203. return;
  204. }
  205. hdr = (pkt_hdr_t*)h->buf;
  206. hdr->magic = PKT_MAGIC;
  207. hdr->addr = addr;
  208. hdr->type = PKT_TYPE_SENSOR;
  209. hdr->nack = 0;
  210. times = all.cnt/ONCE_SEND_CNT;
  211. for(i=0; i<times; i++) {
  212. for(j=0; j<ONCE_SEND_CNT; j++) {
  213. offset = j*sizeof(sensor_data_t);
  214. memcpy(hdr->data+offset, &all.data[i*ONCE_SEND_CNT+j], sizeof(sensor_data_t));
  215. }
  216. xlen = ONCE_SEND_CNT*sizeof(sensor_data_t)+sizeof(pkt_hdr_t);
  217. hdr->dlen = xlen-sizeof(pkt_hdr_t);
  218. ws_send(c, h->buf, xlen, 1);
  219. }
  220. left = all.cnt%ONCE_SEND_CNT;
  221. for(i=0; i<left; i++) {
  222. offset = i*sizeof(sensor_data_t);
  223. memcpy(hdr->data+offset, &all.data[all.cnt-left+i], sizeof(sensor_data_t));
  224. }
  225. xlen = (all.cnt%ONCE_SEND_CNT)*sizeof(sensor_data_t)+sizeof(pkt_hdr_t);
  226. hdr->dlen = xlen-sizeof(pkt_hdr_t);
  227. ws_send(c, h->buf, xlen, 1);
  228. // sensor_data_free(&all);
  229. }
  230. static void send_his_alarm(web_handle_t *h, mg_conn_t *c,uint8_t addr)
  231. {
  232. int i,j,xlen,offset,times,left;
  233. pkt_hdr_t *hdr=NULL;
  234. hdr = (pkt_hdr_t*)h->buf;
  235. hdr->magic = PKT_MAGIC;
  236. hdr->addr = addr;
  237. hdr->type = PKT_TYPE_ALARM;
  238. hdr->nack = 0;
  239. uint16_t count = wanning_get_count();
  240. hdr->flag = count;
  241. waning_info_t *wanning = (waning_info_t *)hdr->data;
  242. wanning_get(wanning, count);
  243. hdr->dlen = count*sizeof(waning_info_t);
  244. xlen = count*sizeof(waning_info_t)+sizeof(pkt_hdr_t);
  245. ws_send(c, h->buf, xlen, 1);
  246. }
  247. static void send_breaker(web_handle_t *h, mg_conn_t *c, uint8_t addr)
  248. {
  249. int i,j,xlen,offset,times,left;
  250. pkt_hdr_t *hdr=NULL;
  251. breaker_all_t all;
  252. breaker_data_get(&all);
  253. if(all.cnt==0 || h->buf==NULL ) {
  254. return;
  255. }
  256. hdr = (pkt_hdr_t*)h->buf;
  257. hdr->magic = PKT_MAGIC;
  258. hdr->addr = addr;
  259. hdr->type = PKT_TYPE_SENSOR;
  260. hdr->nack = 0;
  261. times = all.cnt/ONCE_SEND_CNT;
  262. for(i=0; i<times; i++) {
  263. for(j=0; j<ONCE_SEND_CNT; j++) {
  264. offset = j*sizeof(breaker_data_t);
  265. memcpy(hdr->data+offset, &all.data[i*ONCE_SEND_CNT+j], sizeof(breaker_data_t));
  266. }
  267. xlen = ONCE_SEND_CNT*sizeof(breaker_data_t)+sizeof(pkt_hdr_t);
  268. hdr->dlen = xlen-sizeof(pkt_hdr_t);
  269. ws_send(c, h->buf, xlen, 1);
  270. }
  271. left = all.cnt%ONCE_SEND_CNT;
  272. for(i=0; i<left; i++) {
  273. offset = i*sizeof(breaker_data_t);
  274. memcpy(hdr->data+offset, &all.data[all.cnt-left+i], sizeof(breaker_data_t));
  275. }
  276. xlen = (all.cnt%ONCE_SEND_CNT)*sizeof(breaker_data_t)+sizeof(pkt_hdr_t);
  277. hdr->dlen = xlen-sizeof(pkt_hdr_t);
  278. ws_send(c, h->buf, xlen, 1);
  279. breaker_data_free(&all);
  280. }
  281. static void send_net(web_handle_t *h, mg_conn_t *c)
  282. {
  283. //paras_data_t* para=paras_get();
  284. pkt_hdr_t *hdr=NULL;
  285. hdr = (pkt_hdr_t*)h->buf;
  286. hdr->magic = PKT_MAGIC;
  287. hdr->addr = 0;
  288. hdr->type = PKT_TYPE_PARAS;
  289. hdr->nack = 0;
  290. hdr->subtype = SUB_TYPE_PARAS_NETWORK;
  291. network_data_t data = {0};
  292. net_get_ip(&data);
  293. //data = para->netwk;
  294. hdr->dlen = sizeof(network_data_t);
  295. memcpy(hdr->data,&data,hdr->dlen);
  296. uint32_t xlen = sizeof(pkt_hdr_t) + sizeof(network_data_t);
  297. ws_send(c, h->buf, xlen, 1);
  298. //ws_send(c, h->buf, hdr->dlen, 1);
  299. }
  300. static void send_misc(web_handle_t *h, mg_conn_t *c)
  301. {
  302. paras_data_t* para=paras_get();
  303. pkt_hdr_t *hdr=NULL;
  304. hdr = (pkt_hdr_t*)h->buf;
  305. hdr->magic = PKT_MAGIC;
  306. hdr->addr = 0;
  307. hdr->type = PKT_TYPE_PARAS;
  308. hdr->nack = 0;
  309. hdr->subtype = SUB_TYPE_PARAS_MISC;
  310. misc_data_t data = {0};
  311. data = para->misc;
  312. hdr->dlen = sizeof(misc_data_t);
  313. ws_send(c, h->buf, hdr->dlen, 1);
  314. }
  315. static void send_smnp(web_handle_t *h, mg_conn_t *c)
  316. {
  317. paras_data_t* para=paras_get();
  318. pkt_hdr_t *hdr=NULL;
  319. hdr = (pkt_hdr_t*)h->buf;
  320. hdr->magic = PKT_MAGIC;
  321. hdr->addr = 0;
  322. hdr->type = PKT_TYPE_PARAS;
  323. hdr->nack = 0;
  324. hdr->subtype = SUB_TYPE_PARAS_SNMP;
  325. hdr->flag = 0;
  326. hdr->dlen = 0;
  327. snmp_data_t data = {0};
  328. data = para->snmp;
  329. hdr->dlen = sizeof(snmp_data_t);
  330. memcpy(hdr->data,&data,hdr->dlen);
  331. uint32_t xlen = sizeof(pkt_hdr_t) + sizeof(snmp_data_t);
  332. ws_send(c, h->buf, xlen, 1);
  333. }
  334. static void send_modbus(web_handle_t *h, mg_conn_t *c)
  335. {
  336. paras_data_t* para=paras_get();
  337. pkt_hdr_t *hdr=NULL;
  338. hdr = (pkt_hdr_t*)h->buf;
  339. hdr->magic = PKT_MAGIC;
  340. hdr->addr = 0;
  341. hdr->type = PKT_TYPE_PARAS;
  342. hdr->nack = 0;
  343. hdr->subtype = SUB_TYPE_PARAS_MODBUS;
  344. hdr->flag = 0;
  345. hdr->dlen = 0;
  346. modbus_data_t data = {0};
  347. data = para->cas;
  348. hdr->dlen = sizeof(modbus_data_t);
  349. memcpy(hdr->data,&data,hdr->dlen);
  350. uint32_t xlen = sizeof(pkt_hdr_t) + sizeof(modbus_data_t);
  351. ws_send(c, h->buf, xlen, 1);
  352. }
  353. static void send_sys(web_handle_t *h, mg_conn_t *c)
  354. {
  355. time_t t=time(NULL);
  356. struct tm *tm=localtime(&t);
  357. char date[40] = {0};
  358. char _time[40] = {0};
  359. snprintf(date, 40, "%04d%/%02d/%02d", (tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday);
  360. snprintf(_time, 40, "%02d%:%02d:%02d", tm->tm_hour, tm->tm_min, tm->tm_sec);
  361. paras_data_t* para=paras_get();
  362. pkt_hdr_t *hdr=NULL;
  363. hdr = (pkt_hdr_t*)h->buf;
  364. hdr->magic = PKT_MAGIC;
  365. hdr->addr = 0;
  366. hdr->type = PKT_TYPE_PARAS;
  367. hdr->nack = 0;
  368. hdr->subtype = SUB_TYPE_PARAS_SYS;
  369. system_data_t data = {0};
  370. data.lang = para->sys.lang;
  371. data.tzone = (rt_tz_get()/3600);
  372. strcpy(data.ver,VERSION);
  373. data.route = para->misc.rotate;
  374. sprintf(data.sys_time,"%s %s",date,_time);
  375. memcpy(hdr->data, &data, sizeof(system_data_t));
  376. hdr->dlen = sizeof(system_data_t);
  377. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  378. ws_send(c, h->buf, xlen, 1);
  379. }
  380. static void send_dlist(web_handle_t *h, mg_conn_t *c)
  381. {
  382. int i,j=0,r;
  383. dev_list_t dl;
  384. slave_list_t sl;
  385. r = cascade_get_dlist(&dl);
  386. if(r==0) {
  387. sl.cnt = dl.cnt-1;
  388. if(sl.cnt>0) {
  389. for(i=1; i<dl.cnt; i++) {
  390. sl.addr[j++] = dl.slave[i].addr;
  391. }
  392. ws_send_pkt(h, c, 0, PKT_TYPE_POWER_TOTAL, &sl, 1+sl.cnt, 1);
  393. }
  394. cascade_free_dlist(&dl);
  395. }
  396. }
  397. static int ws_handle(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
  398. {
  399. int r=0;
  400. if (!is_ws(c)) {
  401. return -1;
  402. }
  403. if(hdr->magic!=PKT_MAGIC) {
  404. LOGE("___ magic: 0x%x is wrong!, correct is: 0x%x\n", hdr->magic, PKT_MAGIC);
  405. return -1;
  406. }
  407. if(hdr->addr>0 && h->cur_addr!=hdr->addr) {
  408. //paras_data_t *p=paras_get();
  409. //cascade_reinit();
  410. }
  411. //LOGD("_____ ws handle, type: %d, flag: %d\n", hdr->type, hdr->flag);
  412. switch(hdr->type) {
  413. case PKT_TYPE_PARAS:
  414. {
  415. int flag=0;
  416. paras_data_t* para=paras_get();
  417. switch(hdr->subtype) {
  418. case SUB_TYPE_PARAS_SYS:
  419. {
  420. if(hdr->dlen>0) {
  421. system_data_t *sys=(system_data_t*)hdr->data;
  422. if(sys->lang<LANG_ID_MAX && sys->lang!=para->sys.lang) {
  423. para->sys.lang = sys->lang;
  424. }
  425. if(sys->tzone<LANG_ID_MAX && sys->tzone!=para->sys.tzone) {
  426. para->sys.tzone = sys->tzone;
  427. rt_tz_set(para->sys.tzone*3600);
  428. }
  429. char str[32] = {0};
  430. int lenth = strlen(sys->sys_time);
  431. for(int i = 0; i < lenth;i++)
  432. {
  433. if(sys->sys_time[i] <'0' || sys->sys_time[i] > '9')
  434. {
  435. sys->sys_time[i]=' ';
  436. }
  437. }
  438. if(sys->route == 90 || sys->route == 180 || sys->route == 0 || sys->route == 270)
  439. {
  440. if(para->misc.rotate != sys->route)
  441. {
  442. para->misc.rotate = sys->route;
  443. lcd_rotate(sys->route);
  444. }
  445. }
  446. sprintf(str,"date %s",sys->sys_time);
  447. system(str);
  448. paras_save();
  449. }else
  450. {
  451. send_sys(h, c);
  452. }
  453. }
  454. break;
  455. case SUB_TYPE_PARAS_MODBUS:
  456. {
  457. if(hdr->dlen>0) {
  458. modbus_data_t *p=(modbus_data_t*)hdr->data;
  459. // cascade_reinit(p->mode, p->addr, p->baud);
  460. para->cas = *p;
  461. // paras_save();
  462. cascade_reset(p->mode,p->addr);
  463. }else
  464. {
  465. send_modbus(h, c);
  466. }
  467. }
  468. break;
  469. case SUB_TYPE_PARAS_MISC:
  470. {
  471. if(hdr->dlen>0) {
  472. misc_data_t *p=(misc_data_t*)hdr->data;
  473. if(p->rotate!=para->misc.rotate) {
  474. lcd_rotate(p->rotate);
  475. }
  476. para->misc = *p;
  477. paras_save();
  478. }else
  479. {
  480. send_misc(h, c);
  481. }
  482. }
  483. break;
  484. case SUB_TYPE_PARAS_PROD:
  485. {
  486. if(hdr->dlen>0) {
  487. //product_data_t *p=(product_data_t*)hdr->data;
  488. }else
  489. {
  490. }
  491. }
  492. break;
  493. case SUB_TYPE_PARAS_SERV:
  494. {
  495. if(hdr->dlen>0) {
  496. }else
  497. {
  498. }
  499. // service_data_t *p=(service_data_t*)hdr->data;
  500. }
  501. break;
  502. case SUB_TYPE_PARAS_NETWORK:
  503. {
  504. if(hdr->dlen>0) {
  505. network_data_t *p=(network_data_t*)hdr->data;
  506. if(sys_ip_check(p->ipaddr) &&
  507. sys_ip_check(p->dns1) &&
  508. sys_ip_check(p->dns2) &&
  509. sys_ip_check(p->mask) &&
  510. sys_ip_check(p->gateway) &&
  511. (p->mode < 2))
  512. {
  513. paras_data_t *para = paras_get();
  514. net_ipaddr_set(p);
  515. para->netwk = *p;
  516. paras_save();
  517. }
  518. }else
  519. {
  520. send_net(h, c);
  521. }
  522. // extern void set_dns(uint8_t dns_num, char* dns_server);
  523. // extern void set_if(char* netif_name, char* ip_addr, char* gw_addr, char* nm_addr);
  524. // set_if("e0", p->ipaddr, p->gateway, p->mask);
  525. // set_dns(0, p->dns1);
  526. // set_dns(1, p->dns2);
  527. }
  528. break;
  529. case SUB_TYPE_PARAS_SNMP:
  530. {
  531. if(hdr->dlen>0) {
  532. snmp_data_t *p=(snmp_data_t*)hdr->data;
  533. paras_data_t *para = paras_get();
  534. strcpy(para->snmp.publics,p->publics);
  535. strcpy(para->snmp.nms_ip,p->nms_ip);
  536. para->snmp = *p;
  537. snmp_strap_set();
  538. paras_save();
  539. }else
  540. {
  541. send_smnp(h, c);
  542. }
  543. }
  544. break;
  545. }
  546. }
  547. break;
  548. case PKT_TYPE_POWER_CH:
  549. {
  550. if(hdr->dlen>0) {
  551. power_ch_t *pch=(power_ch_t*)hdr->data;
  552. switch(hdr->subtype) {
  553. case SUB_TYPE_POWER_SWITCH:
  554. {
  555. if(hdr->addr==0) {
  556. //r = power_set_ch_sw(pch->info.ch, pch->power[0].status);
  557. power_set_ch_sw_n(pch);
  558. //set_stick = rt_tick_get();
  559. }
  560. else {
  561. }
  562. }
  563. break;
  564. case SUB_TYPE_POWER_ALARM:
  565. {
  566. if(hdr->addr==0) {
  567. r = power_set_alarm(pch);
  568. }
  569. else {
  570. }
  571. }
  572. break;
  573. case SUB_TYPE_POWER_THRESHOLD:
  574. {
  575. if(hdr->addr==0) {
  576. r = power_set_threshold(pch);
  577. }
  578. }
  579. break;
  580. case SUB_TYPE_POWER_OPEN_DELAY:
  581. {
  582. if(hdr->addr==0) {
  583. r = power_set_open_delay(pch);
  584. }
  585. else {
  586. }
  587. }
  588. break;
  589. case SUB_TYPE_POWER_CLOSE_DELAY:
  590. {
  591. if(hdr->addr==0) {
  592. r = power_set_close_delay(pch);
  593. }
  594. else {
  595. }
  596. }
  597. break;
  598. case SUB_TYPE_POWER_CONSUMER_CLEAR:
  599. {
  600. if(hdr->addr==0) {
  601. r = power_set_clear_consumer(pch);
  602. }
  603. else {
  604. }
  605. }
  606. }
  607. }
  608. else {
  609. send_powerc(h, c, hdr->addr);
  610. time_t t=time(NULL);
  611. //LOGD("_____ send_powerc time=%ld\n",t);
  612. }
  613. }
  614. break;
  615. case PKT_TYPE_POWER_TOTAL:
  616. {
  617. send_powert(h, c, hdr->addr);
  618. time_t t=time(NULL);
  619. //LOGD("xxxxxxx send_powert time=%ld\n",t);
  620. }
  621. break;
  622. case PKT_TYPE_CH_ALL:
  623. {
  624. if(hdr->addr==0) {
  625. power_set_all_sw(hdr->flag);
  626. }
  627. else {
  628. }
  629. }
  630. break;
  631. case PKT_TYPE_POWER_RESET:
  632. {
  633. if(hdr->addr==0) {
  634. r = power_reset();
  635. }
  636. else {
  637. }
  638. }
  639. break;
  640. case PKT_TYPE_SCAN:
  641. {
  642. if(hdr->addr==0) {
  643. r = power_scan();
  644. }
  645. else {
  646. }
  647. }
  648. break;
  649. case PKT_TYPE_FACTORY:
  650. {
  651. if(hdr->addr==0) {
  652. //r = power_scan();
  653. }
  654. else {
  655. }
  656. }
  657. break;
  658. case PKT_TYPE_SENSOR:
  659. {
  660. if(hdr->dlen>0) {
  661. }else
  662. send_sensor(h, c, hdr->addr);
  663. }
  664. break;
  665. case PKT_TYPE_BREAKER:
  666. {
  667. send_breaker(h, c, hdr->addr);
  668. }
  669. break;
  670. case PKT_TYPE_FILE:
  671. {
  672. }
  673. break;
  674. case PKT_TYPE_SLAVE_LIST:
  675. {
  676. send_dlist(h, c);
  677. }
  678. break;
  679. case PKT_TYPE_ALARM:
  680. {
  681. if(hdr->flag>0) {
  682. }else
  683. {
  684. send_his_alarm(h, c, hdr->addr);
  685. }
  686. }
  687. break;
  688. default:
  689. break;
  690. }
  691. }
  692. static int connect_count = 0;
  693. static void http_fn(mg_conn_t *c, int ev, void *ev_data)
  694. {
  695. int r,flag=0;
  696. web_handle_t *h=&webHandle;
  697. // LOGD("connect --------%lx\n",c);
  698. #ifdef USE_MG716
  699. if (ev == MG_EV_HTTP_MSG) {
  700. struct mg_http_message *hm = (struct mg_http_message *) ev_data;
  701. if (mg_match(hm->uri, mg_str("/ws"), NULL)) {
  702. mg_ws_upgrade(c, hm, NULL);
  703. } else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
  704. // Serve REST response
  705. mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
  706. } else {
  707. struct mg_http_serve_opts opts = {.root_dir = h->rootDir};
  708. mg_http_serve_dir(c, hm, &opts);
  709. }
  710. }
  711. else if(ev == MG_EV_ACCEPT) {
  712. if (c->fn_data) {
  713. mg_tls_init(c, &h->tls);
  714. }
  715. paras_data_t *p=paras_get();
  716. ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  717. }
  718. else if(ev == MG_EV_WS_MSG) {
  719. struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
  720. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data.buf;
  721. ws_handle(h, hdr, c);
  722. }
  723. #else
  724. if (ev == MG_EV_HTTP_REQUEST) {
  725. mg_serve_http(c, (struct http_message *)ev_data, h->opts);
  726. }
  727. else if(ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE) {
  728. paras_data_t *p=paras_get();
  729. ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  730. set_timer(c, TIMER_INTERVAL);
  731. }
  732. else if(ev == MG_EV_WEBSOCKET_FRAME) {
  733. struct websocket_message *wm = (struct websocket_message *) ev_data;
  734. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data;
  735. ws_handle(h, hdr, c);
  736. }
  737. else if(ev==MG_EV_TIMER) {
  738. // list_node_t *ln=NULL;
  739. // r = list_take_node(h->list, &ln, 0);
  740. // if(r==0) {
  741. // node_t *n=&ln->data;
  742. // ws_send_pkt(h, c, 0, n->tp, n->buf, n->dlen, 1);
  743. // list_back_node(h->list, ln);
  744. // }
  745. // struct websocket_message *wm = (struct websocket_message *) ev_data;
  746. // pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data;
  747. // send_powerc(h, c, hdr->addr);
  748. //LOGD("send powerch!!!\n");
  749. }
  750. #endif
  751. }
  752. static void timer_fn(void *arg)
  753. {
  754. LOGD("timer!!!!\n");
  755. //web_handle_t *h=(web_handle_t*)arg;
  756. //send_powerc(h, h->mgr.active_connections, 0);
  757. }
  758. static void web_thread(void *arg)
  759. {
  760. mg_conn_t *nc;
  761. const char *http_addr="http://[::]:80";
  762. const char *https_addr="https://[::]:443";
  763. thread_handle_t *th=(thread_handle_t*)arg;
  764. web_handle_t *h=(web_handle_t*)th->attr->arg;
  765. strcpy(h->rootDir, "/nor/web");
  766. //cs_log_set_level(3);
  767. #ifdef USE_MG716
  768. mg_log_set(MG_LL_VERBOSE);
  769. mg_mgr_init(&h->mgr);
  770. mg_timer_add(&h->mgr, TIMER_INTERVAL, MG_TIMER_REPEAT, timer_fn, h);
  771. if (mg_http_listen(&h->mgr, http_addr, http_fn, NULL) == NULL) {
  772. MG_ERROR(("cannot listen on %s\n", http_addr));
  773. }
  774. //if (mg_http_listen(&h->mgr, https_addr, http_fn, (void*)1) == NULL) {
  775. // MG_ERROR(("cannot listen on %s\n", https_addr));
  776. //}
  777. //mh->tls.cert = mg_str(file_load2("/root/run/app/cert/server.crt",0));
  778. //mh->tls.key = mg_str(file_load2("/root/run/app/cert/server.key",0));
  779. //mh->tls.name = mg_url_host(https_addr);
  780. #else
  781. mg_mgr_init(&h->mgr, NULL);
  782. nc = mg_bind(&h->mgr, "80", http_fn);
  783. strcpy(h->rootDir, "/nor/web");
  784. mg_set_protocol_http_websocket(nc);
  785. h->opts.document_root = h->rootDir;
  786. h->opts.enable_directory_listing = "yes";
  787. #endif
  788. //mg_set_timer(nc,500);
  789. //mg_timer_add(&h->mgr, 500, MG_TIMER_REPEAT, timer_fn, h);
  790. while(th->quit==0) {
  791. mg_mgr_poll(&h->mgr, 300);
  792. }
  793. mg_mgr_free(&h->mgr);
  794. }
  795. int web_init(void)
  796. {
  797. list_cfg_t lc={0,0,10};
  798. web_handle_t *h=&webHandle;
  799. memset(h, 0, sizeof(web_handle_t));
  800. h->list = list_init(&lc);
  801. h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)*ONCE_SEND_CNT+8;
  802. h->buf = (char*)malloc(h->buflen);
  803. thread_start(THREAD_ID_WEB, web_thread, h);
  804. return 0;
  805. }
  806. int web_post(int type, void *data, int len)
  807. {
  808. struct mg_connection *c;
  809. web_handle_t *h=&webHandle;
  810. return list_append(h->list, type, data, len);
  811. }