web.c 22 KB

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