| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  | #include "lwip/opt.h"
 | 
					
						
							|  |  |  | #include "lwip/sys.h"
 | 
					
						
							|  |  |  | #include "lwip/api.h"
 | 
					
						
							|  |  |  | #include "debug.h"
 | 
					
						
							|  |  |  | #include "lwip/tcp.h"
 | 
					
						
							|  |  |  | #include "board.h"
 | 
					
						
							|  |  |  | #include "udp.h"
 | 
					
						
							|  |  |  | #include "dev_flash.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct{ | 
					
						
							|  |  |  |   struct netconn *conn; | 
					
						
							|  |  |  |   struct netbuf *buf;// 接收的数据
 | 
					
						
							|  |  |  |   ip_addr_t dst_ip; | 
					
						
							|  |  |  |   int dst_port; | 
					
						
							|  |  |  | }self_def; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void *tappend(void *p,void *del); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void udp_thread(void *arg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   self_def *s=arg; | 
					
						
							|  |  |  |   err_t err; | 
					
						
							|  |  |  |   LWIP_UNUSED_ARG(arg); | 
					
						
							|  |  |  |   ip_addr_t dst; | 
					
						
							|  |  |  |   const sys_param_def *par=sys_param(); | 
					
						
							|  |  |  |   IP4_ADDR(&dst,par->host_ip[0],par->host_ip[1],par->host_ip[2],par->host_ip[3]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while (1) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     s->conn = netconn_new(NETCONN_UDP); | 
					
						
							|  |  |  |     err=netconn_bind(s->conn, IP_ADDR_ANY, 7777); | 
					
						
							|  |  |  |     if (err == ERR_OK) { | 
					
						
							|  |  |  |       void *data; | 
					
						
							|  |  |  |       u16_t len; | 
					
						
							|  |  |  |       while ((err = netconn_recv(s->conn, &s->buf)) == ERR_OK) { | 
					
						
							|  |  |  |         do { | 
					
						
							|  |  |  |              netbuf_data(s->buf, &data, &len); | 
					
						
							|  |  |  |              s->dst_ip=*netbuf_fromaddr(s->buf); | 
					
						
							|  |  |  |              s->dst_port=netbuf_fromport(s->buf); | 
					
						
							|  |  |  |              array_def *arr=arr_creat(); | 
					
						
							|  |  |  |              arr_appends(arr,data,len); | 
					
						
							|  |  |  |              arr_append(arr,0); | 
					
						
							|  |  |  |              // 字符数据命令字为0
 | 
					
						
							| 
									
										
										
										
											2023-06-14 18:05:04 +08:00
										 |  |  |              emit udp_recv_signal(s,"string",0,arr_temp(arr),"ok"); | 
					
						
							| 
									
										
										
										
											2023-06-10 11:52:00 +08:00
										 |  |  |         } while (netbuf_next(s->buf) >= 0); | 
					
						
							|  |  |  |         netbuf_delete(s->buf); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       DBG_LOG("udp:err=%d",err); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     netconn_close(s->conn); | 
					
						
							|  |  |  |     netconn_delete(s->conn); | 
					
						
							|  |  |  |     sys_msleep(1000); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int myudp_init(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   self_def *s=calloc(1,sizeof(self_def)); | 
					
						
							|  |  |  |   sys_thread_new("udp_thread", udp_thread, s, 2048, 29); | 
					
						
							|  |  |  |   app_variable("udp",s,0); | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | app_init_export(myudp_init) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void udp_reply_call(void *obj,uint8_t cmd,array_def *data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   self_def *s=obj; | 
					
						
							|  |  |  |   err_t err; | 
					
						
							|  |  |  |   if(s->dst_port!=0){ | 
					
						
							|  |  |  |     struct netbuf *sbuf=netbuf_new(); | 
					
						
							|  |  |  |     netbuf_ref(sbuf,arr_data(data),arr_length(data)); | 
					
						
							|  |  |  |     err=netconn_sendto(s->conn,sbuf,&s->dst_ip,s->dst_port); | 
					
						
							|  |  |  |     netbuf_delete(sbuf); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |