gagent_lan.c 25 KB

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