63 lines
1.6 KiB
C
63 lines
1.6 KiB
C
#include "udp_client.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
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;
|
|
}
|
|
}
|