Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed
main.cpp@0:a548a085de55, 2010-03-14 (annotated)
- Committer:
- pehrhovey
- Date:
- Sun Mar 14 00:54:12 2010 +0000
- Revision:
- 0:a548a085de55
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pehrhovey | 0:a548a085de55 | 1 | /* Pehr Hovey |
pehrhovey | 0:a548a085de55 | 2 | Tests with UDP for mBed |
pehrhovey | 0:a548a085de55 | 3 | */ |
pehrhovey | 0:a548a085de55 | 4 | |
pehrhovey | 0:a548a085de55 | 5 | #include "mbed.h" |
pehrhovey | 0:a548a085de55 | 6 | #include "lwip/init.h" |
pehrhovey | 0:a548a085de55 | 7 | #include "lwip/opt.h" |
pehrhovey | 0:a548a085de55 | 8 | #include "lwip/udp.h" |
pehrhovey | 0:a548a085de55 | 9 | |
pehrhovey | 0:a548a085de55 | 10 | |
pehrhovey | 0:a548a085de55 | 11 | |
pehrhovey | 0:a548a085de55 | 12 | #include "NetServer.h" |
pehrhovey | 0:a548a085de55 | 13 | |
pehrhovey | 0:a548a085de55 | 14 | #include "ipv4/lwip/ip_addr.h" |
pehrhovey | 0:a548a085de55 | 15 | |
pehrhovey | 0:a548a085de55 | 16 | int send_test = 0; //toggled by button |
pehrhovey | 0:a548a085de55 | 17 | |
pehrhovey | 0:a548a085de55 | 18 | struct udp_pcb *pcb; |
pehrhovey | 0:a548a085de55 | 19 | |
pehrhovey | 0:a548a085de55 | 20 | InterruptIn button(p8); |
pehrhovey | 0:a548a085de55 | 21 | |
pehrhovey | 0:a548a085de55 | 22 | DigitalOut got_udp(LED1); |
pehrhovey | 0:a548a085de55 | 23 | |
pehrhovey | 0:a548a085de55 | 24 | DigitalOut sent_udp(LED4); |
pehrhovey | 0:a548a085de55 | 25 | |
pehrhovey | 0:a548a085de55 | 26 | //callback for button interrupt |
pehrhovey | 0:a548a085de55 | 27 | void sendBroadcast(){ |
pehrhovey | 0:a548a085de55 | 28 | //broadcast something |
pehrhovey | 0:a548a085de55 | 29 | struct pbuf *p; |
pehrhovey | 0:a548a085de55 | 30 | char msg[]="testing mBedUDP"; |
pehrhovey | 0:a548a085de55 | 31 | p = pbuf_alloc(PBUF_TRANSPORT,sizeof(msg),PBUF_RAM); |
pehrhovey | 0:a548a085de55 | 32 | memcpy (p->payload, msg, sizeof(msg)); |
pehrhovey | 0:a548a085de55 | 33 | err_t res = udp_sendto(pcb, p, IP_ADDR_BROADCAST, 5555); //broadcast test msg |
pehrhovey | 0:a548a085de55 | 34 | pbuf_free(p); //De-allocate packet buffer |
pehrhovey | 0:a548a085de55 | 35 | printf("Sent test message to port 1234, result is %d Waiting...\r\n",res); |
pehrhovey | 0:a548a085de55 | 36 | } |
pehrhovey | 0:a548a085de55 | 37 | |
pehrhovey | 0:a548a085de55 | 38 | //Send arbitrary data |
pehrhovey | 0:a548a085de55 | 39 | static void udp_send_something(char msg[], struct udp_pcb *upcb, struct ip_addr *addr, u16_t port) |
pehrhovey | 0:a548a085de55 | 40 | { |
pehrhovey | 0:a548a085de55 | 41 | printf("Sending message to port %d: %s\r\n",port,msg); |
pehrhovey | 0:a548a085de55 | 42 | sent_udp = 1; |
pehrhovey | 0:a548a085de55 | 43 | int psize = 40; //pick a size for now... |
pehrhovey | 0:a548a085de55 | 44 | struct pbuf *q; |
pehrhovey | 0:a548a085de55 | 45 | q = pbuf_alloc(PBUF_TRANSPORT,psize, PBUF_RAM); |
pehrhovey | 0:a548a085de55 | 46 | printf("Making packet with size %d\r\n",psize); |
pehrhovey | 0:a548a085de55 | 47 | if (q != NULL) { |
pehrhovey | 0:a548a085de55 | 48 | sent_udp = 1; |
pehrhovey | 0:a548a085de55 | 49 | q->payload = msg; //Assign the string pointer |
pehrhovey | 0:a548a085de55 | 50 | |
pehrhovey | 0:a548a085de55 | 51 | err_t code; |
pehrhovey | 0:a548a085de55 | 52 | /* send UDP response to IP addr and port specified */ |
pehrhovey | 0:a548a085de55 | 53 | code = udp_sendto(upcb, q, IP_ADDR_BROADCAST, port); |
pehrhovey | 0:a548a085de55 | 54 | printf("Sent, result code is %d\r\n",code); |
pehrhovey | 0:a548a085de55 | 55 | /* free the "reference" pbuf */ |
pehrhovey | 0:a548a085de55 | 56 | pbuf_free(q); |
pehrhovey | 0:a548a085de55 | 57 | }else{ |
pehrhovey | 0:a548a085de55 | 58 | printf("Could not allocate packet buffer!\r\n"); |
pehrhovey | 0:a548a085de55 | 59 | } |
pehrhovey | 0:a548a085de55 | 60 | sent_udp = 0; |
pehrhovey | 0:a548a085de55 | 61 | } |
pehrhovey | 0:a548a085de55 | 62 | |
pehrhovey | 0:a548a085de55 | 63 | /**UDP recv callback */ |
pehrhovey | 0:a548a085de55 | 64 | static void udp_test_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port) |
pehrhovey | 0:a548a085de55 | 65 | { |
pehrhovey | 0:a548a085de55 | 66 | printf("Received UDP Packet on port %d\r\n",port); |
pehrhovey | 0:a548a085de55 | 67 | // printf("Received UDP Packet from ip_addr %s\r\n", inet_ntoa(*(struct in_addr*)&(ip_addr))); |
pehrhovey | 0:a548a085de55 | 68 | LWIP_UNUSED_ARG(arg); |
pehrhovey | 0:a548a085de55 | 69 | got_udp = 1; |
pehrhovey | 0:a548a085de55 | 70 | /* if packet is valid */ |
pehrhovey | 0:a548a085de55 | 71 | if (p != NULL) { |
pehrhovey | 0:a548a085de55 | 72 | //Try to print out what we received |
pehrhovey | 0:a548a085de55 | 73 | printf("UDP Packet Received! Payload:\r\n"); |
pehrhovey | 0:a548a085de55 | 74 | printf("-- %s --\r\n",static_cast<char *>(p->payload)); |
pehrhovey | 0:a548a085de55 | 75 | err_t code = udp_sendto(upcb, p, IP_ADDR_BROADCAST, 5555); //send it back to port 5555 |
pehrhovey | 0:a548a085de55 | 76 | printf("Echo'd packet, result code is %d\r\n",code); |
pehrhovey | 0:a548a085de55 | 77 | |
pehrhovey | 0:a548a085de55 | 78 | |
pehrhovey | 0:a548a085de55 | 79 | /* free the pbuf */ |
pehrhovey | 0:a548a085de55 | 80 | pbuf_free(p); |
pehrhovey | 0:a548a085de55 | 81 | got_udp=0; |
pehrhovey | 0:a548a085de55 | 82 | sent_udp=0; |
pehrhovey | 0:a548a085de55 | 83 | } |
pehrhovey | 0:a548a085de55 | 84 | } |
pehrhovey | 0:a548a085de55 | 85 | |
pehrhovey | 0:a548a085de55 | 86 | |
pehrhovey | 0:a548a085de55 | 87 | int main() { |
pehrhovey | 0:a548a085de55 | 88 | //Attach interrupt to the button to send packet on press |
pehrhovey | 0:a548a085de55 | 89 | button.rise(&sendBroadcast); |
pehrhovey | 0:a548a085de55 | 90 | |
pehrhovey | 0:a548a085de55 | 91 | /*Initialize NetServer which gets us our DHCP address and |
pehrhovey | 0:a548a085de55 | 92 | gets the network interface ready |
pehrhovey | 0:a548a085de55 | 93 | */ |
pehrhovey | 0:a548a085de55 | 94 | NetServer *net = NetServer::ready(); |
pehrhovey | 0:a548a085de55 | 95 | |
pehrhovey | 0:a548a085de55 | 96 | |
pehrhovey | 0:a548a085de55 | 97 | //Initialize UDP |
pehrhovey | 0:a548a085de55 | 98 | |
pehrhovey | 0:a548a085de55 | 99 | pcb = udp_new(); |
pehrhovey | 0:a548a085de55 | 100 | |
pehrhovey | 0:a548a085de55 | 101 | |
pehrhovey | 0:a548a085de55 | 102 | |
pehrhovey | 0:a548a085de55 | 103 | if (pcb != NULL) { |
pehrhovey | 0:a548a085de55 | 104 | /* we have to be allowed to send broadcast packets! */ |
pehrhovey | 0:a548a085de55 | 105 | pcb->so_options |= SOF_BROADCAST; |
pehrhovey | 0:a548a085de55 | 106 | udp_bind(pcb, IP_ADDR_ANY, 4444); //Receive from any IP address, on the specified port |
pehrhovey | 0:a548a085de55 | 107 | udp_recv(pcb,udp_test_recv, NULL); |
pehrhovey | 0:a548a085de55 | 108 | }else{ |
pehrhovey | 0:a548a085de55 | 109 | printf("Could not make UDP pcb\r\n"); |
pehrhovey | 0:a548a085de55 | 110 | } |
pehrhovey | 0:a548a085de55 | 111 | |
pehrhovey | 0:a548a085de55 | 112 | |
pehrhovey | 0:a548a085de55 | 113 | net->waitUntilReady(); //this will print IP |
pehrhovey | 0:a548a085de55 | 114 | net->setHostname("chapala"); |
pehrhovey | 0:a548a085de55 | 115 | |
pehrhovey | 0:a548a085de55 | 116 | //Send a startup packet |
pehrhovey | 0:a548a085de55 | 117 | printf("UDP Tester started...\r\n"); |
pehrhovey | 0:a548a085de55 | 118 | |
pehrhovey | 0:a548a085de55 | 119 | while(1) { |
pehrhovey | 0:a548a085de55 | 120 | net->poll(); |
pehrhovey | 0:a548a085de55 | 121 | |
pehrhovey | 0:a548a085de55 | 122 | |
pehrhovey | 0:a548a085de55 | 123 | } |
pehrhovey | 0:a548a085de55 | 124 | } |