#include "udp_client.h" #include udp_client_t udp_client; static inline void handle_receive(struct pbuf *p, const ip_addr_t *addr, u16_t port) { if(p->len >= 2) { uint8_t packet_number = ((uint8_t*)p->payload)[0]; uint8_t instruction = ((uint8_t*)p->payload)[1]; udp_client.message_callback(packet_number, instruction, addr, port); } pbuf_free(p); } static void udp_receive_callback(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) { udp_client_t *udp_client_received_data = (udp_client_t *)arg; handle_receive(p, addr, port); } // Default callback func static void default_message_callback(uint8_t packet_number, uint8_t instruction, const ip_addr_t *addr, u16_t port) { printf("Reçu: packet=%d, instruction=%d depuis %s:%d\n", packet_number, instruction, ipaddr_ntoa(addr), port); } void udp_client_init(int port, message_callback_t callback) { udp_client.message_callback = callback ? callback : default_message_callback; udp_client.pcb = udp_new(); if(udp_client.pcb == NULL) { puts("Error creating UDP client"); return; } udp_recv(udp_client.pcb, udp_receive_callback, &udp_client); err_t err = udp_bind(udp_client.pcb, IP_ADDR_ANY, port); if(err != ERR_OK) { printf("Erreur bind UDP client: %d\n", err); return; } printf("UDP client started on port %d\n", port); } void udp_client_exit(void) { if(udp_client.pcb) { udp_remove(udp_client.pcb); udp_client.pcb = NULL; } }