web.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998
  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. }
  446. if(sys->tzone<LANG_ID_MAX && sys->tzone!=para->sys.tzone) {
  447. para->sys.tzone = sys->tzone;
  448. rt_tz_set(para->sys.tzone*3600);
  449. }
  450. char str[32] = {0};
  451. int lenth = strlen(sys->sys_time);
  452. for(int i = 0; i < lenth;i++)
  453. {
  454. if(sys->sys_time[i] <'0' || sys->sys_time[i] > '9')
  455. {
  456. sys->sys_time[i]=' ';
  457. }
  458. }
  459. if(sys->route == 90 || sys->route == 180 || sys->route == 0 || sys->route == 270)
  460. {
  461. if(para->misc.rotate != sys->route)
  462. {
  463. para->misc.rotate = sys->route;
  464. lcd_rotate(sys->route);
  465. }
  466. }
  467. sprintf(str,"date %s",sys->sys_time);
  468. system(str);
  469. paras_save();
  470. }else
  471. {
  472. send_sys(h, c);
  473. }
  474. }
  475. break;
  476. case SUB_TYPE_PARAS_MODBUS:
  477. {
  478. if(hdr->dlen>0) {
  479. modbus_data_t *p=(modbus_data_t*)hdr->data;
  480. // cascade_reinit(p->mode, p->addr, p->baud);
  481. para->cas = *p;
  482. // paras_save();
  483. cascade_reset(p->mode,p->addr);
  484. }else
  485. {
  486. send_modbus(h, c);
  487. }
  488. }
  489. break;
  490. case SUB_TYPE_PARAS_MISC:
  491. {
  492. if(hdr->dlen>0) {
  493. misc_data_t *p=(misc_data_t*)hdr->data;
  494. if(p->rotate!=para->misc.rotate) {
  495. lcd_rotate(p->rotate);
  496. }
  497. para->misc = *p;
  498. paras_save();
  499. }else
  500. {
  501. send_misc(h, c);
  502. }
  503. }
  504. break;
  505. case SUB_TYPE_PARAS_PROD:
  506. {
  507. if(hdr->dlen>0) {
  508. //product_data_t *p=(product_data_t*)hdr->data;
  509. }else
  510. {
  511. send_product(h, c);
  512. }
  513. }
  514. break;
  515. case SUB_TYPE_PARAS_SERV:
  516. {
  517. if(hdr->dlen>0) {
  518. }else
  519. {
  520. }
  521. // service_data_t *p=(service_data_t*)hdr->data;
  522. }
  523. break;
  524. case SUB_TYPE_PARAS_NETWORK:
  525. {
  526. if(hdr->dlen>0) {
  527. network_data_t *p=(network_data_t*)hdr->data;
  528. if(sys_ip_check(p->ipaddr) &&
  529. sys_ip_check(p->dns1) &&
  530. sys_ip_check(p->dns2) &&
  531. sys_ip_check(p->mask) &&
  532. sys_ip_check(p->gateway) &&
  533. (p->mode < 2))
  534. {
  535. paras_data_t *para = paras_get();
  536. net_ipaddr_set(p);
  537. para->netwk = *p;
  538. paras_save();
  539. }
  540. }else
  541. {
  542. send_net(h, c);
  543. }
  544. // extern void set_dns(uint8_t dns_num, char* dns_server);
  545. // extern void set_if(char* netif_name, char* ip_addr, char* gw_addr, char* nm_addr);
  546. // set_if("e0", p->ipaddr, p->gateway, p->mask);
  547. // set_dns(0, p->dns1);
  548. // set_dns(1, p->dns2);
  549. }
  550. break;
  551. case SUB_TYPE_PARAS_SNMP:
  552. {
  553. if(hdr->dlen>0) {
  554. snmp_data_t *p=(snmp_data_t*)hdr->data;
  555. paras_data_t *para = paras_get();
  556. strcpy(para->snmp.publics,p->publics);
  557. strcpy(para->snmp.nms_ip,p->nms_ip);
  558. para->snmp = *p;
  559. snmp_strap_set();
  560. paras_save();
  561. }else
  562. {
  563. send_smnp(h, c);
  564. }
  565. }
  566. break;
  567. }
  568. }
  569. break;
  570. case PKT_TYPE_POWER_CH:
  571. {
  572. if(hdr->dlen>0) {
  573. power_ch_t *pch=(power_ch_t*)hdr->data;
  574. switch(hdr->subtype) {
  575. case SUB_TYPE_POWER_SWITCH:
  576. {
  577. if(hdr->addr==0) {
  578. //r = power_set_ch_sw(pch->info.ch, pch->power[0].status);
  579. power_set_ch_sw_n(pch);
  580. //set_stick = rt_tick_get();
  581. }
  582. else {
  583. }
  584. }
  585. break;
  586. case SUB_TYPE_POWER_ALARM:
  587. {
  588. if(hdr->addr==0) {
  589. r = power_set_alarm(pch);
  590. }
  591. else {
  592. }
  593. }
  594. break;
  595. case SUB_TYPE_POWER_THRESHOLD:
  596. {
  597. if(hdr->addr==0) {
  598. r = power_set_threshold(pch);
  599. }
  600. }
  601. break;
  602. case SUB_TYPE_POWER_OPEN_DELAY:
  603. {
  604. if(hdr->addr==0) {
  605. r = power_set_open_delay(pch);
  606. }
  607. else {
  608. }
  609. }
  610. break;
  611. case SUB_TYPE_POWER_CLOSE_DELAY:
  612. {
  613. if(hdr->addr==0) {
  614. r = power_set_close_delay(pch);
  615. }
  616. else {
  617. }
  618. }
  619. break;
  620. case SUB_TYPE_POWER_CONSUMER_CLEAR:
  621. {
  622. if(hdr->addr==0) {
  623. r = power_set_clear_consumer(pch);
  624. }
  625. else {
  626. }
  627. }
  628. break;
  629. case SUB_TYPE_POWER_PH_CFG:
  630. {
  631. if(hdr->addr==0) {
  632. power_set_ph_cfg(pch);
  633. }else
  634. {
  635. }
  636. }
  637. break;
  638. }
  639. }
  640. else {
  641. send_powerc(h, c, hdr->addr);
  642. time_t t=time(NULL);
  643. //LOGD("_____ send_powerc time=%ld\n",t);
  644. }
  645. }
  646. break;
  647. case PKT_TYPE_POWER_TOTAL:
  648. {
  649. send_powert(h, c, hdr->addr);
  650. time_t t=time(NULL);
  651. //LOGD("xxxxxxx send_powert time=%ld\n",t);
  652. }
  653. break;
  654. case PKT_TYPE_CH_ALL:
  655. {
  656. if(hdr->addr==0) {
  657. power_set_all_sw(hdr->flag);
  658. }
  659. else {
  660. }
  661. }
  662. break;
  663. case PKT_TYPE_POWER_RESET:
  664. {
  665. if(hdr->addr==0) {
  666. r = power_reset();
  667. }
  668. else {
  669. }
  670. }
  671. break;
  672. case PKT_TYPE_SCAN:
  673. {
  674. if(hdr->addr==0) {
  675. r = power_scan();
  676. }
  677. else {
  678. }
  679. }
  680. break;
  681. case PKT_TYPE_FACTORY:
  682. {
  683. if(hdr->addr==0) {
  684. //r = power_scan();
  685. }
  686. else {
  687. }
  688. }
  689. break;
  690. case PKT_TYPE_SENSOR:
  691. {
  692. if(hdr->dlen>0) {
  693. }else
  694. send_sensor(h, c, hdr->addr);
  695. }
  696. break;
  697. case PKT_TYPE_BREAKER:
  698. {
  699. send_breaker(h, c, hdr->addr);
  700. }
  701. break;
  702. case PKT_TYPE_FILE:
  703. {
  704. }
  705. break;
  706. case PKT_TYPE_SLAVE_LIST:
  707. {
  708. send_dlist(h, c);
  709. }
  710. break;
  711. case PKT_TYPE_ALARM:
  712. {
  713. if(hdr->flag>0) {
  714. }else
  715. {
  716. send_his_alarm(h, c, hdr->addr);
  717. }
  718. }
  719. break;
  720. default:
  721. break;
  722. }
  723. }
  724. static int connect_count = 0;
  725. static void http_fn(mg_conn_t *c, int ev, void *ev_data)
  726. {
  727. int r,flag=0;
  728. web_handle_t *h=&webHandle;
  729. // LOGD("connect --------%lx\n",c);
  730. #ifdef USE_MG716
  731. if (ev == MG_EV_HTTP_MSG) {
  732. struct mg_http_message *hm = (struct mg_http_message *) ev_data;
  733. if (mg_match(hm->uri, mg_str("/ws"), NULL)) {
  734. mg_ws_upgrade(c, hm, NULL);
  735. } else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
  736. // Serve REST response
  737. mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
  738. } else {
  739. struct mg_http_serve_opts opts = {.root_dir = h->rootDir};
  740. mg_http_serve_dir(c, hm, &opts);
  741. }
  742. }
  743. else if(ev == MG_EV_ACCEPT) {
  744. if (c->fn_data) {
  745. mg_tls_init(c, &h->tls);
  746. }
  747. paras_data_t *p=paras_get();
  748. ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  749. }
  750. else if(ev == MG_EV_WS_MSG) {
  751. struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
  752. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data.buf;
  753. ws_handle(h, hdr, c);
  754. }else if(ev == MG_EV_CLOSE)
  755. {
  756. //mg_close_conn(c);
  757. }
  758. #else
  759. if (ev == MG_EV_HTTP_REQUEST) {
  760. mg_serve_http(c, (struct http_message *)ev_data, h->opts);
  761. }
  762. else if(ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE) {
  763. paras_data_t *p=paras_get();
  764. ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  765. set_timer(c, TIMER_INTERVAL);
  766. }
  767. else if(ev == MG_EV_WEBSOCKET_FRAME) {
  768. struct websocket_message *wm = (struct websocket_message *) ev_data;
  769. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data;
  770. ws_handle(h, hdr, c);
  771. }
  772. else if(ev==MG_EV_TIMER) {
  773. }
  774. #endif
  775. }
  776. static void web_thread(void *arg)
  777. {
  778. mg_conn_t *nc;
  779. const char *http_addr="http://[::]:80";
  780. const char *https_addr="https://[::]:443";
  781. thread_handle_t *th=(thread_handle_t*)arg;
  782. web_handle_t *h=(web_handle_t*)th->attr->arg;
  783. strcpy(h->rootDir, "/nor/web");
  784. //cs_log_set_level(3);
  785. #ifdef USE_MG716
  786. mg_log_set(MG_LL_ERROR);
  787. mg_mgr_init(&h->mgr);
  788. //mg_timer_add(&h->mgr, TIMER_INTERVAL, MG_TIMER_REPEAT, timer_fn, h);
  789. if (mg_http_listen(&h->mgr, http_addr, http_fn, NULL) == NULL) {
  790. MG_ERROR(("cannot listen on %s\n", http_addr));
  791. }
  792. //if (mg_http_listen(&h->mgr, https_addr, http_fn, (void*)1) == NULL) {
  793. // MG_ERROR(("cannot listen on %s\n", https_addr));
  794. //}
  795. //mh->tls.cert = mg_str(file_load2("/root/run/app/cert/server.crt",0));
  796. //mh->tls.key = mg_str(file_load2("/root/run/app/cert/server.key",0));
  797. //mh->tls.name = mg_url_host(https_addr);
  798. #else
  799. mg_mgr_init(&h->mgr, NULL);
  800. nc = mg_bind(&h->mgr, "80", http_fn);
  801. strcpy(h->rootDir, "/nor/web");
  802. mg_set_protocol_http_websocket(nc);
  803. h->opts.document_root = h->rootDir;
  804. h->opts.enable_directory_listing = "yes";
  805. #endif
  806. //mg_set_timer(nc,500);
  807. //mg_timer_add(&h->mgr, 500, MG_TIMER_REPEAT, timer_fn, h);
  808. while(th->quit==0) {
  809. mg_mgr_poll(&h->mgr, 200);
  810. }
  811. mg_mgr_free(&h->mgr);
  812. }
  813. int web_init(void)
  814. {
  815. list_cfg_t lc={0,0,10};
  816. web_handle_t *h=&webHandle;
  817. memset(h, 0, sizeof(web_handle_t));
  818. h->list = list_init(&lc);
  819. h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)*ONCE_SEND_CNT+8;
  820. h->buf = (char*)malloc(h->buflen);
  821. thread_start(THREAD_ID_WEB, web_thread, h);
  822. return 0;
  823. }
  824. int web_post(int type, void *data, int len)
  825. {
  826. struct mg_connection *c;
  827. web_handle_t *h=&webHandle;
  828. return list_append(h->list, type, data, len);
  829. }