lwip.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. /*
  2. * lwip_util.c
  3. *
  4. * Created on: 2025年7月29日
  5. * Author: wulianwei
  6. */
  7. #include "nim_config.h"
  8. #include "device/console.h"
  9. #include "hal/nim_ethernet.h"
  10. #include "lwiplib.h"
  11. #include "lwipopts.h"
  12. #include <tr_queue.h>
  13. #define TCP_POLL_INTERVAL 4
  14. #define MAX_SIZE 4096
  15. static err_t tcp_accept_handle(void *arg, struct tcp_pcb *pcb, err_t err);
  16. static err_t tcp_recv_handle(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
  17. err_t err);
  18. static void tcp_close_conn(struct tcp_pcb *pcb);
  19. err_t tcp_send_data(struct tcp_pcb *pcb, struct pbuf *p);
  20. err_t queue_send_data(struct pbuf *p);
  21. static struct udp_pcb *gui_udp_pcb;
  22. static struct tcp_pcb *tcp_server_pcb ;
  23. static struct tcp_pcb *cur_conn = NULL; // 当前连接
  24. void lwip_device_init(void)
  25. {
  26. unsigned char macArray[6] = MAC_ADDRESS;
  27. EthernetInit(); //以太网外设配置
  28. unsigned int ipAddr = 0;
  29. unsigned int retry_count = 0;
  30. while (ipAddr == 0)
  31. {
  32. #if STATIC_IP_ADDRESS
  33. ipAddr = lwIPInit(0, macArray, STATIC_IP_ADDRESS, 0, 0,
  34. IPADDR_USE_STATIC);
  35. #else
  36. ipAddr = lwIPInit(0, macArray, 0, 0, 0, IPADDR_USE_DHCP);
  37. #endif
  38. if (retry_count++ > 5)
  39. {
  40. ConsolePrintf("lwIPInit failed!.\r\n\r\n");
  41. }
  42. }
  43. ConsolePrintf("lwIP HostIP:%d.%d.%d.%d\n", (ipAddr >> (0 * 8)) & 0xFF,
  44. (ipAddr >> (1 * 8)) & 0xFF, (ipAddr >> (2 * 8)) & 0xFF,
  45. (ipAddr >> (3 * 8)) & 0xFF);
  46. gui_udp_pcb = udp_new();
  47. udp_bind(gui_udp_pcb, IP_ADDR_ANY, 3000);
  48. lwip_udp_connect(gui_udp_pcb, UI_IP_ADDRESS, UI_UDP_PORT);
  49. }
  50. /**
  51. * tcp 服务初始化
  52. */
  53. err_t lwip_tcp_init(int port)
  54. {
  55. err_t err;
  56. //struct tcp_pcb *pcb;
  57. tcp_server_pcb = tcp_new();
  58. if (tcp_server_pcb == NULL) {
  59. ConsolePuts("tcp new 空间不足", -1);
  60. return ERR_MEM; // 内存不足
  61. }
  62. err = tcp_bind(tcp_server_pcb , IP_ADDR_ANY, port);
  63. if (err != ERR_OK) {
  64. ConsolePuts("tcp 绑定断开失败", -1);
  65. return err;
  66. }
  67. tcp_server_pcb = tcp_listen(tcp_server_pcb );
  68. if(tcp_server_pcb == NULL)
  69. {
  70. ConsolePuts("tcp 监听失败", -1);
  71. }
  72. /* initialize callback arg and accept callback */
  73. tcp_arg(tcp_server_pcb , NULL);
  74. tcp_accept(tcp_server_pcb , tcp_accept_handle);
  75. return ERR_OK;
  76. }
  77. /**
  78. * 链接监听函数.
  79. */
  80. static err_t tcp_accept_handle(void *arg, struct tcp_pcb *pcb, err_t err)
  81. {
  82. LWIP_UNUSED_ARG(err);
  83. LWIP_UNUSED_ARG(arg);
  84. tcp_setprio(pcb, TCP_PRIO_MAX);
  85. /* Set up the various callback functions */
  86. tcp_recv(pcb, tcp_recv_handle);
  87. tcp_err(pcb, NULL);
  88. tcp_poll(pcb, NULL, TCP_POLL_INTERVAL);
  89. tcp_sent(pcb, NULL);
  90. return ERR_OK;
  91. }
  92. /**
  93. * 接收数据处理函数.
  94. */
  95. static err_t tcp_recv_handle(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
  96. err_t err)
  97. {
  98. LWIP_UNUSED_ARG(arg);
  99. LWIP_UNUSED_ARG(err);
  100. err_t err_send;
  101. if (p != NULL)
  102. {
  103. /* Inform TCP that we have taken the data. */
  104. tcp_recved(pcb, p->tot_len);
  105. }
  106. if ((err != ERR_OK) || (p == NULL))
  107. {
  108. /* error or closed by other side */
  109. if (p != NULL)
  110. {
  111. pbuf_free(p);
  112. }
  113. tcp_close_conn(pcb);
  114. return ERR_OK;
  115. }
  116. cur_conn = pcb;
  117. //tcp_send_data(pcb ,p);
  118. err_send = queue_send_data(p);
  119. return err_send;
  120. }
  121. /**
  122. * 关闭远程连接.
  123. */
  124. static void tcp_close_conn(struct tcp_pcb *pcb)
  125. {
  126. tcp_recv(pcb, NULL);
  127. tcp_close(pcb);
  128. /* closing succeeded */
  129. tcp_arg(pcb, NULL);
  130. tcp_sent(pcb, NULL);
  131. }
  132. /**
  133. * 发送数据
  134. */
  135. err_t tcp_send_data(struct tcp_pcb *pcb, struct pbuf *p)
  136. {
  137. unsigned char mydata[MAX_SIZE];
  138. err_t err = ERR_OK;
  139. char *data;
  140. unsigned int cnt = 0, j, i;
  141. unsigned int len, tot_len;
  142. struct pbuf *temp = p;
  143. tot_len = p->tot_len;
  144. /**
  145. * traverse pbuf chain and store payload
  146. * of each pbuf into buffer
  147. */
  148. do
  149. {
  150. data = (char*) p->payload;
  151. len = p->len;
  152. for (i = 0, j = 0; i < len; i++, j++, cnt++)
  153. {
  154. if(cnt>=MAX_SIZE) break;
  155. mydata[cnt] = data[j];
  156. }
  157. p = p->next;
  158. }
  159. while (p != NULL);
  160. /* free pbuf's */
  161. pbuf_free(temp);
  162. /**
  163. *send the data in buffer over network with
  164. * tcp header attached
  165. */
  166. err = tcp_write(pcb, mydata, tot_len , TCP_WRITE_FLAG_COPY);
  167. return err;
  168. }
  169. void lwip_tcp_send_gui(unsigned char *data, int len)
  170. {
  171. tcp_write(cur_conn, data, len , TCP_WRITE_FLAG_COPY);
  172. tcp_output(cur_conn);
  173. }
  174. /**
  175. * 发送数据到USB
  176. */
  177. err_t queue_send_data(struct pbuf *p)
  178. {
  179. struct pbuf *temp = p;
  180. unsigned int len = 0;
  181. do
  182. {
  183. char* data = (char*) p->payload;
  184. len = p->len;
  185. ConsolePuts("\r\ntcp rec data:\r\n", -1);
  186. ConsolePutsHexStr(data, len);
  187. enqueueFromEthernet(data, len);
  188. p = p->next;
  189. }
  190. while (p != NULL);
  191. pbuf_free(temp);
  192. return ERR_OK;
  193. }
  194. /**
  195. * udp 链接
  196. */
  197. void lwip_udp_connect(struct udp_pcb *pcb, unsigned int ip, int port)
  198. {
  199. struct ip_addr ip_dst;
  200. ip_dst.addr = htonl(ip);
  201. udp_connect(pcb, &ip_dst, port);
  202. }
  203. /**
  204. * udp 发送
  205. */
  206. void lwip_udp_send(struct udp_pcb *pcb, unsigned char *data, int len)
  207. {
  208. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, len + sizeof(struct pbuf),
  209. PBUF_REF);
  210. pbuf->payload = data;
  211. udp_send(pcb, pbuf);
  212. pbuf_free(pbuf);
  213. }
  214. /**
  215. * udp 发送
  216. */
  217. void lwip_udp_sendto(struct udp_pcb *pcb, unsigned int ip, int port,
  218. unsigned char *data, int len)
  219. {
  220. struct ip_addr ip_dst;
  221. ip_dst.addr = htonl(ip);
  222. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct pbuf),
  223. PBUF_REF);
  224. pbuf->payload = data;
  225. udp_sendto(pcb, pbuf, &ip_dst, port);
  226. pbuf_free(pbuf);
  227. }
  228. /**
  229. * udp 向gui发送数据
  230. */
  231. void lwip_udp_send_gui(unsigned char *data, int len)
  232. {
  233. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, len,
  234. PBUF_REF);
  235. pbuf->payload = data;
  236. udp_send(gui_udp_pcb, pbuf);
  237. pbuf_free(pbuf);
  238. }
  239. /**
  240. * udp 向gui发送数据
  241. * data 浮点数据指针, flen 数据数量, channelFlag 有效通道
  242. */
  243. void lwip_udp_send_gui_signal(float *data, int flen, char channelFlag)
  244. {
  245. unsigned char head[8]={'T','R',1,3,1,1};
  246. int clen = sizeof(float)*flen;
  247. int head_len = sizeof(head);
  248. int total_len = head_len+1+clen;
  249. head[6] = total_len>>8;
  250. head[7] = total_len;
  251. unsigned char* fdata = malloc(total_len);
  252. memcpy(fdata,&head,head_len);
  253. fdata[head_len] = channelFlag;
  254. memcpy(fdata+head_len+1,data,clen);
  255. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, total_len,
  256. PBUF_REF);
  257. pbuf->payload = fdata;
  258. udp_send(gui_udp_pcb, pbuf);
  259. pbuf_free(pbuf);
  260. free(fdata);
  261. }
  262. /**
  263. * udp 向gui发送数据
  264. * data 浮点数据指针, flen 数据数量, channelFlag 有效通道
  265. */
  266. void lwip_udp_send_gui_signal2(float *data1,float *data2,float *data3,float *data4, int flen, char channelFlag)
  267. {
  268. unsigned char head[8]={'T','R',1,3,1,1};
  269. int clen = sizeof(float)*flen;
  270. int head_len = sizeof(head);
  271. int total_len = head_len+1+clen;
  272. head[6] = total_len>>8;
  273. head[7] = total_len;
  274. unsigned char* fdata = malloc(total_len);
  275. memcpy(fdata,&head,head_len);
  276. fdata[head_len] = channelFlag;
  277. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, total_len,
  278. PBUF_REF);
  279. pbuf->payload = fdata;
  280. udp_send(gui_udp_pcb, pbuf);
  281. pbuf_free(pbuf);
  282. free(fdata);
  283. }
  284. /**
  285. * udp 向波形模拟器VOFA发送数据 单通道
  286. * data 要发送的数据,len float数组长度
  287. */
  288. void lwip_udp_send_vofa(float *data, int len)
  289. {
  290. int i = 0;
  291. char tail[4] = {0x00, 0x00, 0x80, 0x7f};
  292. int flen = (sizeof(float)+4)*len;
  293. unsigned char* fdata = malloc(flen);
  294. for(i=0;i<len;i++)
  295. {
  296. memcpy(fdata+(i*(sizeof(float)+4)),data,sizeof(float));
  297. memcpy(fdata+(i*(sizeof(float)+4))+4,tail,sizeof(tail));
  298. data++;
  299. }
  300. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, flen,
  301. PBUF_REF);
  302. pbuf->payload = fdata;
  303. udp_send(gui_udp_pcb, pbuf);
  304. pbuf_free(pbuf);
  305. free(fdata);
  306. }
  307. /**
  308. * udp 向波形模拟器VOFA发送数据 双通道
  309. * data1 要发送的通道1数据,data1 要发送的通道2数据,len float数组长度
  310. */
  311. void lwip_udp_send_vofa2(float *data1, float *data2, int len)
  312. {
  313. ConsolePuts("lwip send data", -1);
  314. int i = 0;
  315. char tail[4] = {0x00, 0x00, 0x80, 0x7f};
  316. int flen = (sizeof(float)*2+4)*len;
  317. unsigned char* fdata = malloc(flen);
  318. for(i=0;i<len;i++)
  319. {
  320. memcpy(fdata+(i*(sizeof(float)*2+4)),data1,sizeof(float));
  321. memcpy(fdata+(i*(sizeof(float)*2+4))+4,data2,sizeof(float));
  322. memcpy(fdata+(i*(sizeof(float)*2+4))+8,tail,sizeof(tail));
  323. data1++;
  324. data2++;
  325. }
  326. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, flen,
  327. PBUF_REF);
  328. pbuf->payload = fdata;
  329. udp_send(gui_udp_pcb, pbuf);
  330. pbuf_free(pbuf);
  331. free(fdata);
  332. }
  333. /**
  334. * udp 向波形模拟器VOFA发送数据 四通道
  335. * data1 要发送的通道1数据,data1 要发送的通道2数据,len float数组长度
  336. */
  337. void lwip_udp_send_vofa4(float *data1, float *data2,float *data3, float *data4, int len)
  338. {
  339. int i = 0;
  340. char tail[4] = {0x00, 0x00, 0x80, 0x7f};
  341. int flen = (sizeof(float)*4+4)*len;
  342. unsigned char* fdata = malloc(flen);
  343. for(i=0;i<len;i++)
  344. {
  345. memcpy(fdata+(i*(sizeof(float)*4+4)),data1,sizeof(float));
  346. memcpy(fdata+(i*(sizeof(float)*4+4))+4,data2,sizeof(float));
  347. memcpy(fdata+(i*(sizeof(float)*4+4))+8,data3,sizeof(float));
  348. memcpy(fdata+(i*(sizeof(float)*4+4))+12,data4,sizeof(float));
  349. memcpy(fdata+(i*(sizeof(float)*4+4))+16,tail,sizeof(tail));
  350. data1++;
  351. data2++;
  352. data3++;
  353. data4++;
  354. }
  355. struct pbuf *pbuf = pbuf_alloc(PBUF_TRANSPORT, flen,
  356. PBUF_REF);
  357. pbuf->payload = fdata;
  358. udp_send(gui_udp_pcb, pbuf);
  359. pbuf_free(pbuf);
  360. free(fdata);
  361. }