web.c 23 KB

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