93 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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
 | |
|              emit udp_recv_signal(s,"string",0,arr_temp(arr),"ok");
 | |
|         } 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);
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | 
