Example program showing how to use the mbedNet library with UDP sockets. This demo broadcasts a message each second with a counter value incrementing at every call while the application loop displays the datagrams received on the same socket.

Dependencies:   mbed

Committer:
Benoit
Date:
Tue Jun 14 05:08:11 2011 +0000
Revision:
0:1b4d6b9e92a9
Child:
1:552bcce1761d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Benoit 0:1b4d6b9e92a9 1 #include <mbed.h>
Benoit 0:1b4d6b9e92a9 2 #include <Sockets.h>
Benoit 0:1b4d6b9e92a9 3 #include <mbedNetIF.h>
Benoit 0:1b4d6b9e92a9 4 #include <ARP.h>
Benoit 0:1b4d6b9e92a9 5 #include <ICMPv4.h>
Benoit 0:1b4d6b9e92a9 6 #include <UDPv4.h>
Benoit 0:1b4d6b9e92a9 7 #include <Debug.h>
Benoit 0:1b4d6b9e92a9 8
Benoit 0:1b4d6b9e92a9 9
Benoit 0:1b4d6b9e92a9 10 #define NET_TIMER_PERIOD 1
Benoit 0:1b4d6b9e92a9 11 #define BUFFER_LEN 64
Benoit 0:1b4d6b9e92a9 12
Benoit 0:1b4d6b9e92a9 13
Benoit 0:1b4d6b9e92a9 14 Serial pc(USBTX, USBRX); // tx, rx
Benoit 0:1b4d6b9e92a9 15 Ticker netTicker, echoTicker;
Benoit 0:1b4d6b9e92a9 16 Ethernet_Addr_t myMAC = {0x00, 0x10, 0x33, 0x2e, 0x18, 0x7f};
Benoit 0:1b4d6b9e92a9 17 IPv4_Addr_t ip = {192, 168, 0, 2},
Benoit 0:1b4d6b9e92a9 18 netmask = {255, 255, 255, 0},
Benoit 0:1b4d6b9e92a9 19 gateway = {192, 168, 0, 1},
Benoit 0:1b4d6b9e92a9 20 broadcast = {192, 168, 0, 255};
Benoit 0:1b4d6b9e92a9 21 NetIF_t *mbedNetIF;
Benoit 0:1b4d6b9e92a9 22 Socket_t udpSocket;
Benoit 0:1b4d6b9e92a9 23 Socket_AddrIn_t localAddress, senderAddress, broadcastAddress;
Benoit 0:1b4d6b9e92a9 24
Benoit 0:1b4d6b9e92a9 25
Benoit 0:1b4d6b9e92a9 26 void NetTicker(void)
Benoit 0:1b4d6b9e92a9 27 {
Benoit 0:1b4d6b9e92a9 28 NetIF_ProcessTimers(NET_TIMER_PERIOD);
Benoit 0:1b4d6b9e92a9 29 }
Benoit 0:1b4d6b9e92a9 30
Benoit 0:1b4d6b9e92a9 31
Benoit 0:1b4d6b9e92a9 32 void EchoTicker(void)
Benoit 0:1b4d6b9e92a9 33 {
Benoit 0:1b4d6b9e92a9 34 char buffer[BUFFER_LEN];
Benoit 0:1b4d6b9e92a9 35 static int32_t counter = 0;
Benoit 0:1b4d6b9e92a9 36
Benoit 0:1b4d6b9e92a9 37 sprintf(buffer, "counter = %d\n", counter++);
Benoit 0:1b4d6b9e92a9 38 Sockets_SendTo(udpSocket, (uint8_t *)buffer, strlen(buffer), 0, (Socket_Addr_t *)&broadcastAddress, broadcastAddress.len);
Benoit 0:1b4d6b9e92a9 39 }
Benoit 0:1b4d6b9e92a9 40
Benoit 0:1b4d6b9e92a9 41
Benoit 0:1b4d6b9e92a9 42 int main()
Benoit 0:1b4d6b9e92a9 43 {
Benoit 0:1b4d6b9e92a9 44 int32_t byteCount, senderAddressLength;
Benoit 0:1b4d6b9e92a9 45 char buffer[BUFFER_LEN];
Benoit 0:1b4d6b9e92a9 46
Benoit 0:1b4d6b9e92a9 47 // serial output speed to 115200 baud
Benoit 0:1b4d6b9e92a9 48 pc.baud(115200);
Benoit 0:1b4d6b9e92a9 49
Benoit 0:1b4d6b9e92a9 50 // Clears screen and display a welcome message
Benoit 0:1b4d6b9e92a9 51 printf("%cStarting!\r\n", 12);
Benoit 0:1b4d6b9e92a9 52
Benoit 0:1b4d6b9e92a9 53 // Set debug levels to have the NetIF networking layer display the interface status
Benoit 0:1b4d6b9e92a9 54 Debug_SetMasks(DEBUG_MODULE_NETIF, DEBUG_LEVEL_ALL & ~(DEBUG_LEVEL_VERBOSE0 | DEBUG_LEVEL_VERBOSE1 | DEBUG_LEVEL_VERBOSE2));
Benoit 0:1b4d6b9e92a9 55
Benoit 0:1b4d6b9e92a9 56 mbedNetIF = NetIF_RegisterInterface(&ip, &netmask, &gateway, &mbedNetIF_Driver, (void *)&myMAC); // Registers the ethernet drivers as a network interface
Benoit 0:1b4d6b9e92a9 57
Benoit 0:1b4d6b9e92a9 58 ethernet.RegisterProtocol(&arp); // We need ARP over ethernet to resolve IP addresses with MAC addresses
Benoit 0:1b4d6b9e92a9 59 ethernet.RegisterProtocol(&ipv4); // We need IPv4 (over ethernet) of course
Benoit 0:1b4d6b9e92a9 60 ipv4.RegisterProtocol(&icmpv4); // Then ICMPv4 over IPv4 to answer ping requests
Benoit 0:1b4d6b9e92a9 61 ipv4.RegisterProtocol(&udpv4); // Next let's register UDPv4 over IPv4
Benoit 0:1b4d6b9e92a9 62 udpv4.RegisterAPI(&sockets); // Finally let's register the Sockets API (it is available for UDP at the moment)
Benoit 0:1b4d6b9e92a9 63 ARP_AddStaticEntry(mbedNetIF, broadcast, &ethernet_Addr_Broadcast); // We add a static entry to the broadcast address to the ARP cache
Benoit 0:1b4d6b9e92a9 64 netTicker.attach(&NetTicker, NET_TIMER_PERIOD); // A 1 second periodic timer to process network house keeping routines (like expiration in the ARP cache, timeouts for TCP in the future, ...)
Benoit 0:1b4d6b9e92a9 65
Benoit 0:1b4d6b9e92a9 66 ARP_DisplayCache(); // Display the ARP cache contents
Benoit 0:1b4d6b9e92a9 67
Benoit 0:1b4d6b9e92a9 68 NetIF_Up(mbedNetIF); // Finally we bring the network interface up
Benoit 0:1b4d6b9e92a9 69
Benoit 0:1b4d6b9e92a9 70 udpSocket = Sockets_Open(AF_INET, SOCK_DGRAM, 0); // Create an UDP socket
Benoit 0:1b4d6b9e92a9 71
Benoit 0:1b4d6b9e92a9 72 localAddress.family = AF_INET;
Benoit 0:1b4d6b9e92a9 73 localAddress.len = sizeof(Socket_AddrIn_t);
Benoit 0:1b4d6b9e92a9 74 localAddress.port = htons(12345);
Benoit 0:1b4d6b9e92a9 75 localAddress.address = ipv4_Addr_Any;
Benoit 0:1b4d6b9e92a9 76
Benoit 0:1b4d6b9e92a9 77 broadcastAddress.family = AF_INET;
Benoit 0:1b4d6b9e92a9 78 broadcastAddress.len = sizeof(Socket_AddrIn_t);
Benoit 0:1b4d6b9e92a9 79 broadcastAddress.port = htons(54321);
Benoit 0:1b4d6b9e92a9 80 broadcastAddress.address = broadcast;
Benoit 0:1b4d6b9e92a9 81
Benoit 0:1b4d6b9e92a9 82 Sockets_Bind(udpSocket, (Socket_Addr_t *)&localAddress, localAddress.len); // We bind the socket to port 12345 and any local IP address
Benoit 0:1b4d6b9e92a9 83
Benoit 0:1b4d6b9e92a9 84 echoTicker.attach(&EchoTicker, 2); // Every two seconds, broadcast an UDP message to port 54321
Benoit 0:1b4d6b9e92a9 85
Benoit 0:1b4d6b9e92a9 86 // Then do whatever you need for your application. here we simply check if we have received a datagram from the udpSocket and display its informations
Benoit 0:1b4d6b9e92a9 87 senderAddressLength = sizeof(Socket_AddrIn_t);
Benoit 0:1b4d6b9e92a9 88 while(true)
Benoit 0:1b4d6b9e92a9 89 {
Benoit 0:1b4d6b9e92a9 90 byteCount = Sockets_RecvFrom(udpSocket, (uint8_t *)buffer, BUFFER_LEN, 0, (Socket_Addr_t *)&senderAddress, &senderAddressLength);
Benoit 0:1b4d6b9e92a9 91 if (byteCount > 0)
Benoit 0:1b4d6b9e92a9 92 {
Benoit 0:1b4d6b9e92a9 93 buffer[byteCount] = '\0';
Benoit 0:1b4d6b9e92a9 94 printf("We have received '%s' (%d bytes) from %d.%d.%d.%d:%d\r\n",
Benoit 0:1b4d6b9e92a9 95 buffer,
Benoit 0:1b4d6b9e92a9 96 byteCount,
Benoit 0:1b4d6b9e92a9 97 senderAddress.address.IP0,
Benoit 0:1b4d6b9e92a9 98 senderAddress.address.IP1,
Benoit 0:1b4d6b9e92a9 99 senderAddress.address.IP2,
Benoit 0:1b4d6b9e92a9 100 senderAddress.address.IP3,
Benoit 0:1b4d6b9e92a9 101 ntohs(senderAddress.port)
Benoit 0:1b4d6b9e92a9 102 );
Benoit 0:1b4d6b9e92a9 103 }
Benoit 0:1b4d6b9e92a9 104 }
Benoit 0:1b4d6b9e92a9 105 }