UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/

Committer:
cassyarduino
Date:
Thu Dec 29 13:07:19 2016 +0100
Revision:
11:3fb19220d9ec
Parent:
0:e3fb1267e3c3
Child:
32:e77cbe3783e5
Changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cassyarduino 0:e3fb1267e3c3 1 /*
cassyarduino 0:e3fb1267e3c3 2 Advanced Chat Server
cassyarduino 0:e3fb1267e3c3 3
cassyarduino 0:e3fb1267e3c3 4 A simple server that distributes any incoming messages to all
cassyarduino 0:e3fb1267e3c3 5 connected clients but the client the message comes from.
cassyarduino 0:e3fb1267e3c3 6 To use telnet to your device's IP address and type.
cassyarduino 0:e3fb1267e3c3 7 You can see the client's input in the serial monitor as well.
cassyarduino 0:e3fb1267e3c3 8 Using an Arduino Wiznet Ethernet shield.
cassyarduino 0:e3fb1267e3c3 9
cassyarduino 0:e3fb1267e3c3 10 Circuit:
cassyarduino 0:e3fb1267e3c3 11 * Ethernet shield attached to pins 10, 11, 12, 13
cassyarduino 0:e3fb1267e3c3 12 * Analog inputs attached to pins A0 through A5 (optional)
cassyarduino 0:e3fb1267e3c3 13
cassyarduino 0:e3fb1267e3c3 14 created 18 Dec 2009
cassyarduino 0:e3fb1267e3c3 15 by David A. Mellis
cassyarduino 0:e3fb1267e3c3 16 modified 9 Apr 2012
cassyarduino 0:e3fb1267e3c3 17 by Tom Igoe
cassyarduino 0:e3fb1267e3c3 18 redesigned to make use of operator== 25 Nov 2013
cassyarduino 0:e3fb1267e3c3 19 by Norbert Truchsess
cassyarduino 0:e3fb1267e3c3 20
cassyarduino 0:e3fb1267e3c3 21 */
cassyarduino 0:e3fb1267e3c3 22
cassyarduino 11:3fb19220d9ec 23 #if defined(__MBED__)
cassyarduino 11:3fb19220d9ec 24 #include <mbed.h>
cassyarduino 11:3fb19220d9ec 25 #include "mbed/millis.h"
cassyarduino 11:3fb19220d9ec 26 #define delay(x) wait_ms(x)
cassyarduino 11:3fb19220d9ec 27 #define PROGMEM
cassyarduino 11:3fb19220d9ec 28 #include "mbed/Print.h"
cassyarduino 11:3fb19220d9ec 29 #endif
cassyarduino 11:3fb19220d9ec 30
cassyarduino 0:e3fb1267e3c3 31 #include <UIPEthernet.h>
cassyarduino 0:e3fb1267e3c3 32 #include <utility/logging.h>
cassyarduino 0:e3fb1267e3c3 33
cassyarduino 0:e3fb1267e3c3 34 // Enter a MAC address and IP address for your controller below.
cassyarduino 0:e3fb1267e3c3 35 // The IP address will be dependent on your local network.
cassyarduino 0:e3fb1267e3c3 36
cassyarduino 11:3fb19220d9ec 37 uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
cassyarduino 0:e3fb1267e3c3 38 IPAddress ip(192,168,0,6);
cassyarduino 0:e3fb1267e3c3 39
cassyarduino 0:e3fb1267e3c3 40 // telnet defaults to port 23
cassyarduino 0:e3fb1267e3c3 41 EthernetServer server(23);
cassyarduino 0:e3fb1267e3c3 42
cassyarduino 0:e3fb1267e3c3 43 EthernetClient clients[4];
cassyarduino 0:e3fb1267e3c3 44
cassyarduino 11:3fb19220d9ec 45 #if defined(ARDUINO)
cassyarduino 0:e3fb1267e3c3 46 void setup() {
cassyarduino 11:3fb19220d9ec 47 #endif
cassyarduino 11:3fb19220d9ec 48 #if defined(__MBED__)
cassyarduino 11:3fb19220d9ec 49 int main() {
cassyarduino 11:3fb19220d9ec 50 #endif
cassyarduino 0:e3fb1267e3c3 51 // initialize the ethernet device
cassyarduino 0:e3fb1267e3c3 52 Ethernet.begin(mac, ip);
cassyarduino 0:e3fb1267e3c3 53 // start listening for clients
cassyarduino 0:e3fb1267e3c3 54 server.begin();
cassyarduino 0:e3fb1267e3c3 55 // Open serial communications and wait for port to open:
cassyarduino 0:e3fb1267e3c3 56 #if ACTLOGLEVEL>LOG_NONE
cassyarduino 11:3fb19220d9ec 57
cassyarduino 11:3fb19220d9ec 58 #if defined(ARDUINO)
cassyarduino 11:3fb19220d9ec 59 LogObject.begin(9600);
cassyarduino 11:3fb19220d9ec 60 #endif
cassyarduino 11:3fb19220d9ec 61 #if defined(__MBED__)
cassyarduino 11:3fb19220d9ec 62 Serial LogObject(SERIAL_TX,SERIAL_RX);
cassyarduino 11:3fb19220d9ec 63 #endif
cassyarduino 0:e3fb1267e3c3 64 while (!LogObject)
cassyarduino 0:e3fb1267e3c3 65 {
cassyarduino 0:e3fb1267e3c3 66 ; // wait for serial port to connect. Needed for Leonardo only
cassyarduino 0:e3fb1267e3c3 67 }
cassyarduino 0:e3fb1267e3c3 68 #endif
cassyarduino 0:e3fb1267e3c3 69
cassyarduino 0:e3fb1267e3c3 70 #if ACTLOGLEVEL>=LOG_INFO
cassyarduino 0:e3fb1267e3c3 71 LogObject.uart_send_str(F("Chat server address:"));
cassyarduino 11:3fb19220d9ec 72 #if defined(ARDUINO)
cassyarduino 11:3fb19220d9ec 73 LogObject.println(Ethernet.localIP());
cassyarduino 11:3fb19220d9ec 74 #endif
cassyarduino 11:3fb19220d9ec 75 #if defined(__MBED__)
cassyarduino 11:3fb19220d9ec 76 LogObject.printf("%d.%d.%d.%d",Ethernet.localIP()[0],Ethernet.localIP()[1],Ethernet.localIP()[2],Ethernet.localIP()[3]);
cassyarduino 11:3fb19220d9ec 77 #endif
cassyarduino 0:e3fb1267e3c3 78 #endif
cassyarduino 11:3fb19220d9ec 79
cassyarduino 11:3fb19220d9ec 80 #if defined(ARDUINO)
cassyarduino 0:e3fb1267e3c3 81 }
cassyarduino 0:e3fb1267e3c3 82
cassyarduino 0:e3fb1267e3c3 83 void loop() {
cassyarduino 11:3fb19220d9ec 84 #endif
cassyarduino 11:3fb19220d9ec 85
cassyarduino 11:3fb19220d9ec 86 #if defined(__MBED__)
cassyarduino 11:3fb19220d9ec 87 while(true) {
cassyarduino 11:3fb19220d9ec 88 #endif
cassyarduino 0:e3fb1267e3c3 89 // wait for a new client:
cassyarduino 0:e3fb1267e3c3 90 EthernetClient client = server.available();
cassyarduino 0:e3fb1267e3c3 91
cassyarduino 0:e3fb1267e3c3 92 if (client) {
cassyarduino 0:e3fb1267e3c3 93
cassyarduino 0:e3fb1267e3c3 94 bool newClient = true;
cassyarduino 11:3fb19220d9ec 95 for (uint8_t i=0;i<4;i++) {
cassyarduino 0:e3fb1267e3c3 96 //check whether this client refers to the same socket as one of the existing instances:
cassyarduino 0:e3fb1267e3c3 97 if (clients[i]==client) {
cassyarduino 0:e3fb1267e3c3 98 newClient = false;
cassyarduino 0:e3fb1267e3c3 99 break;
cassyarduino 0:e3fb1267e3c3 100 }
cassyarduino 0:e3fb1267e3c3 101 }
cassyarduino 0:e3fb1267e3c3 102
cassyarduino 0:e3fb1267e3c3 103 if (newClient) {
cassyarduino 0:e3fb1267e3c3 104 //check which of the existing clients can be overridden:
cassyarduino 11:3fb19220d9ec 105 for (uint8_t i=0;i<4;i++) {
cassyarduino 0:e3fb1267e3c3 106 if (!clients[i] && clients[i]!=client) {
cassyarduino 0:e3fb1267e3c3 107 clients[i] = client;
cassyarduino 0:e3fb1267e3c3 108 // clead out the input buffer:
cassyarduino 0:e3fb1267e3c3 109 client.flush();
cassyarduino 0:e3fb1267e3c3 110 // clead out the input buffer:
cassyarduino 0:e3fb1267e3c3 111 client.flush();
cassyarduino 0:e3fb1267e3c3 112 #if ACTLOGLEVEL>=LOG_INFO
cassyarduino 0:e3fb1267e3c3 113 LogObject.uart_send_strln(F("We have a new client"));
cassyarduino 0:e3fb1267e3c3 114 #endif
cassyarduino 11:3fb19220d9ec 115 client.println(F("Hello, client!"));
cassyarduino 11:3fb19220d9ec 116 client.print(F("my IP: "));
cassyarduino 11:3fb19220d9ec 117 client.println(Ethernet.localIP());
cassyarduino 0:e3fb1267e3c3 118 break;
cassyarduino 0:e3fb1267e3c3 119 }
cassyarduino 0:e3fb1267e3c3 120 }
cassyarduino 0:e3fb1267e3c3 121 }
cassyarduino 0:e3fb1267e3c3 122
cassyarduino 0:e3fb1267e3c3 123 if (client.available() > 0) {
cassyarduino 0:e3fb1267e3c3 124 // read the bytes incoming from the client:
cassyarduino 0:e3fb1267e3c3 125 char thisChar = client.read();
cassyarduino 0:e3fb1267e3c3 126 // echo the bytes back to all other connected clients:
cassyarduino 11:3fb19220d9ec 127 for (uint8_t i=0;i<4;i++) {
cassyarduino 0:e3fb1267e3c3 128 if (clients[i] && clients[i]!=client) {
cassyarduino 0:e3fb1267e3c3 129 clients[i].write(thisChar);
cassyarduino 0:e3fb1267e3c3 130 }
cassyarduino 0:e3fb1267e3c3 131 }
cassyarduino 0:e3fb1267e3c3 132 // echo the bytes to the server as well:
cassyarduino 0:e3fb1267e3c3 133 #if ACTLOGLEVEL>=LOG_INFO
cassyarduino 11:3fb19220d9ec 134 #if defined(ARDUINO)
cassyarduino 11:3fb19220d9ec 135 LogObject.write(thisChar);
cassyarduino 11:3fb19220d9ec 136 #endif
cassyarduino 11:3fb19220d9ec 137 #if defined(__MBED__)
cassyarduino 11:3fb19220d9ec 138 LogObject.putc(thisChar);
cassyarduino 11:3fb19220d9ec 139 #endif
cassyarduino 0:e3fb1267e3c3 140 #endif
cassyarduino 0:e3fb1267e3c3 141 }
cassyarduino 0:e3fb1267e3c3 142 }
cassyarduino 11:3fb19220d9ec 143 for (uint8_t i=0;i<4;i++) {
cassyarduino 0:e3fb1267e3c3 144 if (!(clients[i].connected())) {
cassyarduino 0:e3fb1267e3c3 145 // client.stop() invalidates the internal socket-descriptor, so next use of == will allways return false;
cassyarduino 0:e3fb1267e3c3 146 clients[i].stop();
cassyarduino 0:e3fb1267e3c3 147 }
cassyarduino 0:e3fb1267e3c3 148 }
cassyarduino 0:e3fb1267e3c3 149 }
cassyarduino 11:3fb19220d9ec 150
cassyarduino 11:3fb19220d9ec 151 #if defined(__MBED__)
cassyarduino 11:3fb19220d9ec 152 }
cassyarduino 11:3fb19220d9ec 153 #endif