web.c 24 KB

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