Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }