Zoltan Hudak
/
UdpServer_ENC28J60
Simple UDP Server using the UIPEthernet library for ENC28J60 Ethernet boards.
main.cpp@4:b330511e8d56, 2019-09-07 (annotated)
- Committer:
- hudakz
- Date:
- Sat Sep 07 18:07:45 2019 +0000
- Revision:
- 4:b330511e8d56
- Parent:
- 3:e2462f078d64
Updated.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 1:29bb0a32f61d | 1 | /* |
hudakz | 1:29bb0a32f61d | 2 | * UIPEthernet UdpServer example. |
hudakz | 1:29bb0a32f61d | 3 | * |
hudakz | 1:29bb0a32f61d | 4 | * UIPEthernet is a TCP/IP stack that can be used with an enc28j60 based |
hudakz | 1:29bb0a32f61d | 5 | * Ethernet-shield. |
hudakz | 1:29bb0a32f61d | 6 | * |
hudakz | 1:29bb0a32f61d | 7 | * UIPEthernet uses the fine uIP stack by Adam Dunkels <adam@sics.se> |
hudakz | 1:29bb0a32f61d | 8 | * |
hudakz | 1:29bb0a32f61d | 9 | * ----------------- |
hudakz | 1:29bb0a32f61d | 10 | * |
hudakz | 4:b330511e8d56 | 11 | * This UdpServer example sets up a udp-server for testing. |
hudakz | 1:29bb0a32f61d | 12 | * |
hudakz | 1:29bb0a32f61d | 13 | * Copyright (C) 2013 by Norbert Truchsess (norbert.truchsess@t-online.de) |
hudakz | 1:29bb0a32f61d | 14 | * |
hudakz | 1:29bb0a32f61d | 15 | * Modified (ported to mbed) by Zoltan Hudak |
hudakz | 1:29bb0a32f61d | 16 | * |
hudakz | 1:29bb0a32f61d | 17 | */ |
hudakz | 0:8823772081cb | 18 | #include "mbed.h" |
hudakz | 2:6bbdab30a1c1 | 19 | #include "UipEthernet.h" |
hudakz | 2:6bbdab30a1c1 | 20 | |
hudakz | 2:6bbdab30a1c1 | 21 | #define IP "192.168.1.35" |
hudakz | 2:6bbdab30a1c1 | 22 | #define GATEWAY "192.168.1.1" |
hudakz | 2:6bbdab30a1c1 | 23 | #define NETMASK "255.255.255.0" |
hudakz | 2:6bbdab30a1c1 | 24 | #define PORT 80 |
hudakz | 0:8823772081cb | 25 | |
hudakz | 0:8823772081cb | 26 | // MAC address must be unique within the connected network. Modify as appropriate. |
hudakz | 2:6bbdab30a1c1 | 27 | const uint8_t MAC[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; |
hudakz | 2:6bbdab30a1c1 | 28 | UipEthernet net(MAC, D11, D12, D13, D10); // mac, mosi, miso, sck, cs |
hudakz | 0:8823772081cb | 29 | |
hudakz | 2:6bbdab30a1c1 | 30 | const char message[] = "Hello World from mbed!"; |
hudakz | 2:6bbdab30a1c1 | 31 | |
hudakz | 0:8823772081cb | 32 | |
hudakz | 0:8823772081cb | 33 | /** |
hudakz | 0:8823772081cb | 34 | * @brief |
hudakz | 0:8823772081cb | 35 | * @note |
hudakz | 0:8823772081cb | 36 | * @param |
hudakz | 0:8823772081cb | 37 | * @retval |
hudakz | 0:8823772081cb | 38 | */ |
hudakz | 0:8823772081cb | 39 | int main(void) { |
hudakz | 2:6bbdab30a1c1 | 40 | // Bring up the ethernet interface |
hudakz | 2:6bbdab30a1c1 | 41 | //net.set_network(IP, NETMASK, GATEWAY); // include this for using static IP address |
hudakz | 2:6bbdab30a1c1 | 42 | printf("UDP Server example\n"); |
hudakz | 2:6bbdab30a1c1 | 43 | if(net.connect() != 0) { |
hudakz | 2:6bbdab30a1c1 | 44 | printf("Error connecting\n"); |
hudakz | 2:6bbdab30a1c1 | 45 | return -1; |
hudakz | 2:6bbdab30a1c1 | 46 | } |
hudakz | 1:29bb0a32f61d | 47 | |
hudakz | 2:6bbdab30a1c1 | 48 | // Show the network address |
hudakz | 2:6bbdab30a1c1 | 49 | const char* ip = net.get_ip_address(); |
hudakz | 2:6bbdab30a1c1 | 50 | const char* netmask = net.get_netmask(); |
hudakz | 2:6bbdab30a1c1 | 51 | const char* gateway = net.get_gateway(); |
hudakz | 2:6bbdab30a1c1 | 52 | |
hudakz | 2:6bbdab30a1c1 | 53 | printf("IP address: %s\r\n", ip ? ip : "None"); |
hudakz | 2:6bbdab30a1c1 | 54 | printf("Netmask: %s\r\n", netmask ? netmask : "None"); |
hudakz | 2:6bbdab30a1c1 | 55 | printf("Gateway: %s\r\n\r\n", gateway ? gateway : "None"); |
hudakz | 2:6bbdab30a1c1 | 56 | |
hudakz | 2:6bbdab30a1c1 | 57 | UdpSocket socket(&net); |
hudakz | 2:6bbdab30a1c1 | 58 | |
hudakz | 2:6bbdab30a1c1 | 59 | socket.begin(PORT); // listen at port PORT for user datagrams |
hudakz | 2:6bbdab30a1c1 | 60 | |
hudakz | 3:e2462f078d64 | 61 | printf("Waiting for datagrams from UDP clients ...\r\n\r\n"); |
hudakz | 0:8823772081cb | 62 | |
hudakz | 1:29bb0a32f61d | 63 | while (1) { |
hudakz | 1:29bb0a32f61d | 64 | int success; |
hudakz | 2:6bbdab30a1c1 | 65 | int size = socket.parsePacket(); |
hudakz | 1:29bb0a32f61d | 66 | |
hudakz | 1:29bb0a32f61d | 67 | if (size > 0) { |
hudakz | 3:e2462f078d64 | 68 | IpAddress remoteIp = socket.remoteIP(); |
hudakz | 3:e2462f078d64 | 69 | char remoteAddr[16]; |
hudakz | 0:8823772081cb | 70 | do { |
hudakz | 2:6bbdab30a1c1 | 71 | char* data = (char*)malloc(size + 1); |
hudakz | 2:6bbdab30a1c1 | 72 | int len = socket.read(data, size + 1); |
hudakz | 2:6bbdab30a1c1 | 73 | data[len] = 0; |
hudakz | 3:e2462f078d64 | 74 | printf("data received from %s: \r\n%s", remoteIp.toString(remoteAddr), data); |
hudakz | 2:6bbdab30a1c1 | 75 | free(data); |
hudakz | 2:6bbdab30a1c1 | 76 | } while ((size = socket.available()) > 0); |
hudakz | 0:8823772081cb | 77 | |
hudakz | 0:8823772081cb | 78 | //finish reading this packet: |
hudakz | 2:6bbdab30a1c1 | 79 | socket.flush(); |
hudakz | 3:e2462f078d64 | 80 | printf("\r\n"); |
hudakz | 0:8823772081cb | 81 | |
hudakz | 0:8823772081cb | 82 | do { |
hudakz | 0:8823772081cb | 83 | //send new packet back to ip/port of client. This also |
hudakz | 0:8823772081cb | 84 | //configures the current connection to ignore packets from |
hudakz | 0:8823772081cb | 85 | //other clients! |
hudakz | 2:6bbdab30a1c1 | 86 | success = socket.beginPacket(socket.remoteIP(), socket.remotePort()); |
hudakz | 1:29bb0a32f61d | 87 | if (success) |
hudakz | 3:e2462f078d64 | 88 | printf("beginPacket: succeeded\r\n"); |
hudakz | 0:8823772081cb | 89 | else |
hudakz | 3:e2462f078d64 | 90 | printf("beginPacket: failed\r\n"); |
hudakz | 0:8823772081cb | 91 | |
hudakz | 0:8823772081cb | 92 | //beginPacket fails if remote ethaddr is unknown. In this case an |
hudakz | 0:8823772081cb | 93 | //arp-request is send out first and beginPacket succeeds as soon |
hudakz | 0:8823772081cb | 94 | //the arp-response is received. |
hudakz | 1:29bb0a32f61d | 95 | } while (!success); |
hudakz | 0:8823772081cb | 96 | |
hudakz | 2:6bbdab30a1c1 | 97 | success = socket.write((uint8_t*)message, strlen(message)); |
hudakz | 0:8823772081cb | 98 | |
hudakz | 1:29bb0a32f61d | 99 | if (success) |
hudakz | 2:6bbdab30a1c1 | 100 | printf("bytes written: %d\r\n", success); |
hudakz | 0:8823772081cb | 101 | |
hudakz | 2:6bbdab30a1c1 | 102 | success = socket.endPacket(); |
hudakz | 0:8823772081cb | 103 | |
hudakz | 1:29bb0a32f61d | 104 | if (success) |
hudakz | 3:e2462f078d64 | 105 | printf("endPacket: succeeded\r\n"); |
hudakz | 0:8823772081cb | 106 | else |
hudakz | 3:e2462f078d64 | 107 | printf("endPacket: failed\r\n"); |
hudakz | 0:8823772081cb | 108 | |
hudakz | 2:6bbdab30a1c1 | 109 | socket.close(); |
hudakz | 0:8823772081cb | 110 | |
hudakz | 0:8823772081cb | 111 | //restart with new connection to receive packets from other clients |
hudakz | 2:6bbdab30a1c1 | 112 | if (socket.begin(PORT)) |
hudakz | 3:e2462f078d64 | 113 | printf("restart connection: succeeded\r\n"); |
hudakz | 0:8823772081cb | 114 | else |
hudakz | 3:e2462f078d64 | 115 | printf("restart connection: failed\r\n"); |
hudakz | 0:8823772081cb | 116 | } |
hudakz | 0:8823772081cb | 117 | } |
hudakz | 0:8823772081cb | 118 | } |