Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed
main.cpp
- Committer:
- pehrhovey
- Date:
- 2010-03-14
- Revision:
- 0:a548a085de55
File content as of revision 0:a548a085de55:
/* Pehr Hovey Tests with UDP for mBed */ #include "mbed.h" #include "lwip/init.h" #include "lwip/opt.h" #include "lwip/udp.h" #include "NetServer.h" #include "ipv4/lwip/ip_addr.h" int send_test = 0; //toggled by button struct udp_pcb *pcb; InterruptIn button(p8); DigitalOut got_udp(LED1); DigitalOut sent_udp(LED4); //callback for button interrupt void sendBroadcast(){ //broadcast something struct pbuf *p; char msg[]="testing mBedUDP"; p = pbuf_alloc(PBUF_TRANSPORT,sizeof(msg),PBUF_RAM); memcpy (p->payload, msg, sizeof(msg)); err_t res = udp_sendto(pcb, p, IP_ADDR_BROADCAST, 5555); //broadcast test msg pbuf_free(p); //De-allocate packet buffer printf("Sent test message to port 1234, result is %d Waiting...\r\n",res); } //Send arbitrary data static void udp_send_something(char msg[], struct udp_pcb *upcb, struct ip_addr *addr, u16_t port) { printf("Sending message to port %d: %s\r\n",port,msg); sent_udp = 1; int psize = 40; //pick a size for now... struct pbuf *q; q = pbuf_alloc(PBUF_TRANSPORT,psize, PBUF_RAM); printf("Making packet with size %d\r\n",psize); if (q != NULL) { sent_udp = 1; q->payload = msg; //Assign the string pointer err_t code; /* send UDP response to IP addr and port specified */ code = udp_sendto(upcb, q, IP_ADDR_BROADCAST, port); printf("Sent, result code is %d\r\n",code); /* free the "reference" pbuf */ pbuf_free(q); }else{ printf("Could not allocate packet buffer!\r\n"); } sent_udp = 0; } /**UDP recv callback */ static void udp_test_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port) { printf("Received UDP Packet on port %d\r\n",port); // printf("Received UDP Packet from ip_addr %s\r\n", inet_ntoa(*(struct in_addr*)&(ip_addr))); LWIP_UNUSED_ARG(arg); got_udp = 1; /* if packet is valid */ if (p != NULL) { //Try to print out what we received printf("UDP Packet Received! Payload:\r\n"); printf("-- %s --\r\n",static_cast<char *>(p->payload)); err_t code = udp_sendto(upcb, p, IP_ADDR_BROADCAST, 5555); //send it back to port 5555 printf("Echo'd packet, result code is %d\r\n",code); /* free the pbuf */ pbuf_free(p); got_udp=0; sent_udp=0; } } int main() { //Attach interrupt to the button to send packet on press button.rise(&sendBroadcast); /*Initialize NetServer which gets us our DHCP address and gets the network interface ready */ NetServer *net = NetServer::ready(); //Initialize UDP pcb = udp_new(); if (pcb != NULL) { /* we have to be allowed to send broadcast packets! */ pcb->so_options |= SOF_BROADCAST; udp_bind(pcb, IP_ADDR_ANY, 4444); //Receive from any IP address, on the specified port udp_recv(pcb,udp_test_recv, NULL); }else{ printf("Could not make UDP pcb\r\n"); } net->waitUntilReady(); //this will print IP net->setHostname("chapala"); //Send a startup packet printf("UDP Tester started...\r\n"); while(1) { net->poll(); } }