web.c 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607
  1. #include "web.h"
  2. #include "mongoose.h"
  3. //#include "list.h"
  4. #include "time.h"
  5. #include "power.h"
  6. #include "paras.h"
  7. #include "sensor.h"
  8. //#include "breaker.h"
  9. #include "cascade.h"
  10. #include "cfg.h"
  11. #include "lcd.h"
  12. #include <stdio.h>
  13. #include "datadef.h"
  14. #include "cascade.h"
  15. #include "snmp.h"
  16. #include "net.h"
  17. #include "cfg.h"
  18. #include "lcd.h"
  19. //#include "wanning.h"
  20. #include "time.h"
  21. #include "cJSON.h"
  22. #include "json_handle.h"
  23. #include "md5.h"
  24. #include "clock.h"
  25. #include "FreeRTOS.h"
  26. #include "event_groups.h"
  27. #include "led.h"
  28. #include "beep.h"
  29. static char* g_product_t_ac_type_str[3] = {
  30. "L1",
  31. "L2",
  32. "L3",
  33. };
  34. #define TIMER_INTERVAL 1000
  35. #define ONCE_SEND_CNT 13
  36. #define FN_MAX 20
  37. typedef void (*http_fn_t)(void *arg);
  38. #define USE_MG716
  39. typedef struct mg_mgr mg_mgr_t;
  40. #ifdef USE_MG716
  41. typedef struct mg_tls_opts mg_tls_t;
  42. #endif
  43. typedef struct {
  44. http_fn_t f;
  45. char *uri;
  46. }mg_fn_t;
  47. typedef struct {
  48. // pthread_t tid;
  49. mg_mgr_t mgr;
  50. #ifdef USE_MG716
  51. mg_tls_t tls;
  52. #else
  53. mg_opts_t opts;
  54. #endif
  55. int cnt;
  56. mg_fn_t fn[FN_MAX];
  57. // handle_t list;
  58. char rootDir[MG_PATH_MAX];
  59. char *buf;
  60. int buflen;
  61. uint8_t cur_addr;
  62. }web_handle_t;
  63. typedef struct mg_connection mg_conn_t;
  64. #ifdef USE_MG716
  65. static void timer_fn(void *arg)
  66. {
  67. #if 0
  68. int r;
  69. web_handle_t *h=(web_handle_t*)arg;
  70. list_node_t *ln=NULL;
  71. mg_conn_t* c;
  72. r = list_take_node(h->list, &ln, 0);
  73. if(r==0) {
  74. node_t *n=&ln->data;
  75. for (c = h->mgr.conns; c != NULL; c = c->next) {
  76. //ws_send_pkt(h, c, n->tp, n->buf, n->dlen, 1);
  77. }
  78. list_back_node(h->list, ln);
  79. }
  80. #endif
  81. }
  82. #else
  83. typedef struct mg_serve_http_opts mg_opts_t;
  84. #define MG_PATH_MAX 128
  85. static void set_timer(struct mg_connection *c, int ms)
  86. {
  87. mg_set_timer(c, mg_time()+ms/1000.0f);
  88. }
  89. #endif
  90. typedef struct {
  91. struct mg_connection *c;
  92. int ev;
  93. void *ev_data;
  94. }mg_stream_t;
  95. static web_handle_t webHandle={0};
  96. static void httpAddCallback(char *uri, http_fn_t f)
  97. {
  98. //mg_handle_t *h=&webHandle.mg;
  99. if(webHandle.cnt<FN_MAX-1) {
  100. webHandle.fn[webHandle.cnt].uri = uri;
  101. webHandle.fn[webHandle.cnt].f = f;
  102. webHandle.cnt++;
  103. }
  104. }
  105. static int http_reply(void *conn, int status, char *ack)
  106. {
  107. int r=0;
  108. mg_stream_t *s=(mg_stream_t*)conn;
  109. r = mg_http_reply2(s->c, status, "", ack);
  110. return r;
  111. }
  112. static int is_ws(mg_conn_t *c)
  113. {
  114. int r=0;
  115. #ifdef USE_MG716
  116. r = c->is_websocket?1:0;
  117. #else
  118. r = (c->flags & MG_F_IS_WEBSOCKET)?1:0;
  119. #endif
  120. return r;
  121. }
  122. static int ws_send(mg_conn_t *c, void *data, int len, int isbin)
  123. {
  124. if(!c || !data || len<=0) {
  125. return -1;
  126. }
  127. //LOGD("____ws_send, len: %d\n", len);
  128. #ifdef USE_MG716
  129. mg_ws_send(c, data, len, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT);
  130. #else
  131. mg_send_websocket_frame(c, isbin?WEBSOCKET_OP_BINARY:WEBSOCKET_OP_TEXT, data, len);
  132. #endif
  133. return 0;
  134. }
  135. static void send_user_info(web_handle_t *h, mg_conn_t *c)
  136. {
  137. pkt_hdr_t *hdr=NULL;
  138. hdr = (pkt_hdr_t*)h->buf;
  139. wb_send_user_t *data1 = (wb_send_user_t *)(&hdr->data);
  140. memset(data1,0,sizeof(wb_send_user_t));
  141. paras_data_t* para=paras_get();
  142. user_data_t *data = &para->user;
  143. data1->count = data->user_count;
  144. for(int i = 0; i < data->user_count;i++)
  145. {
  146. data1->users[i].roul_id = data->config[i].role_id;
  147. strcpy(data1->users[i].user,data->config[i].user_name);
  148. strcpy(data1->users[i].date,data->config[i].date);
  149. strcpy(data1->users[i].time,data->config[i].time);
  150. }
  151. hdr->magic = PKT_MAGIC;
  152. hdr->addr = 0;
  153. hdr->type = NEW_PKT_TYPE_USER;
  154. hdr->nack = 0;
  155. hdr->subtype = 0;
  156. hdr->dlen = data1->count * sizeof(user_t) + sizeof(data1->count);
  157. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  158. ws_send(c, h->buf, xlen, 1);
  159. }
  160. static void send_add_user_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  161. {
  162. char date[32]={0};
  163. char time_s[32] = {0};
  164. unsigned char digest[16]={0};
  165. char output[34] = {0};
  166. md5_ctx_t ctx={0};
  167. uint8_t flag = USER_SUCCESS;
  168. web_user_add_t * user_add = (web_user_add_t *)&(ctrl->user_add);
  169. pkt_hdr_t *hdr=(pkt_hdr_t*)(h->buf);
  170. paras_data_t* para=paras_get();
  171. printf("hdr = %x\n",(uint32_t)hdr);
  172. time_t t=time(NULL);
  173. struct tm *tm=localtime(&t);
  174. hdr->magic = PKT_MAGIC;
  175. hdr->addr = 0;
  176. hdr->type = NEW_PKT_TYPE_USER;
  177. hdr->nack = 0;
  178. hdr->subtype = NEW_SUB_PKT_TYPE_USER_ADD;
  179. hdr->dlen = 1;
  180. sprintf(date,"%04d%/%02d/%02d",(tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday);
  181. sprintf(time_s,"%02d%:%02d:%02d",tm->tm_hour, tm->tm_min, tm->tm_sec);
  182. for(int i = 0; i < para->user.user_count;i++)
  183. {
  184. if(strcmp(user_add->user,para->user.config[i].user_name) == 0)
  185. {
  186. flag = USER_EXIST; //user_add exist
  187. break;
  188. }
  189. }
  190. if(flag == 0)
  191. {
  192. if(para->user.user_count >= 10)
  193. {
  194. flag = USER_OVER_TEN;
  195. }else
  196. {
  197. para->user.user_count++;
  198. strcpy(para->user.config[para->user.user_count-1].user_name,user_add->user);
  199. para->user.config[para->user.user_count-1].role_id = user_add->permition;
  200. strcpy(para->user.config[para->user.user_count-1].date,date);
  201. strcpy(para->user.config[para->user.user_count-1].time,time_s);
  202. md5_init(&ctx);
  203. //mbedtls_md5_starts(&ctx);
  204. md5_update(&ctx, (uint8_t*)user_add->password, strlen(user_add->password));
  205. md5_final(&ctx, digest);
  206. //md5_free(&ctx);
  207. for (int k = 0; k < 16; k++) {
  208. sprintf(&output[k * 2], "%02x", digest[k]);
  209. }
  210. output[33] = '\0';
  211. strcpy(para->user.config[para->user.user_count-1].password_md5,output);
  212. paras_user_save();
  213. }
  214. }
  215. uint8_t *data = (uint8_t *)(&hdr->data);
  216. *data = flag;
  217. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  218. ws_send(c, h->buf, xlen, 1);
  219. //printf("send len = %d\n",xlen);
  220. }
  221. static void send_user_delete_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  222. {
  223. web_user_delete_t * user_delete = &ctrl->user_delete;
  224. pkt_hdr_t *hdr=NULL;
  225. hdr = (pkt_hdr_t*)h->buf;
  226. uint8_t flag = USER_DELETE_SUCCESS;
  227. paras_data_t* para=paras_get();
  228. user_data_t back_user = {0};
  229. int j = 0;
  230. for(int i = 0;i < para->user.user_count;i++)
  231. {
  232. if(strcmp(para->user.config[i].user_name,user_delete->user) == 0)
  233. {
  234. }else
  235. {
  236. back_user.config[j++] = para->user.config[i];
  237. }
  238. }
  239. back_user.user_count = j;
  240. //memset(&para->user,0,sizeof(para->user));
  241. para->user = back_user;
  242. paras_user_save();
  243. uint8_t *data = (uint8_t *)(&hdr->data);
  244. hdr->magic = PKT_MAGIC;
  245. hdr->addr = 0;
  246. hdr->type = NEW_PKT_TYPE_USER;
  247. hdr->nack = 0;
  248. hdr->subtype = NEW_SUB_PKT_TYPE_USER_DELETE;
  249. hdr->dlen = 1;
  250. *data = flag;
  251. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  252. ws_send(c, h->buf, xlen, 1);
  253. }
  254. static void send_user_update_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  255. {
  256. web_user_update_t *user_update = &ctrl->user_update;
  257. pkt_hdr_t *hdr=NULL;
  258. hdr = (pkt_hdr_t*)h->buf;
  259. uint8_t flag = USER_DELETE_SUCCESS;
  260. paras_data_t* para=paras_get();
  261. unsigned char digest[16]={0};
  262. char output[34] = {0};
  263. md5_ctx_t ctx={0};
  264. for(int i = 0; i < para->user.user_count;i++)
  265. {
  266. if(strcmp(user_update->user,para->user.config[i].user_name) == 0)
  267. {
  268. md5_init(&ctx);
  269. md5_update(&ctx, (uint8_t*)user_update->old_password, strlen(user_update->old_password));
  270. md5_final(&ctx, digest);
  271. for (int k = 0; k < 16; k++) {
  272. sprintf(&output[k * 2], "%02x", digest[k]);
  273. }
  274. output[33] = '\0';
  275. if(strcmp(output,para->user.config[i].password_md5) == 0)
  276. {
  277. md5_init(&ctx);
  278. md5_update(&ctx, (uint8_t *)user_update->new_password, strlen(user_update->new_password));
  279. md5_final(&ctx, digest);
  280. for (int k = 0; k < 16; k++) {
  281. sprintf(&output[k * 2], "%02x", digest[k]);
  282. }
  283. output[33] = '\0';
  284. strcpy(para->user.config[i].password_md5,output);
  285. paras_user_save();
  286. }else
  287. {
  288. flag = USER_UPDATE_PASSERR;
  289. }
  290. break;
  291. }
  292. }
  293. uint8_t *data = (uint8_t *)(&hdr->data);
  294. hdr->magic = PKT_MAGIC;
  295. hdr->addr = 0;
  296. hdr->type = NEW_PKT_TYPE_USER;
  297. hdr->nack = 0;
  298. hdr->subtype = NEW_SUB_PKT_TYPE_USER_UPDATE;
  299. hdr->dlen = 1;
  300. *data = flag;
  301. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  302. ws_send(c, h->buf, xlen, 1);
  303. }
  304. static void send_login_func(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  305. {
  306. pkt_hdr_t *hdr=NULL;
  307. hdr = (pkt_hdr_t*)h->buf;
  308. uint8_t flag = 0;
  309. uint8_t *data = (uint8_t *)(&hdr->data);
  310. paras_data_t* para=paras_get();
  311. unsigned char digest[16]={0};
  312. char output[34] = {0};
  313. md5_ctx_t ctx={0};
  314. for(int i = 0; i < para->user.user_count;i++)
  315. {
  316. if(strcmp(ctrl->login.user,para->user.config[i].user_name) == 0)
  317. {
  318. md5_init(&ctx);
  319. md5_update(&ctx, (unsigned char *)ctrl->login.password, strlen(ctrl->login.password));
  320. md5_final(&ctx, digest);
  321. for (int k = 0; k < 16; k++) {
  322. sprintf(&output[k * 2], "%02x", digest[k]);
  323. }
  324. output[33] = '\0';
  325. if(strcmp(output,para->user.config[i].password_md5) == 0)
  326. {
  327. flag = 1;
  328. }else
  329. {
  330. flag = 2;
  331. }
  332. //printf("user=%s output: %s\n",ctrl->login.user,output);
  333. break;
  334. }
  335. }
  336. hdr->magic = PKT_MAGIC;
  337. hdr->addr = 0;
  338. hdr->type = MEW_PKT_TYPE_LOGIN;
  339. hdr->nack = 0;
  340. hdr->subtype = 0;
  341. hdr->dlen = 1;
  342. *data = flag;
  343. uint32_t xlen = sizeof(uint8_t) + sizeof(pkt_hdr_t);
  344. ws_send(c, h->buf, xlen, 1);
  345. }
  346. static void send_sys(web_handle_t *h, mg_conn_t *c)
  347. {
  348. time_t t=time(NULL);
  349. struct tm *tm=localtime(&t);
  350. paras_data_t* para=paras_get();
  351. pkt_hdr_t *hdr=NULL;
  352. hdr = (pkt_hdr_t*)h->buf;
  353. hdr->magic = PKT_MAGIC;
  354. hdr->addr = 0;
  355. hdr->type = NEW_PKT_TYPE_DEVICE_INFO;
  356. hdr->nack = 0;
  357. hdr->subtype = 0;
  358. web_device_info_t *data_info = (web_device_info_t *)(&hdr->data);
  359. memset(data_info,0,sizeof(web_device_info_t));
  360. sprintf(data_info->date,"%04d%/%02d/%02d",(tm->tm_year+1900), tm->tm_mon+1, tm->tm_mday);
  361. sprintf(data_info->time,"%02d%:%02d:%02d",tm->tm_hour, tm->tm_min, tm->tm_sec);
  362. data_info->zone = (fr_tz_get()/3600);
  363. strcpy(data_info->soft_version,SOFT_VERSION);
  364. strcpy(data_info->hard_version,SOFT_VERSION);
  365. data_info->chs = power_get_all()->chs;
  366. data_info->board_cnt = power_data_get_board_cnt();
  367. data_info->power_type = para->prod.type;
  368. hdr->dlen = sizeof(web_device_info_t);
  369. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  370. ws_send(c, h->buf, xlen, 1);
  371. }
  372. static void reboot_sys(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  373. {
  374. (void)h;
  375. (void)c;
  376. (void)ctrl;
  377. //system("reboot");
  378. NVIC_SystemReset();
  379. }
  380. static void send_sensor_info(web_handle_t *h, mg_conn_t *c)
  381. {
  382. pkt_hdr_t *hdr=NULL;
  383. hdr = (pkt_hdr_t*)h->buf;
  384. hdr->magic = PKT_MAGIC;
  385. hdr->addr = 0;
  386. hdr->type = NEW_PKT_TYPE_SENSOR;
  387. hdr->nack = 0;
  388. hdr->subtype = 0;
  389. web_sensor_info_t *sensor_info = (web_sensor_info_t *)(&hdr->data);
  390. sensor_all_t *sensor = sensor_get_data();
  391. memset(sensor_info,0,sizeof(web_sensor_info_t)*4);
  392. strcpy(sensor_info[0].name,sensor->data[0].info.name);
  393. sensor_info[0].status = sensor->data[0].info.status;
  394. sensor_info[0].value = sensor->data[0].val[0].value;
  395. sensor_info[0].v_max = sensor->data[0].val[0].thr.max;
  396. sensor_info[0].v_min = sensor->data[0].val[0].thr.min;
  397. sensor_info[0].v_max_wrn = sensor->data[0].val[0].s_alarm.max_up;
  398. sensor_info[0].v_min_wrn = sensor->data[0].val[0].s_alarm.min_down;
  399. strcpy(sensor_info[1].name,sensor->data[0].info.name);
  400. sensor_info[1].status = sensor->data[0].info.status;
  401. sensor_info[1].value = sensor->data[0].val[1].value;
  402. sensor_info[1].v_max = sensor->data[0].val[1].thr.max;
  403. sensor_info[1].v_min = sensor->data[0].val[1].thr.min;
  404. sensor_info[1].v_max_wrn = sensor->data[0].val[1].s_alarm.max_up;
  405. sensor_info[1].v_min_wrn = sensor->data[0].val[1].s_alarm.min_down;
  406. strcpy(sensor_info[2].name,sensor->data[1].info.name);
  407. sensor_info[2].status = sensor->data[1].info.status;
  408. sensor_info[2].value = sensor->data[1].val[0].value;
  409. sensor_info[2].v_max = sensor->data[1].val[0].thr.max;
  410. sensor_info[2].v_min = sensor->data[1].val[0].thr.min;
  411. sensor_info[2].v_max_wrn = sensor->data[1].val[0].s_alarm.max_up;
  412. sensor_info[2].v_min_wrn = sensor->data[1].val[0].s_alarm.min_down;
  413. strcpy(sensor_info[3].name,sensor->data[2].info.name);
  414. sensor_info[3].status = sensor->data[2].info.status;
  415. sensor_info[3].value = sensor->data[2].val[0].value;
  416. sensor_info[3].v_max = sensor->data[2].val[0].thr.max;
  417. sensor_info[3].v_min = sensor->data[2].val[0].thr.min;
  418. sensor_info[3].v_max_wrn = sensor->data[2].val[0].s_alarm.max_up;
  419. sensor_info[3].v_min_wrn = sensor->data[2].val[0].s_alarm.min_down;
  420. hdr->dlen = sizeof(web_sensor_info_t) * 4;
  421. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  422. ws_send(c, h->buf, xlen, 1);
  423. }
  424. static void send_power_info(web_handle_t *h, mg_conn_t *c)
  425. {
  426. pkt_hdr_t *hdr=NULL;
  427. hdr = (pkt_hdr_t*)h->buf;
  428. hdr->magic = PKT_MAGIC;
  429. hdr->addr = 0;
  430. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  431. hdr->nack = 0;
  432. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_INFO;
  433. info_new_t *power_info = (info_new_t *)(&hdr->data);
  434. power_handle_new_t *p_handle = power_get_all();
  435. // lock_on(p_handle->lck);
  436. int chn = p_handle->chs;
  437. //max translate 32
  438. for(int i = 0; i < chn;i++)
  439. {
  440. power_info[i] = p_handle->pch[i].info;
  441. }
  442. // lock_off(p_handle->lck);
  443. hdr->dlen = sizeof(info_new_t) * chn;
  444. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  445. ws_send(c, h->buf, xlen, 1);
  446. }
  447. static void send_power_all(web_handle_t *h, mg_conn_t *c)
  448. {
  449. pkt_hdr_t *hdr=NULL;
  450. hdr = (pkt_hdr_t*)h->buf;
  451. hdr->magic = PKT_MAGIC;
  452. hdr->addr = 0;
  453. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  454. hdr->nack = 0;
  455. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_ALL;
  456. power_t *power_all = (power_t *)(&hdr->data);
  457. power_handle_new_t *p_handle = power_get_all();
  458. // lock_on(p_handle->lck);
  459. power_all[0] = p_handle->total.all;
  460. for(int i =0;i < 3;i++)
  461. {
  462. power_all[i+1] = p_handle->total.all_l[i];
  463. }
  464. // lock_off(p_handle->lck);
  465. hdr->dlen = sizeof(power_t) * 4;
  466. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  467. ws_send(c, h->buf, xlen, 1);
  468. }
  469. static void send_power_thr(web_handle_t *h, mg_conn_t *c)
  470. {
  471. pkt_hdr_t *hdr=NULL;
  472. hdr = (pkt_hdr_t*)h->buf;
  473. hdr->magic = PKT_MAGIC;
  474. hdr->addr = 0;
  475. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  476. hdr->nack = 0;
  477. hdr->subtype = NEW_SUB_PKT_TYPE_ELE_DATA_THR;
  478. power_handle_new_t *p_handle = power_get_all();
  479. thr_t *_data = (thr_t *)(&hdr->data);
  480. int chn = p_handle->chs;
  481. for(int i =0; i < chn;i++)
  482. {
  483. _data[i] = p_handle->pch[i].thr;
  484. }
  485. hdr->dlen = sizeof(thr_t) * chn;
  486. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  487. ws_send(c, h->buf, xlen, 1);
  488. }
  489. static void set_power_ctrl(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  490. {
  491. (void)h;
  492. (void)c;
  493. power_handle_new_t *p_handle = power_get_all();
  494. uint8_t channle = ctrl->cnt_ctrl.chn;
  495. if(channle > p_handle->chs || ctrl == NULL)
  496. return;
  497. uint8_t saddr = p_handle->pch[channle].info.addr;
  498. uint8_t b_addr = p_handle->pch[channle].info.sch;
  499. p_handle->set_status(saddr,b_addr,ctrl->cnt_ctrl.status);
  500. }
  501. static void set_power_all_ctrl(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  502. {
  503. power_handle_new_t *p_handle = power_get_all();
  504. p_handle->set_all_status(ctrl->all_ctrl.status);
  505. }
  506. static void set_power_consum_clear(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  507. {
  508. (void)h;
  509. (void)c;
  510. power_handle_new_t *p_handle = power_get_all();
  511. uint8_t channle = ctrl->clear.chn;
  512. if(channle > p_handle->chs || ctrl == NULL)
  513. return;
  514. uint8_t saddr = p_handle->pch[channle].info.addr;
  515. uint8_t b_addr = p_handle->pch[channle].info.sch;
  516. p_handle->set_consumer_clear(saddr,b_addr);
  517. }
  518. static void set_power_delay(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  519. {
  520. (void)h;
  521. (void)c;
  522. power_handle_new_t *p_handle = power_get_all();
  523. uint8_t channle = ctrl->delay.chn;
  524. if(channle > p_handle->chs || ctrl == NULL)
  525. return;
  526. uint8_t saddr = p_handle->pch[channle].info.addr;
  527. uint8_t b_addr = p_handle->pch[channle].info.sch;
  528. uint8_t open = ctrl->delay.open;
  529. uint8_t close = ctrl->delay.close;
  530. p_handle->set_delay(saddr,b_addr,open,close);
  531. }
  532. static void set_power_thr(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  533. {
  534. (void)h;
  535. (void)c;
  536. power_handle_new_t *p_handle = power_get_all();
  537. uint8_t channle = ctrl->thr.chn;
  538. thr_t *thr = &ctrl->thr.thr;
  539. if(channle > p_handle->chs || ctrl == NULL)
  540. return;
  541. uint8_t saddr = p_handle->pch[channle].info.addr;
  542. uint8_t b_addr = p_handle->pch[channle].info.sch;
  543. p_handle->set_thr(saddr,b_addr,thr);
  544. }
  545. static void set_power_batch_thr(web_handle_t *h, mg_conn_t *c,wed_set_t *ctrl)
  546. {
  547. (void)h;
  548. (void)c;
  549. power_handle_new_t *p_handle = power_get_all();
  550. thr_t *thr = &ctrl->thr.thr;
  551. if(ctrl == NULL)
  552. return;
  553. for(int i=0; i < 32;i++)
  554. {
  555. if(p_handle->board[i].flag)
  556. {
  557. p_handle->set_batch_thr(i,thr);
  558. }
  559. }
  560. }
  561. static void send_power_data(web_handle_t *h, mg_conn_t *c,uint8_t id)
  562. {
  563. pkt_hdr_t *hdr=NULL;
  564. hdr = (pkt_hdr_t*)h->buf;
  565. hdr->magic = PKT_MAGIC;
  566. hdr->addr = 0;
  567. hdr->type = NEW_PKT_TYPE_ELE_INFO;
  568. hdr->nack = 0;
  569. hdr->subtype = id;
  570. power_t *power_data = (power_t *)(&hdr->data);
  571. power_handle_new_t *p_handle = power_get_all();
  572. if(id>=3)
  573. return;
  574. int chn = p_handle->chs;
  575. for(int i =0; i < chn;i++)
  576. {
  577. power_data[i] = p_handle->pch[i].power[id];
  578. }
  579. hdr->dlen = sizeof(power_t) * chn;
  580. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  581. ws_send(c, h->buf, xlen, 1);
  582. }
  583. static void set_sensor_thr(web_handle_t *h,mg_conn_t *c,uint8_t type,wed_set_t *ctrl)
  584. {
  585. (void)h;
  586. (void)c;
  587. sensor_data_t *data_temp = NULL;
  588. sensor_th_t *sensor_temp = NULL;
  589. int32_t vmax = ctrl->sensor.v_max *100;
  590. int32_t vmin = ctrl->sensor.v_min *100;
  591. switch(type)
  592. {
  593. case NEW_SUB_PKT_TYPE_HUMI:
  594. {
  595. data_temp = &sensor_get_data()->data[0];
  596. sensor_temp = &paras_get()->sensor.sens[0];
  597. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  598. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  599. sensor_temp->th_max_1 = vmax;
  600. sensor_temp->th_min_1 = vmin;
  601. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  602. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  603. }
  604. break;
  605. case NEW_SUB_PKT_TYPE_TEMP:
  606. {
  607. data_temp = &sensor_get_data()->data[0];
  608. sensor_temp = &paras_get()->sensor.sens[0];
  609. data_temp->val[1].thr.en.th_sen_max_en = vmax ? 1 : 0;
  610. data_temp->val[1].thr.en.th_sen_min_en = vmin ? 1 : 0;
  611. sensor_temp->th_max_2 = vmax;
  612. sensor_temp->th_min_2 = vmin;
  613. data_temp->val[1].thr.max = ctrl->sensor.v_max;
  614. data_temp->val[1].thr.min = ctrl->sensor.v_min;
  615. }
  616. break;
  617. case NEW_SUB_PKT_TYPE_SMOKE:
  618. {
  619. data_temp = &sensor_get_data()->data[1];
  620. sensor_temp = &paras_get()->sensor.sens[1];
  621. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  622. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  623. sensor_temp->th_max_1 = vmax;
  624. sensor_temp->th_min_1 = vmin;
  625. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  626. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  627. }
  628. break;
  629. case NEW_SUB_PKT_TYPE_CO2:
  630. {
  631. data_temp = &sensor_get_data()->data[2];
  632. sensor_temp = &paras_get()->sensor.sens[2];
  633. data_temp->val[0].thr.en.th_sen_max_en = vmax ? 1 : 0;
  634. data_temp->val[0].thr.en.th_sen_min_en = vmin ? 1 : 0;
  635. sensor_temp->th_max_1 = vmax;
  636. sensor_temp->th_min_1 = vmin;
  637. data_temp->val[0].thr.max = ctrl->sensor.v_max;
  638. data_temp->val[0].thr.min = ctrl->sensor.v_min;
  639. }
  640. break;
  641. default:
  642. return;
  643. }
  644. paras_save();
  645. }
  646. static void send_net_config(web_handle_t *h, mg_conn_t *c)
  647. {
  648. pkt_hdr_t *hdr=NULL;
  649. hdr = (pkt_hdr_t*)h->buf;
  650. hdr->magic = PKT_MAGIC;
  651. hdr->addr = 0;
  652. hdr->type = NEW_PKT_TYPE_NETWORK;
  653. hdr->nack = 0;
  654. hdr->subtype = 0;
  655. network_data_t *net = (network_data_t *)(&hdr->data);
  656. memset(net,0,sizeof(network_data_t));
  657. paras_data_t* para=paras_get();
  658. //*net = para->netwk;
  659. net_get_ip(net);
  660. hdr->dlen = sizeof(network_data_t);
  661. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  662. ws_send(c, h->buf, xlen, 1);
  663. }
  664. static void send_rs485_config(web_handle_t *h, mg_conn_t *c)
  665. {
  666. pkt_hdr_t *hdr=NULL;
  667. hdr = (pkt_hdr_t*)h->buf;
  668. hdr->magic = PKT_MAGIC;
  669. hdr->addr = 0;
  670. hdr->type = NEW_PKT_TYPE_RS485;
  671. hdr->nack = 0;
  672. hdr->subtype = 0;
  673. modbus_data_t *md = (modbus_data_t *)(&hdr->data);
  674. memset(md,0,sizeof(modbus_data_t));
  675. paras_data_t* para=paras_get();
  676. *md = para->cas;
  677. hdr->dlen = sizeof(modbus_data_t);
  678. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  679. ws_send(c, h->buf, xlen, 1);
  680. }
  681. static void send_snmp_config(web_handle_t *h, mg_conn_t *c)
  682. {
  683. pkt_hdr_t *hdr=NULL;
  684. hdr = (pkt_hdr_t*)h->buf;
  685. hdr->magic = PKT_MAGIC;
  686. hdr->addr = 0;
  687. hdr->type = NEW_PKT_TYPE_SNMP;
  688. hdr->nack = 0;
  689. hdr->subtype = 0;
  690. snmp_data_t *snmp = (snmp_data_t *)(&hdr->data);
  691. memset(snmp,0,sizeof(snmp_data_t));
  692. paras_data_t* para=paras_get();
  693. *snmp = para->snmp;
  694. hdr->dlen = sizeof(snmp_data_t);
  695. uint32_t xlen = hdr->dlen + sizeof(pkt_hdr_t);
  696. ws_send(c, h->buf, xlen, 1);
  697. }
  698. static void web_set_network(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  699. {
  700. (void)h;
  701. (void)c;
  702. web_net_t *net = &ctrl->net;
  703. if(net->mode == 0 || net->mode == 1)
  704. {
  705. if(net->mode == 0)
  706. {
  707. if(sys_ip_check(net->dns1) && sys_ip_check(net->dns2));
  708. {
  709. net_ipaddr_set(net);
  710. }
  711. }else
  712. {
  713. if(sys_ip_check(net->dns1)
  714. && sys_ip_check(net->dns2)
  715. && sys_ip_check(net->gateway)
  716. && sys_ip_check(net->ipaddr)
  717. && sys_ip_check(net->mask))
  718. {
  719. net_ipaddr_set(net);
  720. }
  721. }
  722. }
  723. }
  724. static void web_set_rs485(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  725. {
  726. (void)h;
  727. (void)c;
  728. web_rs485_t *rs485 = &ctrl->rs485;
  729. #if SUPPORT_CASCADE_QMODBUS
  730. cascade_reset_new(rs485->mode,rs485->addr,rs485->baud);
  731. #endif
  732. }
  733. static void web_snmp_set(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  734. {
  735. (void)h;
  736. (void)c;
  737. web_snmp_t *snmp= &ctrl->snmp;
  738. paras_data_t* para=paras_get();
  739. snmp_data_t *p_snmp = &para->snmp;
  740. int len1 = strlen(snmp->publics);
  741. int len2 = strlen(snmp->privates);
  742. if(snmp->trapmode == 1)
  743. {
  744. if(sys_ip_check(snmp->nms_ip))
  745. {
  746. if(len1>0 && len2 > 0)
  747. {
  748. *p_snmp = *snmp;
  749. paras_save();
  750. snmp_strap_set();
  751. }
  752. }
  753. }else
  754. {
  755. if(len1>0 && len2 > 0)
  756. {
  757. strcpy(p_snmp->publics,snmp->publics);
  758. strcpy(p_snmp->privates,snmp->privates);
  759. p_snmp->trapmode = snmp->trapmode;
  760. paras_save();
  761. snmp_strap_set();
  762. }
  763. }
  764. }
  765. static void web_set_ntp(web_handle_t *h,mg_conn_t *c,wed_set_t *ctrl)
  766. {
  767. (void)h;
  768. (void)c;
  769. #if 1
  770. web_device_t *device= &ctrl->device;
  771. paras_data_t* para=paras_get();
  772. para->sys.tzone = device->zone;
  773. fr_tz_set(device->zone * 3600);
  774. int lenth = strlen(device->date_time);
  775. for(int i = 0; i < lenth;i++)
  776. {
  777. if(device->date_time[i] <'0' || device->date_time[i] > '9')
  778. {
  779. device->date_time[i]=' ';
  780. }
  781. }
  782. uint32_t year = 0;
  783. uint32_t month = 0;
  784. uint32_t day = 0;
  785. uint32_t hour = 0;
  786. uint32_t min = 0;
  787. uint32_t sec = 0;
  788. sscanf(device->date_time,"%d %d %d %d %d %d",&year,&month,&day,&hour,&min,&sec);
  789. set_date_time(year,month,day,hour,min,sec);
  790. paras_save();
  791. #endif
  792. }
  793. static void send_his_alarm(web_handle_t *h, mg_conn_t *c)
  794. {
  795. #if 0
  796. pkt_hdr_t *hdr=NULL;
  797. hdr = (pkt_hdr_t*)h->buf;
  798. hdr->magic = PKT_MAGIC;
  799. hdr->addr = 0;
  800. hdr->type = NEW_PKT_TYPE_WANNING;
  801. hdr->nack = 0;
  802. hdr->subtype = 0;
  803. uint16_t *count = (uint16_t *)(&hdr->data[0]);
  804. *count = wanning_get_count();
  805. waning_info_t *wanning = (waning_info_t *)(&hdr->data[2]);
  806. wanning_get(wanning, count);
  807. hdr->dlen = (*count)*sizeof(waning_info_t)+2;
  808. uint32_t xlen = (*count)*sizeof(waning_info_t)+sizeof(pkt_hdr_t) + 2;
  809. ws_send(c, h->buf, xlen, 1);
  810. #endif
  811. }
  812. static int ws_handle_new(web_handle_t *h, pkt_hdr_t *hdr, mg_conn_t *c)
  813. {
  814. int r=0;
  815. if (!is_ws(c)) {
  816. return -1;
  817. }
  818. if(hdr->magic!=PKT_MAGIC) {
  819. LOGD("___ magic: 0x%x is wrong!, correct is: 0x%x\n", hdr->magic, PKT_MAGIC);
  820. return -1;
  821. }
  822. wed_set_t *ctrl = (wed_set_t*)(hdr->data);
  823. switch(hdr->type) {
  824. case NEW_PKT_TYPE_DEVICE_INFO:
  825. {
  826. if(hdr->dlen == 0)
  827. send_sys(h,c);
  828. else
  829. {
  830. reboot_sys(h,c,ctrl);
  831. }
  832. }
  833. break;
  834. case NEW_PKT_TYPE_ELE_INFO:
  835. {
  836. switch (hdr->subtype)
  837. {
  838. case NEW_SUB_PKT_TYPE_ELE_DATA_ALL:
  839. {
  840. send_power_all(h,c);
  841. }
  842. break;
  843. case NEW_SUB_PKT_TYPE_ELE_DATA_INFO:
  844. {
  845. send_power_info(h,c);
  846. }
  847. break;
  848. case NEW_SUB_PKT_TYPE_ELE_DATA_L1:
  849. {
  850. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L1);
  851. }
  852. break;
  853. case NEW_SUB_PKT_TYPE_ELE_DATA_L2:
  854. {
  855. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L2);
  856. }
  857. break;
  858. case NEW_SUB_PKT_TYPE_ELE_DATA_L3:
  859. {
  860. send_power_data(h,c,NEW_SUB_PKT_TYPE_ELE_DATA_L3);
  861. }
  862. break;
  863. case NEW_SUB_PKT_TYPE_ELE_DATA_THR:
  864. {
  865. if(hdr->dlen == 0)
  866. send_power_thr(h,c);
  867. else
  868. {
  869. set_power_thr(h,c,ctrl);
  870. }
  871. }
  872. break;
  873. case NEW_SUB_PKT_TYPE_ELE_DELAY:
  874. {
  875. if(hdr->dlen > 0) {
  876. set_power_delay(h,c,ctrl);
  877. }
  878. }
  879. break;
  880. case NEW_SUB_PKT_TYPE_ELE_CTRL:
  881. {
  882. if(hdr->dlen > 0) {
  883. set_power_ctrl(h,c,ctrl);
  884. }
  885. }
  886. break;
  887. case NEW_SUB_PKT_TYPE_ELE_ALL_CTRL:
  888. {
  889. if(hdr->dlen > 0) {
  890. set_power_all_ctrl(h,c,ctrl);
  891. }
  892. }
  893. break;
  894. case NEW_SUB_PKT_TYPE_ELE_CLEAR_CONSUMER:
  895. {
  896. if(hdr->dlen > 0) {
  897. set_power_consum_clear(h,c,ctrl);
  898. }
  899. }
  900. break;
  901. case NEW_SUB_PKT_TYPE_ELE_BATCH:
  902. {
  903. if(hdr->dlen > 0)
  904. {
  905. set_power_batch_thr(h,c,ctrl);
  906. }
  907. }
  908. break;
  909. default:
  910. break;
  911. }
  912. }
  913. break;
  914. case NEW_PKT_TYPE_SENSOR:
  915. {
  916. if(hdr->dlen == 0)
  917. {
  918. send_sensor_info(h,c);
  919. }else
  920. {
  921. set_sensor_thr(h,c,hdr->subtype,ctrl);
  922. }
  923. }
  924. break;
  925. case NEW_PKT_TYPE_NETWORK:
  926. {
  927. if(hdr->dlen == 0)
  928. {
  929. send_net_config(h,c);
  930. }else
  931. {
  932. web_set_network(h,c,ctrl);
  933. }
  934. }
  935. break;
  936. case NEW_PKT_TYPE_RS485:
  937. {
  938. if(hdr->dlen == 0)
  939. {
  940. send_rs485_config(h,c);
  941. }else
  942. {
  943. web_set_rs485(h,c,ctrl);
  944. }
  945. }
  946. break;
  947. case NEW_PKT_TYPE_SNMP:
  948. {
  949. if(hdr->dlen == 0)
  950. {
  951. send_snmp_config(h,c);
  952. }else
  953. {
  954. web_snmp_set(h,c,ctrl);
  955. }
  956. }
  957. break;
  958. case NEW_PKT_TYPE_NTP:
  959. {
  960. web_set_ntp(h,c,ctrl);
  961. }
  962. break;
  963. case NEW_PKT_TYPE_WANNING:
  964. {
  965. if(hdr->dlen == 0)
  966. {
  967. send_his_alarm(h,c);
  968. }else
  969. {
  970. #if 1
  971. switch(hdr->subtype)
  972. {
  973. case NEW_SUB_PKT_TYPE_WANNING_CLEAN:
  974. //wanning_clean();
  975. break;
  976. case NEW_SUB_PKT_TYPE_WANNING_SOUND_LIGHT_CLEAN:
  977. {
  978. led_reset();
  979. beep_reset();
  980. }
  981. break;
  982. }
  983. #endif
  984. }
  985. }
  986. break;
  987. case MEW_PKT_TYPE_LOGIN:
  988. {
  989. send_login_func(h,c,ctrl);
  990. }
  991. break;
  992. case NEW_PKT_TYPE_USER:
  993. {
  994. if(hdr->dlen == 0)
  995. {
  996. send_user_info(h,c);
  997. }else
  998. {
  999. switch(hdr->subtype)
  1000. {
  1001. case NEW_SUB_PKT_TYPE_USER_ADD:
  1002. {
  1003. send_add_user_func(h,c,ctrl);
  1004. }
  1005. break;
  1006. case NEW_SUB_PKT_TYPE_USER_UPDATE:
  1007. {
  1008. send_user_update_func(h,c,ctrl);
  1009. }
  1010. break;
  1011. case NEW_SUB_PKT_TYPE_USER_DELETE:
  1012. {
  1013. send_user_delete_func(h,c,ctrl);
  1014. }
  1015. break;
  1016. default:
  1017. break;
  1018. }
  1019. }
  1020. }
  1021. break;
  1022. default:
  1023. break;
  1024. }
  1025. return 0;
  1026. }
  1027. static void http_fn(mg_conn_t *c, int ev, void *ev_data)
  1028. {
  1029. int r,flag=0;
  1030. web_handle_t *h=&webHandle;
  1031. mg_stream_t s={c,ev,ev_data};
  1032. // LOGD("connect --------%lx\n",c);
  1033. #ifdef USE_MG716
  1034. if (ev == MG_EV_HTTP_MSG) {
  1035. struct mg_http_message *hm = (struct mg_http_message *) ev_data;
  1036. for(int i=0; i<h->cnt; i++) {
  1037. if (h->fn[i].f && h->fn[i].uri && mg_match(hm->uri, mg_str(h->fn[i].uri), NULL)) {
  1038. h->fn[i].f(&s); flag = 1; break;
  1039. }
  1040. }
  1041. if(flag == 0)
  1042. {
  1043. if (mg_match(hm->uri, mg_str("/ws"), NULL)) {
  1044. mg_ws_upgrade(c, hm, NULL);
  1045. } else if (mg_match(hm->uri, mg_str("/rest"), NULL)) {
  1046. // Serve REST response
  1047. mg_http_reply(c, 200, "", "{\"result\": %d}\n", 123);
  1048. } else {
  1049. struct mg_http_serve_opts opts = {.root_dir = h->rootDir};
  1050. mg_http_serve_dir(c, hm, &opts);
  1051. }
  1052. }
  1053. }
  1054. else if(ev == MG_EV_ACCEPT) {
  1055. if (c->fn_data) {
  1056. mg_tls_init(c, &h->tls);
  1057. }
  1058. // paras_data_t *p=paras_get();
  1059. // ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  1060. }
  1061. else if(ev == MG_EV_WS_MSG) {
  1062. struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;
  1063. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data.buf;
  1064. ws_handle_new(h, hdr, c);
  1065. }else if(ev == MG_EV_CLOSE)
  1066. {
  1067. // mg_close_conn(c);
  1068. }
  1069. #else
  1070. if (ev == MG_EV_HTTP_REQUEST) {
  1071. mg_serve_http(c, (struct http_message *)ev_data, h->opts);
  1072. }
  1073. else if(ev == MG_EV_WEBSOCKET_HANDSHAKE_DONE) {
  1074. paras_data_t *p=paras_get();
  1075. ws_send_pkt(h, c, 0, PKT_TYPE_PARAS, p, sizeof(paras_data_t), 1);
  1076. set_timer(c, TIMER_INTERVAL);
  1077. }
  1078. else if(ev == MG_EV_WEBSOCKET_FRAME) {
  1079. struct websocket_message *wm = (struct websocket_message *) ev_data;
  1080. pkt_hdr_t *hdr=(pkt_hdr_t*)wm->data;
  1081. ws_handle(h, hdr, c);
  1082. }
  1083. else if(ev==MG_EV_TIMER) {
  1084. }
  1085. #endif
  1086. }
  1087. static char ack_str[2048] = {0};
  1088. static void overChannelStatusMonitoring(void* conn)
  1089. {
  1090. cJSON *cjson=NULL;
  1091. channel_power_request req = {0};
  1092. memset(ack_str,0,sizeof(ack_str));
  1093. mg_stream_t *s=(mg_stream_t*)conn;
  1094. struct mg_http_message *hm=s->ev_data;
  1095. char *rx_body_buf=(char*)hm->body.buf;
  1096. char *rx_Head_buf = (char*)hm->head.buf;
  1097. power_handle_new_t *p_handle = power_get_all();
  1098. wed_set_t ctrl = {0};
  1099. cjson = json_to_chn_pwr_status_monitor(rx_body_buf,&req);
  1100. if(cjson == NULL)
  1101. return;
  1102. if(strcmp(req.type,"chnInfo")==0)
  1103. {
  1104. if(req.pro_ch_id > 0)
  1105. {
  1106. uint8_t channle = req.pro_ch_id - 1;
  1107. if(channle > p_handle->chs)
  1108. return;
  1109. power_ch_new_t *pch = &p_handle->pch[channle];
  1110. int ph = 0;
  1111. if(p_handle->product->type == PDU_AC_I3O1_H || p_handle->product->type == PDU_AC_I3O1)
  1112. {
  1113. ph=pch->info.pse.ph-1;
  1114. uint8_t wanning = 0;
  1115. uint32_t ph_all_wanning = *(uint32_t*) (&pch->info.alarm);
  1116. wanning = (ph_all_wanning >> (ph*8)) & 0XFF; //get phse wanning
  1117. wanning_type_t wan = *(wanning_type_t *)(&wanning);
  1118. sprintf(ack_str,CHANNEL_SINGLE_RES_TYPE,pch->info.name,req.pro_ch_id,pch->power[ph].voltage,
  1119. pch->power[ph].current,pch->power[ph].power,
  1120. pch->power[ph].app_power,pch->power[ph].freq,
  1121. pch->power[ph].factor,pch->power[ph].consump,
  1122. pch->thr.v_upper,pch->thr.v_lower,
  1123. pch->thr.c_upper,pch->thr.p_upper,
  1124. pch->thr.w_upper,
  1125. pch->info.open_delay,pch->info.close_delay,pch->info.status,
  1126. wan.v_upper,wan.v_lower,wan.c_upper,wan.p_upper,wan.w_upper,
  1127. g_product_t_ac_type_str[ph]);
  1128. }else
  1129. {
  1130. sprintf(ack_str,CHANNEL_SINGLE_RES_TYPE,pch->info.name,req.pro_ch_id,pch->power[0].voltage,
  1131. pch->power[0].current,pch->power[0].power,
  1132. pch->power[0].app_power,pch->power[0].freq,
  1133. pch->power[0].factor,pch->power[0].consump,
  1134. pch->thr.v_upper,pch->thr.v_lower,
  1135. pch->thr.c_upper,pch->thr.p_upper,
  1136. pch->thr.w_upper,
  1137. pch->info.open_delay,pch->info.close_delay,
  1138. pch->info.status,
  1139. pch->info.alarm.l1_v_upper,
  1140. pch->info.alarm.l1_v_lower,pch->info.alarm.l1_c_upper,
  1141. pch->info.alarm.l1_p_upper,pch->info.alarm.l1_w_upper,
  1142. "");
  1143. }
  1144. }
  1145. }else if(strcmp(req.type,"chnWanInfo")==0)
  1146. {
  1147. //CHANEL_WANNING_INFO_TYPE
  1148. if(req.pro_ch_id > 0)
  1149. {
  1150. uint8_t channle = req.pro_ch_id - 1;
  1151. if(channle > p_handle->chs)
  1152. return;
  1153. power_ch_new_t *pch = &p_handle->pch[channle];
  1154. int ph = 0;
  1155. if(p_handle->product->type == PDU_AC_I3O1_H || p_handle->product->type == PDU_AC_I3O1)
  1156. {
  1157. uint8_t wanning = 0;
  1158. uint32_t ph_all_wanning = *(uint32_t*) (&pch->info.alarm);
  1159. ph=pch->info.pse.ph-1;
  1160. wanning = (ph_all_wanning >> (ph*8)) & 0XFF; //get phse wanning
  1161. wanning_type_t wan = *(wanning_type_t *)(&wanning);
  1162. sprintf(ack_str,CHANEL_WANNING_INFO_TYPE,pch->info.name,req.pro_ch_id,
  1163. wan.v_upper,wan.v_lower,wan.c_upper,wan.p_upper,wan.w_upper,g_product_t_ac_type_str[ph]);
  1164. }else
  1165. {
  1166. sprintf(ack_str,CHANEL_WANNING_INFO_TYPE,pch->info.name,req.pro_ch_id,pch->info.alarm.l1_v_upper,
  1167. pch->info.alarm.l1_v_lower,pch->info.alarm.l1_c_upper,
  1168. pch->info.alarm.l1_p_upper,pch->info.alarm.l1_w_upper,"");
  1169. }
  1170. }
  1171. }
  1172. else if(strcmp(req.type,"open")==0 || strcmp(req.type,"close")==0)
  1173. {
  1174. ctrl.cnt_ctrl.status = strcmp(req.type,"open")==0 ? 1 : 0;
  1175. ctrl.cnt_ctrl.chn = req.pro_ch_id - 1;
  1176. set_power_ctrl(NULL,NULL,&ctrl);
  1177. sprintf(ack_str,SUCESS_RSP);
  1178. }else if(strcmp(req.type,"setInterval")==0)
  1179. {
  1180. ctrl.delay.open = req.open;
  1181. ctrl.delay.close = req.close;
  1182. ctrl.delay.chn = req.pro_ch_id -1;
  1183. set_power_delay(NULL,NULL,&ctrl);
  1184. sprintf(ack_str,SUCESS_RSP);
  1185. }else if(strcmp(req.type,"setThreshold")==0)
  1186. {
  1187. ctrl.thr.chn = req.pro_ch_id - 1;
  1188. power_ch_new_t *pch = &p_handle->pch[ctrl.thr.chn];
  1189. ctrl.thr.thr = pch->thr;
  1190. ctrl.thr.thr.v_upper = req.v_max;
  1191. ctrl.thr.thr.v_lower = req.v_min;
  1192. ctrl.thr.thr.c_upper = req.i_max;
  1193. ctrl.thr.thr.p_upper = req.p_max;
  1194. ctrl.thr.thr.w_upper = req.w_max;
  1195. set_power_thr(NULL,NULL,&ctrl);
  1196. sprintf(ack_str,SUCESS_RSP);
  1197. }else if(strcmp(req.type,"clearConsumer")==0)
  1198. {
  1199. ctrl.clear.chn = req.pro_ch_id - 1;
  1200. set_power_consum_clear(NULL,NULL,&ctrl);
  1201. sprintf(ack_str,SUCESS_RSP);
  1202. }
  1203. cJSON_Delete(cjson);
  1204. http_reply(conn, 200, ack_str);
  1205. }
  1206. static void overallStatusMonitoring(void* conn)
  1207. {
  1208. cJSON *cjson=NULL;
  1209. all_power_request req = {0};
  1210. memset(ack_str,0,sizeof(ack_str));
  1211. mg_stream_t *s=(mg_stream_t*)conn;
  1212. struct mg_http_message *hm=s->ev_data;
  1213. char *rx_body_buf=(char*)hm->body.buf;
  1214. char *rx_Head_buf = (char*)hm->head.buf;
  1215. wed_set_t ctrl = {0};
  1216. power_handle_new_t *p_handle = power_get_all();
  1217. cjson = json_to_all_pwr_status_monitor(rx_body_buf,&req);
  1218. if(cjson == NULL)
  1219. return;
  1220. if(strcmp(req.type,"allInfo")==0)
  1221. {
  1222. if(req.ph_id== 0)
  1223. {
  1224. sprintf(ack_str,ALL_INFO_RES_TYPE,req.ph_id,p_handle->total.all.voltage,
  1225. p_handle->total.all.current,
  1226. p_handle->total.all.power,
  1227. p_handle->total.all.app_power,
  1228. p_handle->total.all.factor,
  1229. p_handle->total.all.consump,
  1230. "ALL");
  1231. }else
  1232. {
  1233. sprintf(ack_str,ALL_INFO_RES_TYPE,req.ph_id,p_handle->total.all_l[req.ph_id-1].voltage,
  1234. p_handle->total.all_l[req.ph_id-1].current,
  1235. p_handle->total.all_l[req.ph_id-1].power,
  1236. p_handle->total.all_l[req.ph_id-1].app_power,
  1237. p_handle->total.all_l[req.ph_id-1].factor,
  1238. p_handle->total.all_l[req.ph_id-1].consump,
  1239. g_product_t_ac_type_str[req.ph_id-1]);
  1240. }
  1241. }else if(strcmp(req.type,"open")==0 || strcmp(req.type,"close")==0)
  1242. {
  1243. int status = strcmp(req.type,"open")==0 ? 1 : 0;
  1244. p_handle->set_all_status(status);
  1245. sprintf(ack_str,SUCESS_RSP);
  1246. }else if(strcmp(req.type,"setBatchThreshold")==0)
  1247. {
  1248. *(uint16_t*)(&ctrl.thr.thr.en) = 0xFFFF;
  1249. ctrl.thr.thr.v_upper = req.v_max;
  1250. ctrl.thr.thr.v_lower = req.v_min;
  1251. ctrl.thr.thr.c_upper = req.i_max;
  1252. ctrl.thr.thr.p_upper = req.p_max;
  1253. ctrl.thr.thr.w_upper = req.w_max;
  1254. set_power_batch_thr(NULL,NULL,&ctrl);
  1255. sprintf(ack_str,SUCESS_RSP);
  1256. }
  1257. cJSON_Delete(cjson);
  1258. http_reply(conn, 200, ack_str);
  1259. }
  1260. static void sensorStatusMonitoring(void* conn)
  1261. {
  1262. cJSON *cjson=NULL;
  1263. sensor_request req = {0};
  1264. memset(ack_str,0,sizeof(ack_str));
  1265. mg_stream_t *s=(mg_stream_t*)conn;
  1266. struct mg_http_message *hm=s->ev_data;
  1267. char *rx_body_buf=(char*)hm->body.buf;
  1268. sensor_all_t *sensor = sensor_get_data();
  1269. wed_set_t ctrl = {0};
  1270. cjson = json_to_sensor_status_monitor(rx_body_buf,&req);
  1271. if(cjson == NULL)
  1272. return;
  1273. //SENSOR_INFO_RES_TYPE
  1274. if(strcmp(req.type,"sensorInfo")==0)
  1275. {
  1276. switch(req.sensor_id)
  1277. {
  1278. case NEW_SUB_PKT_TYPE_HUMI:
  1279. {
  1280. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1281. "Humidity",sensor->data[0].val[0].value,
  1282. sensor->data[0].val[0].thr.max,sensor->data[0].val[0].thr.min,
  1283. sensor->data[0].val[0].s_alarm.max_up,sensor->data[0].val[0].s_alarm.min_down,
  1284. sensor->data[0].info.status);
  1285. }
  1286. break;
  1287. case NEW_SUB_PKT_TYPE_TEMP:
  1288. {
  1289. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1290. "Temperature",sensor->data[0].val[1].value,
  1291. sensor->data[0].val[1].thr.max,sensor->data[0].val[1].thr.min,
  1292. sensor->data[0].val[1].s_alarm.max_up,sensor->data[0].val[1].s_alarm.min_down,
  1293. sensor->data[0].info.status);
  1294. }
  1295. break;
  1296. case NEW_SUB_PKT_TYPE_SMOKE:
  1297. {
  1298. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1299. "Smoke",sensor->data[1].val[0].value,
  1300. sensor->data[1].val[0].thr.max,sensor->data[1].val[0].thr.min,
  1301. sensor->data[1].val[0].s_alarm.max_up,sensor->data[1].val[0].s_alarm.min_down,
  1302. sensor->data[1].info.status);
  1303. }
  1304. break;
  1305. case NEW_SUB_PKT_TYPE_CO2:
  1306. {
  1307. sprintf(ack_str,SENSOR_INFO_RES_TYPE,req.sensor_id,
  1308. "CO2",sensor->data[2].val[0].value,
  1309. sensor->data[2].val[0].thr.max,sensor->data[2].val[0].thr.min,
  1310. sensor->data[2].val[0].s_alarm.max_up,sensor->data[2].val[0].s_alarm.min_down,
  1311. sensor->data[2].info.status);
  1312. }
  1313. break;
  1314. default:
  1315. break;
  1316. }
  1317. }else if(strcmp(req.type,"sensorSet")==0)
  1318. {
  1319. switch(req.sensor_id)
  1320. {
  1321. case NEW_SUB_PKT_TYPE_HUMI:
  1322. case NEW_SUB_PKT_TYPE_TEMP:
  1323. case NEW_SUB_PKT_TYPE_SMOKE:
  1324. case NEW_SUB_PKT_TYPE_CO2:
  1325. {
  1326. ctrl.sensor.v_max = req.s_max;
  1327. ctrl.sensor.v_min = req.s_min;
  1328. set_sensor_thr(NULL,NULL,req.sensor_id,&ctrl);
  1329. sprintf(ack_str,SUCESS_RSP);
  1330. }
  1331. break;
  1332. }
  1333. }
  1334. cJSON_Delete(cjson);
  1335. http_reply(conn, 200, ack_str);
  1336. }
  1337. static int webSetCallback(void)
  1338. {
  1339. httpAddCallback("/pdu/channelStatusMonitoring", overChannelStatusMonitoring);
  1340. httpAddCallback("/pdu/overallStatusMonitoring", overallStatusMonitoring);
  1341. httpAddCallback("/pdu/sensorStatusMonitoring", sensorStatusMonitoring);
  1342. // httpAddCallback("/pdu/alarmProtect", alarmProtect);
  1343. // httpAddCallback("/pdu/alarmProtect", equipmentMintenance);
  1344. return 0;
  1345. }
  1346. static void web_thread(void *arg)
  1347. {
  1348. #if 0
  1349. mg_conn_t *nc;
  1350. const char *http_addr="http://[::]:80";
  1351. const char *https_addr="https://[::]:443";
  1352. // thread_handle_t *th=(thread_handle_t*)arg;
  1353. // web_handle_t *h=(web_handle_t*)th->attr->arg;
  1354. strcpy(h->rootDir, "/web");
  1355. #ifdef USE_MG716
  1356. mg_log_set(MG_LL_ERROR);
  1357. mg_mgr_init(&h->mgr);
  1358. //mg_timer_add(&h->mgr, TIMER_INTERVAL, MG_TIMER_REPEAT, timer_fn, h);
  1359. if (mg_http_listen(&h->mgr, http_addr, http_fn, NULL) == NULL) {
  1360. MG_ERROR(("cannot listen on %s\n", http_addr));
  1361. }
  1362. #else
  1363. mg_mgr_init(&h->mgr, NULL);
  1364. nc = mg_bind(&h->mgr, "80", http_fn);
  1365. strcpy(h->rootDir, "/nor/web");
  1366. mg_set_protocol_http_websocket(nc);
  1367. h->opts.document_root = h->rootDir;
  1368. h->opts.enable_directory_listing = "yes";
  1369. #endif
  1370. webSetCallback();
  1371. while(th->quit==0) {
  1372. mg_mgr_poll(&h->mgr, 50);
  1373. }
  1374. mg_mgr_free(&h->mgr);
  1375. #endif
  1376. }
  1377. int web_init(void)
  1378. {
  1379. //list_cfg_t lc={0,0,10};
  1380. web_handle_t *h=&webHandle;
  1381. memset(h, 0, sizeof(web_handle_t));
  1382. //h->list = list_init(&lc);
  1383. h->buflen = sizeof(pkt_hdr_t)+sizeof(power_ch_t)*ONCE_SEND_CNT+8;
  1384. h->buf = (char*)malloc(h->buflen);
  1385. mg_conn_t *nc;
  1386. const char *http_addr="http://[::]:80";
  1387. const char *https_addr="https://[::]:443";
  1388. // thread_handle_t *th=(thread_handle_t*)arg;
  1389. // web_handle_t *h=(web_handle_t*)th->attr->arg;
  1390. strcpy(h->rootDir, "/web");
  1391. #ifdef USE_MG716
  1392. mg_log_set(MG_LL_ERROR);
  1393. mg_mgr_init(&h->mgr);
  1394. //mg_timer_add(&h->mgr, TIMER_INTERVAL, MG_TIMER_REPEAT, timer_fn, h);
  1395. if (mg_http_listen(&h->mgr, http_addr, http_fn, NULL) == NULL) {
  1396. MG_ERROR(("cannot listen on %s\n", http_addr));
  1397. }
  1398. #else
  1399. mg_mgr_init(&h->mgr, NULL);
  1400. nc = mg_bind(&h->mgr, "80", http_fn);
  1401. strcpy(h->rootDir, "/nor/web");
  1402. mg_set_protocol_http_websocket(nc);
  1403. h->opts.document_root = h->rootDir;
  1404. h->opts.enable_directory_listing = "yes";
  1405. #endif
  1406. webSetCallback();
  1407. //thread_start(THREAD_ID_WEB, web_thread, h);
  1408. return 0;
  1409. }
  1410. extern EventGroupHandle_t xWatchdogEventGroup;
  1411. #define TASK_WEB_BIT (1 << 0)
  1412. void web_query(void)
  1413. {
  1414. while(1)
  1415. {
  1416. mg_mgr_poll(&webHandle.mgr, 50);
  1417. xEventGroupSetBits(xWatchdogEventGroup, TASK_WEB_BIT);
  1418. }
  1419. mg_mgr_free(&webHandle.mgr);
  1420. }
  1421. int web_post(int type, void *data, int len)
  1422. {
  1423. struct mg_connection *c;
  1424. web_handle_t *h=&webHandle;
  1425. //return list_append(h->list, type, data, len);
  1426. }