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.
main.cpp@0:1b4d6b9e92a9, 2011-06-14 (annotated)
- Committer:
- Benoit
- Date:
- Tue Jun 14 05:08:11 2011 +0000
- Revision:
- 0:1b4d6b9e92a9
- Child:
- 1:552bcce1761d
Who changed what in which revision?
User | Revision | Line number | New 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, ðernet_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 | } |