gagent_lan.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927
  1. /*
  2. * File : gagent_lan.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2018, RT-Thread Development Team
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. *
  20. * Change Logs:
  21. * Date Author Notes
  22. * 2018-01-03 flyingcys first version
  23. */
  24. #include "gagent_def.h"
  25. #include "gagent_cloud.h"
  26. #include <lwip/netifapi.h>
  27. #if !defined(LWIP_NETIF_LOOPBACK) || (LWIP_NETIF_LOOPBACK == 0)
  28. #error "must enable (LWIP_NETIF_LOOPBACK = 1) for publish!"
  29. #endif /* LWIP_NETIF_LOOPBACK */
  30. #define GAGENT_CLOUD_UDP_PORT 12414
  31. #define GAGENT_CLOUD_TCP_PORT 12416
  32. #define GAGENT_CLOUD_BROADCAST 2415
  33. #define GAGENT_LAN_TIMEOUT 5 //sec
  34. static rt_thread_t lan_thread;
  35. static int local_port = 7100;
  36. #ifdef PKG_GAGENT_CLOUD_DEBUG
  37. #define LAN_RECV_DEBUG
  38. #define LAN_SEND_DEBUG
  39. #endif
  40. static int lan_send_device_info(lan_st *lan, rt_uint8_t send_type)
  41. {
  42. char *index, *len_index;
  43. memset(lan->send_buf, 0, sizeof(lan->send_buf));
  44. index = lan->send_buf;
  45. //head
  46. *index ++ = 0x00;
  47. *index ++ = 0x00;
  48. *index ++ = 0x00;
  49. *index ++ = 0x03;
  50. //len
  51. len_index = index;
  52. index ++;
  53. //flag
  54. *index ++ = 0x00;
  55. //cmd
  56. *index ++ = 0x00;
  57. if(send_type == UDP_SEND_TYPE_DISCOVER)
  58. *index ++ = 0x04;
  59. else if(send_type == UDP_SEND_TYPE_BOARDCAST)
  60. *index ++ = 0x05;
  61. //did_len
  62. *index ++ = 0x00;
  63. *index ++ = strlen(lan->con->did);
  64. //did
  65. memcpy(index, lan->con->did, 0x16);
  66. index += strlen(lan->con->did);
  67. //mac_len
  68. *index ++ = 0x00;
  69. *index ++ = 0x06;
  70. //mac
  71. memcpy(index, lan->con->mac, 0x06);
  72. index += 0x06;
  73. //hard_version_len
  74. *index ++ = 0x00;
  75. *index ++ = strlen(lan->con->soft_version);
  76. //soft_version
  77. memcpy(index, lan->con->soft_version, strlen(lan->con->soft_version));
  78. index += strlen(lan->con->soft_version);
  79. //pk_len
  80. *index ++ = 0x00;
  81. *index ++ = strlen(lan->con->pk);
  82. //pk
  83. memcpy(index, lan->con->pk, strlen(lan->con->pk));
  84. index += strlen(lan->con->pk);
  85. index += 8;
  86. lan->send_len = index - lan->send_buf;
  87. *len_index = lan->send_len - HEAD_LEN;
  88. return RT_EOK;
  89. }
  90. static int lan_udp_do_packet(lan_st *lan)
  91. {
  92. char *one_packet;
  93. int data_len;
  94. rt_uint8_t len_num;
  95. short cmd;
  96. int rc = RT_EOK;
  97. one_packet = lan->recv_buf;
  98. while(gagent_get_one_packet(one_packet, &data_len, &len_num, lan->recv_len) == 0)
  99. {
  100. rc = RT_EOK;
  101. memcpy(&cmd, one_packet + 6, 2);
  102. cmd = ntohs(cmd);
  103. gagent_dbg("cmd:%d\n", cmd);
  104. switch(cmd)
  105. {
  106. case 0x03:
  107. rc = lan_send_device_info(lan, UDP_SEND_TYPE_DISCOVER);
  108. break;
  109. }
  110. one_packet += (data_len + len_num + HEAD_LEN);
  111. lan->recv_len -= (data_len + len_num + HEAD_LEN);
  112. if(rc != 0)
  113. return rc;
  114. }
  115. return rc;
  116. }
  117. static int lan_get_passcode(lan_st *lan)
  118. {
  119. char *index, *len_index;
  120. index = lan->send_buf;
  121. memset(index, 0, sizeof(lan->send_buf));
  122. //head
  123. *index ++ = 0x00;
  124. *index ++ = 0x00;
  125. *index ++ = 0x00;
  126. *index ++ = 0x03;
  127. //len
  128. len_index = index;
  129. index ++;
  130. //flag
  131. *index ++ = 0x00;
  132. //cmd
  133. *index ++ = 0x00;
  134. *index ++ = 0x07;
  135. //passcode_len
  136. *index ++ = 0x00;
  137. *index ++ = strlen(lan->con->passcode);
  138. memcpy(index, lan->con->passcode, strlen(lan->con->passcode));
  139. index += strlen(lan->con->passcode);
  140. //
  141. lan->send_len = (index - lan->send_buf);
  142. *len_index = lan->send_len - HEAD_LEN;
  143. return RT_EOK;
  144. }
  145. static int lan_get_device_info(lan_st *lan)
  146. {
  147. char *index, *len_index;
  148. index = lan->send_buf;
  149. memset(index, 0, sizeof(lan->send_buf));
  150. //head
  151. *index ++ = 0x00;
  152. *index ++ = 0x00;
  153. *index ++ = 0x00;
  154. *index ++ = 0x03;
  155. //len
  156. len_index = index;
  157. index ++;
  158. //flag
  159. *index ++ = 0x00;
  160. //cmd
  161. *index ++ = 0x00;
  162. *index ++ = 0x14;
  163. //hard_version
  164. memcpy(index, lan->con->hard_version, strlen(lan->con->hard_version));
  165. index += 8;
  166. //soft_version
  167. memcpy(index, lan->con->soft_version, strlen(lan->con->soft_version));
  168. index += 8;
  169. //mcu_hard
  170. index += 8;
  171. //mcu_soft_version
  172. index += 8;
  173. //p0 version
  174. index += 8;
  175. //remain1
  176. index += 8;
  177. //remain2_len
  178. *index ++ = 0x00;
  179. *index ++ = 0x00;
  180. //pk_len
  181. *index ++ = 0x00;
  182. *index ++ = strlen(lan->con->pk);
  183. //pk
  184. memcpy(index, lan->con->pk, strlen(lan->con->pk));
  185. index += strlen(lan->con->pk);
  186. lan->send_len = (index - lan->send_buf);
  187. *len_index = lan->send_len - HEAD_LEN;
  188. return RT_EOK;
  189. }
  190. static int lan_login_device(lan_st *lan, char *packet)
  191. {
  192. char *index, *len_index;
  193. char passcode_recv[32];
  194. rt_uint16_t passcode_len;
  195. memcpy(&passcode_len, packet + HEAD_LEN + 1 + 2, 2);
  196. passcode_len = ntohs(passcode_len);
  197. memset(passcode_recv, 0x00, sizeof(passcode_recv));
  198. memcpy(passcode_recv, packet + HEAD_LEN + 1 + 2 + 2, passcode_len);
  199. index = lan->send_buf;
  200. memset(index, 0, sizeof(lan->send_buf));
  201. //head
  202. *index ++ = 0x00;
  203. *index ++ = 0x00;
  204. *index ++ = 0x00;
  205. *index ++ = 0x03;
  206. //len
  207. len_index = index;
  208. index ++;
  209. //flag
  210. *index ++ = 0x00;
  211. //cmd
  212. *index ++ = 0x00;
  213. *index ++ = 0x09;
  214. //result
  215. if(strncmp(lan->con->passcode, passcode_recv, passcode_len) == 0)
  216. *index ++ = 0x00;
  217. else
  218. *index ++ = 0x01;
  219. lan->send_len = index - lan->send_buf;
  220. *len_index = lan->send_len - HEAD_LEN;
  221. return RT_EOK;
  222. }
  223. static int lan_trans_data(lan_st *lan, char *packet)
  224. {
  225. rt_uint16_t len, cmd;
  226. char *index, *kv;
  227. rt_uint16_t kv_len;
  228. rt_uint8_t length_len, action;
  229. lan->send_len = 0;
  230. //
  231. action = 0;
  232. kv_len = 0;
  233. kv = 0;
  234. index = packet;
  235. len = gagent_parse_rem_len((const uint8_t *)index + 4);
  236. length_len = gagent_num_rem_len_bytes((const uint8_t*)index + 4);
  237. index += (HEAD_LEN + length_len);
  238. rt_memcpy(&cmd, index, 2);
  239. index += 2;
  240. cmd = ntohs(cmd);
  241. gagent_dbg("cmd:%0x\n", cmd);
  242. // 00 00 00 03 06 00 00 90 01 01 01
  243. // 00 00 00 03 0A 00 00 93 00 00 00 00 01 01 01
  244. if(cmd == 0x90)
  245. {
  246. action = *index ++;
  247. kv = index;
  248. kv_len = len - 4;
  249. lan->sn = -1;
  250. }
  251. else if(cmd == 0x93)
  252. {
  253. memcpy(&lan->sn, index, 4);
  254. index += 4;
  255. gagent_dbg("lan_sn:%d\n", lan->sn);
  256. action = *index ++;
  257. kv = index;
  258. kv_len = len - 8;
  259. }
  260. else
  261. return -RT_ERROR;
  262. return gagent_cloud_recv_packet(CMD_FROM_LAN, action, (uint8_t *)kv, kv_len);
  263. }
  264. static int lan_heart_beat(lan_st *lan)
  265. {
  266. char *index, *len_index;
  267. index = lan->send_buf;
  268. memset(index, 0, sizeof(lan->send_buf));
  269. //head
  270. *index ++ = 0x00;
  271. *index ++ = 0x00;
  272. *index ++ = 0x00;
  273. *index ++ = 0x03;
  274. //len
  275. len_index = index;
  276. index ++;
  277. //flag
  278. *index ++ = 0x00;
  279. //cmd
  280. *index ++ = 0x00;
  281. *index ++ = 0x16;
  282. lan->send_len = index - lan->send_buf;
  283. *len_index = lan->send_len - HEAD_LEN;
  284. return RT_EOK;
  285. }
  286. static int lan_tcp_do_packet(lan_st *lan)
  287. {
  288. char *one_packet;
  289. rt_uint32_t data_len;
  290. rt_uint8_t len_num;
  291. rt_uint16_t cmd;
  292. int rc = RT_EOK;
  293. one_packet = lan->recv_buf;
  294. while(gagent_get_one_packet(one_packet, (int *)&data_len, &len_num, lan->recv_len) == RT_EOK)
  295. {
  296. rc = RT_EOK;
  297. memcpy(&cmd, one_packet + 6, 2);
  298. cmd = ntohs(cmd);
  299. gagent_dbg("lan_cmd:%x\n",cmd);
  300. switch(cmd)
  301. {
  302. case 0x06:
  303. rc = lan_get_passcode(lan);
  304. break;
  305. case 0x08:
  306. rc = lan_login_device(lan, one_packet);
  307. break;
  308. case 0x90:
  309. case 0x93:
  310. rc = lan_trans_data(lan, one_packet);
  311. break;
  312. case 0x13:
  313. rc = lan_get_device_info(lan);
  314. break;
  315. case 0x15:
  316. rc = lan_heart_beat(lan);
  317. break;
  318. default:
  319. break;
  320. }
  321. one_packet += (data_len + len_num + HEAD_LEN);
  322. lan->recv_len -= (data_len + len_num + HEAD_LEN);
  323. if(rc != 0)
  324. return rc;
  325. }
  326. return rc;
  327. }
  328. static int gagent_create_tcp_socket(lan_st *lan)
  329. {
  330. int rc = RT_EOK;
  331. int opt;
  332. if(lan->tcp_server != -1)
  333. return RT_EOK;
  334. lan->tcp_server = lwip_socket(AF_INET, SOCK_STREAM, 0);
  335. if(lan->tcp_server < 0)
  336. {
  337. gagent_err("tcp socket create failed!\n");
  338. return -RT_ERROR;
  339. }
  340. lan->tcp_server_addr.sin_family = AF_INET;
  341. lan->tcp_server_addr.sin_port = htons(GAGENT_CLOUD_TCP_PORT);
  342. lan->tcp_server_addr.sin_addr.s_addr = INADDR_ANY;
  343. memset(&lan->tcp_server_addr.sin_zero, 0, sizeof(lan->tcp_server_addr.sin_zero));
  344. opt = 1;
  345. setsockopt(lan->tcp_server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  346. rc = lwip_bind(lan->tcp_server, (struct sockaddr *)&lan->tcp_server_addr, (socklen_t)sizeof(lan->tcp_server_addr));
  347. if(rc < 0)
  348. {
  349. gagent_err("tcp socket bind failed! errno:%d\n", errno);
  350. lwip_close(lan->tcp_server);
  351. return -RT_ERROR;
  352. }
  353. rc = lwip_listen(lan->tcp_server, MAX_CLIENT);
  354. if(rc < 0)
  355. {
  356. gagent_err("tcp socket listen failed! errno:%d\n", errno);
  357. lwip_close(lan->tcp_server);
  358. return -RT_ERROR;
  359. }
  360. return RT_EOK;
  361. }
  362. static int gagent_create_udp_socket(lan_st *lan)
  363. {
  364. int opt;
  365. int broadcast;
  366. if(lan->udp_server != -1)
  367. return RT_EOK;
  368. lan->udp_server = lwip_socket(AF_INET, SOCK_DGRAM, 0);
  369. if(lan->udp_server < 0)
  370. {
  371. gagent_err("udp socket create failed!\n");
  372. return -RT_ERROR;
  373. }
  374. rt_memset(&lan->udp_socket_addr, 0, sizeof(lan->udp_socket_addr));
  375. lan->udp_socket_addr.sin_family = AF_INET;
  376. lan->udp_socket_addr.sin_port = htons(GAGENT_CLOUD_UDP_PORT);
  377. lan->udp_socket_addr.sin_addr.s_addr = INADDR_ANY;
  378. opt = 1;
  379. lwip_setsockopt(lan->udp_server, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  380. broadcast = 1;
  381. lwip_setsockopt(lan->udp_server, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));
  382. if(lwip_bind(lan->udp_server, (struct sockaddr *)&lan->udp_socket_addr, (socklen_t)sizeof(lan->udp_socket_addr)) < 0)
  383. {
  384. gagent_err("udp socket bind failed! errno:%d\n", errno);
  385. lwip_close(lan->udp_server);
  386. return -RT_ERROR;
  387. }
  388. rt_memset(&lan->broadcast_to, 0, sizeof(lan->broadcast_to));
  389. lan->broadcast_to.sin_family = AF_INET;
  390. lan->broadcast_to.sin_port = htons(GAGENT_CLOUD_BROADCAST);
  391. lan->broadcast_to.sin_addr.s_addr = inet_addr("255.255.255.255");
  392. return RT_EOK;
  393. }
  394. static int gagent_create_localudp_socket(lan_st *lan)
  395. {
  396. struct sockaddr_in local_udp_server;
  397. if(lan->local_sock != -1)
  398. return RT_EOK;
  399. lan->local_sock = lwip_socket(AF_INET, SOCK_DGRAM, 0);
  400. if(lan->local_sock < 0)
  401. {
  402. gagent_err("local udp socket create failed!\n");
  403. return -RT_ERROR;
  404. }
  405. memset(&local_udp_server, 0, sizeof(local_udp_server));
  406. local_udp_server.sin_family = AF_INET;
  407. local_udp_server.sin_port = htons(local_port);
  408. local_udp_server.sin_addr.s_addr = INADDR_ANY;
  409. if(lwip_bind(lan->local_sock, (struct sockaddr *)&local_udp_server, sizeof(local_udp_server)) < 0)
  410. {
  411. gagent_err("local udp socket bind failed!\n");
  412. return -RT_ERROR;
  413. }
  414. return RT_EOK;
  415. }
  416. static int gagent_close_tcp_socket(lan_st *lan)
  417. {
  418. if(lan->tcp_server != -1)
  419. {
  420. lwip_close(lan->tcp_server);
  421. lan->tcp_server = -1;
  422. }
  423. return RT_EOK;
  424. }
  425. static int gagent_close_udp_socket(lan_st *lan)
  426. {
  427. if(lan->udp_server != -1)
  428. {
  429. lwip_close(lan->udp_server);
  430. lan->udp_server = -1;
  431. }
  432. return RT_EOK;
  433. }
  434. static int gagent_close_localudp_socket(lan_st *lan)
  435. {
  436. if(lan->local_sock != -1)
  437. {
  438. lwip_close(lan->local_sock);
  439. lan->local_sock = -1;
  440. }
  441. return RT_EOK;
  442. }
  443. void gagent_lan_thread(void *parameter)
  444. {
  445. lan_st *lan = (lan_st *)parameter;
  446. int rc = RT_EOK;
  447. fd_set readfds;
  448. int maxfd;
  449. uint8_t id;
  450. struct timeval timeout;
  451. int client_sock;
  452. struct sockaddr_in client_addr;
  453. int addr_len = sizeof(client_addr);
  454. uint8_t tcp_client_count = 0;
  455. RT_ASSERT(lan != RT_NULL);
  456. lan->tcp_server = -1;
  457. lan->udp_server = -1;
  458. lan->local_sock = -1;
  459. while(1)
  460. {
  461. if(gagent_create_tcp_socket(lan) < 0)
  462. {
  463. rt_thread_delay(rt_tick_from_millisecond(3000));
  464. continue;
  465. }
  466. if(gagent_create_udp_socket(lan) < 0)
  467. {
  468. rt_thread_delay(rt_tick_from_millisecond(3000));
  469. continue;
  470. }
  471. if(gagent_create_localudp_socket(lan) < 0)
  472. {
  473. rt_thread_delay(rt_tick_from_millisecond(3000));
  474. continue;
  475. }
  476. for(id = 0; id < MAX_CLIENT; id ++)
  477. {
  478. lan->client_fd[id] = -1;
  479. }
  480. while(1)
  481. {
  482. FD_ZERO(&readfds);
  483. FD_SET(lan->tcp_server, &readfds);
  484. FD_SET(lan->udp_server, &readfds);
  485. FD_SET(lan->local_sock, &readfds);
  486. maxfd = lan->tcp_server;
  487. if(lan->udp_server > maxfd)
  488. maxfd = lan->udp_server;
  489. if(lan->local_sock > maxfd)
  490. maxfd = lan->local_sock;
  491. for(id = 0; id < MAX_CLIENT; id ++)
  492. {
  493. if(lan->client_fd[id] == -1)
  494. continue;
  495. FD_SET(lan->client_fd[id], &readfds);
  496. if(lan->client_fd[id] > maxfd)
  497. maxfd = lan->client_fd[id];
  498. }
  499. timeout.tv_sec = GAGENT_LAN_TIMEOUT;
  500. timeout.tv_usec = 0;
  501. rc = lwip_select(maxfd + 1, &readfds, 0, 0, &timeout);
  502. if(rc < 0)
  503. {
  504. gagent_err("socket select failed!\n");
  505. break;
  506. }
  507. else if(rc == 0)
  508. {
  509. if(tcp_client_count >= MAX_CLIENT)
  510. continue;
  511. //broadcast
  512. rc = lan_send_device_info(lan, UDP_SEND_TYPE_BOARDCAST);
  513. if(rc == RT_EOK && lan->send_len > 0)
  514. {
  515. rc = lwip_sendto(lan->udp_server, lan->send_buf, lan->send_len, 0,
  516. (struct sockaddr *)&lan->broadcast_to, (socklen_t)sizeof(lan->broadcast_to));
  517. if(rc <= 0)
  518. {
  519. gagent_err("udp socket broadcast failed! errno:%d\n", errno);
  520. break;
  521. }
  522. }
  523. continue;
  524. }
  525. //local
  526. if(FD_ISSET(lan->local_sock, &readfds))
  527. {
  528. //locak socket can read
  529. struct sockaddr_in local_client_addr;
  530. int addr_len = sizeof(local_client_addr);
  531. rt_uint8_t i;
  532. lan->recv_len = lwip_recvfrom(lan->local_sock, lan->recv_buf, sizeof(lan->recv_buf), 0,
  533. (struct sockaddr *)&local_client_addr, (socklen_t *)&addr_len);
  534. if(local_client_addr.sin_addr.s_addr != *(uint32_t *)&netif_default->ip_addr)
  535. continue;
  536. if(lan->recv_len <= 0)
  537. {
  538. gagent_err("local udp socket recvfrom failed!\n");
  539. continue;
  540. }
  541. for(i = 0; i < MAX_CLIENT; i ++)
  542. {
  543. if(lan->client_fd[i] == -1)
  544. continue;
  545. rc = lwip_send(lan->client_fd[i], lan->recv_buf, lan->recv_len, 0);
  546. if(rc <= 0)
  547. {
  548. gagent_err("send clnt %d failed! errno:%d\n", i, errno);
  549. lwip_close(lan->client_fd[i]);
  550. lan->client_fd[i] = -1;
  551. if(tcp_client_count > 0)
  552. tcp_client_count --;
  553. }
  554. gagent_dbg("send client send len:%d\n", rc);
  555. }
  556. }
  557. if(FD_ISSET(lan->udp_server, &readfds))
  558. {
  559. //udp socket can read
  560. addr_len = sizeof(client_addr);
  561. lan->recv_len = lwip_recvfrom(lan->udp_server, lan->recv_buf, sizeof(lan->recv_buf), 0,
  562. (struct sockaddr *)&client_addr, (socklen_t *)&addr_len);
  563. if(lan->recv_len <= 0)
  564. {
  565. gagent_err("udp socket recv from failed! errno:%d\n", errno);
  566. break;
  567. }
  568. #ifdef LAN_RECV_DEBUG
  569. {
  570. int i;
  571. gagent_dbg("udp client:%s port:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
  572. rt_kprintf("recv len:%d ", lan->recv_len);
  573. for(i = 0; i < lan->recv_len; i ++)
  574. rt_kprintf("%02x ", lan->recv_buf[i]);
  575. rt_kprintf("\r\n");
  576. }
  577. #endif
  578. rc = lan_udp_do_packet(lan);
  579. if(rc == RT_EOK && lan->send_len > 0)
  580. {
  581. #ifdef LAN_RECV_DEBUG
  582. gagent_dbg("udp client:%d send_len:%d\n", id, lan->send_len);
  583. {
  584. int t;
  585. for(t = 0; t < lan->send_len; t ++)
  586. rt_kprintf("%02x ", lan->send_buf[t]);
  587. rt_kprintf("\r\n");
  588. }
  589. #endif
  590. rc = lwip_sendto(lan->udp_server, lan->send_buf, lan->send_len, 0,
  591. (struct sockaddr *)&client_addr, (socklen_t)sizeof(client_addr));
  592. if(rc <= 0)
  593. {
  594. gagent_err("udp socket sendto failed! errno:%d\n", errno);
  595. break;
  596. }
  597. gagent_dbg("udp socket sendto len:%d\n", rc);
  598. }
  599. }
  600. if(FD_ISSET(lan->tcp_server, &readfds))
  601. {
  602. //tcp socket can read
  603. addr_len= sizeof(struct sockaddr);
  604. client_sock = lwip_accept(lan->tcp_server, (struct sockaddr *)&client_addr, (socklen_t *)&addr_len);
  605. if(client_sock < 0)
  606. {
  607. gagent_err("tcp socket accept failed! errno:%d\n", errno);
  608. break;
  609. }
  610. gagent_dbg("client_sock:%d\n", client_sock);
  611. for(id = 0; id < MAX_CLIENT; id ++)
  612. {
  613. if(lan->client_fd[id] == -1)
  614. break;
  615. }
  616. if(id >= MAX_CLIENT)
  617. {
  618. gagent_dbg("max client!\n");
  619. lwip_close(client_sock);
  620. continue;
  621. }
  622. lan->client_fd[id] = client_sock;
  623. tcp_client_count ++;
  624. gagent_dbg("new client: %d %s port:%d\n", id, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
  625. }
  626. for(id = 0; id < MAX_CLIENT; id ++)
  627. {
  628. if(lan->client_fd[id] == -1)
  629. continue;
  630. if(FD_ISSET(lan->client_fd[id], &readfds))
  631. {
  632. memset(lan->recv_buf, 0, sizeof(lan->recv_buf));
  633. lan->recv_len = lwip_recv(lan->client_fd[id], lan->recv_buf, sizeof(lan->recv_buf), 0);
  634. if(lan->recv_len <= 0)
  635. {
  636. gagent_err("lan:%d lan->recv_len:%d errno:%d\n", id, lan->recv_len, errno);
  637. lwip_close(lan->client_fd[id]);
  638. lan->client_fd[id] = -1;
  639. if(tcp_client_count > 0)
  640. tcp_client_count --;
  641. continue;
  642. }
  643. #ifdef LAN_RECV_DEBUG
  644. {
  645. int t;
  646. gagent_dbg("lan %d recv len:%d\n", id, lan->recv_len);
  647. for(t = 0; t < lan->recv_len; t ++)
  648. rt_kprintf("%02x ", lan->recv_buf[t]);
  649. rt_kprintf("\r\n");
  650. }
  651. #endif
  652. rc = lan_tcp_do_packet(lan);
  653. //
  654. if(rc == RT_EOK && lan->send_len > 0)
  655. {
  656. #ifdef LAN_RECV_DEBUG
  657. gagent_dbg("tcp client:%d send_len:%d\n", id, lan->send_len);
  658. {
  659. int t;
  660. for(t = 0; t < lan->send_len; t ++)
  661. rt_kprintf("%02x ", lan->send_buf[t]);
  662. rt_kprintf("\r\n");
  663. }
  664. #endif
  665. lan->send_len = lwip_send(lan->client_fd[id], lan->send_buf, lan->send_len, 0);
  666. if(lan->send_len <= 0)
  667. {
  668. gagent_err("tcp client [%d] send failed! errno:%d\n", id, errno);
  669. lwip_close(lan->client_fd[id]);
  670. lan->client_fd[id] = -1;
  671. if(tcp_client_count > 0)
  672. tcp_client_count --;
  673. continue;
  674. }
  675. }
  676. }
  677. }
  678. }//end while
  679. for(id = 0; id < MAX_CLIENT; id ++)
  680. {
  681. if(lan->client_fd[id] != -1)
  682. {
  683. lwip_close(lan->client_fd[id]);
  684. lan->client_fd[id] = -1;
  685. }
  686. }
  687. tcp_client_count = 0;
  688. gagent_close_tcp_socket(lan);
  689. gagent_close_udp_socket(lan);
  690. gagent_close_localudp_socket(lan);
  691. }
  692. }
  693. static int lan_local_send(lan_st *lan, void *data, int len)
  694. {
  695. struct sockaddr_in server_addr = {0};
  696. int send_len;
  697. server_addr.sin_family = AF_INET;
  698. server_addr.sin_port = lan->local_port;
  699. server_addr.sin_addr = *((const struct in_addr *)&netif_default->ip_addr);
  700. memset(&server_addr.sin_zero, 0, sizeof(server_addr.sin_zero));
  701. send_len = lwip_sendto(lan->local_sock, data, len, MSG_DONTWAIT,
  702. (struct sockaddr *)&server_addr, sizeof(server_addr));
  703. return send_len;
  704. }
  705. int gagent_lan_send_packet(lan_st *lan, rt_uint8_t action, rt_uint8_t *buf, rt_uint16_t buf_len)
  706. {
  707. int rc = RT_EOK;
  708. memset(lan->send_buf, 0, sizeof(lan->send_buf));
  709. lan->send_len = 0;
  710. lan->send_len = gagent_set_one_packet(lan->send_buf, action, buf, buf_len);
  711. #ifdef LAN_SEND_DEBUG
  712. {
  713. uint32_t i;
  714. rt_kprintf("lan send_len:%d\n", lan->send_len);
  715. for(i = 0; i < lan->send_len; i ++)
  716. rt_kprintf("%02x ", lan->send_buf[i]);
  717. rt_kprintf("\r\n");
  718. }
  719. #endif
  720. rc = lan_local_send(lan, lan->send_buf, lan->send_len);
  721. if (rc == lan->send_len)
  722. rc = RT_EOK;
  723. else
  724. rc = -RT_ERROR;
  725. return rc;
  726. }
  727. int gagent_lan_init(lan_st *lan)
  728. {
  729. lan_thread = rt_thread_create("gagent_lan",
  730. gagent_lan_thread,
  731. lan,
  732. 4096,
  733. 15,
  734. 20);
  735. if(lan_thread)
  736. rt_thread_startup(lan_thread);
  737. else
  738. {
  739. gagent_err("gagent_lan thread startup failed!\n");
  740. rt_free(lan);
  741. return -RT_ERROR;
  742. }
  743. return RT_EOK;
  744. }