mbed library for ENC28J60 Ethernet modules. Full support for TCP/IP and UDP Server, Client and HTTP server (webserver). DHCP and DNS is included.

Dependents:   mBuino_ENC28_MQTT Nucleo_Web_ENC28J60 Nucleo_Web_ENC28J60_ADC Serial_over_Ethernet ... more

Library for ENC28J60 Ethernet modules.

Ported to mbed from Norbert Truchsess's UIPEthernet library for Arduino. Thank you Norbert!
Full support for persistent (streaming) TCP/IP and UDP connections Client and Server each, ARP, ICMP, DHCP and DNS. To use it in your project, import the library, #include UIPEthernet.h" and create one uIPEthernet object initialized with the SPI pins connected to your ENC28J60 Ethernet board. See below demo programs using the library.

Demo programs:

Import programWebSwitch_ENC28J60

HTTP Server serving a simple webpage which enables to remotely turn LED1 on/off. Compile, download, run and type 'IP_address/secret/' (don't forget the last '/') into your web browser and hit ENTER.

Import programHTTPServer_Echo_ENC28J60

A simple HTTP server echoing received requests. Ethernet connection is over an ENC28J60 board. Usage: Type the server's IP address into you web browser and hit <ENTER>.

Import programTcpServer_ENC28J60

Simple TCP/IP Server using the UIPEthernet library for ENC28J60 Ethernet boards.

Import programTcpClient_ENC28J60

Simple TCP/IP Client using the UIPEthernet library for ENC28J60 Ethernet boards.

Import programUdpServer_ENC28J60

Simple UDP Server using the UIPEthernet library for ENC28J60 Ethernet boards.

Import programUdpClient_ENC28J60

Simple UDP Client using the UIPEthernet library for ENC28J60 Ethernet boards.

Import programMQTT_Hello_ENC28J60

MQ Telemetry Transport Client demo. Ethernet connection is via an ENC28J60 module.

Revision:
4:d774541a34da
Parent:
2:049ce85163c5
Child:
8:4acb22344932
--- a/UIPClient.h	Sat Dec 20 11:10:40 2014 +0000
+++ b/UIPClient.h	Sun Mar 08 20:26:56 2015 +0000
@@ -16,83 +16,97 @@
  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
+
 #ifndef UIPCLIENT_H
-    #define UIPCLIENT_H
+#define UIPCLIENT_H
 
-    #include "ethernet_comp.h"
-    #include "Client.h"
-    #include  "utility/mempool.h"
+#include "ethernet_comp.h"
+//#include "Print.h"
+#include "Client.h"
+#include "utility/mempool.h"
+
+extern "C" {
+  #include "utility/uip.h"
+}
 
-extern "C"
-{
-    #include  "utility/uip.h"
-}
-    #define UIP_SOCKET_DATALEN  UIP_TCP_MSS
+#define UIP_SOCKET_DATALEN UIP_TCP_MSS
 //#define UIP_SOCKET_NUMPACKETS UIP_RECEIVE_WINDOW/UIP_TCP_MSS+1
+#ifndef UIP_SOCKET_NUMPACKETS
+#define UIP_SOCKET_NUMPACKETS 5
+#endif
 
-    #ifndef UIP_SOCKET_NUMPACKETS
-        #define UIP_SOCKET_NUMPACKETS   5
-    #endif
-    #define UIP_CLIENT_CLOSE    1
-    #define UIP_CLIENT_CLOSED   2
-    #define UIP_CLIENT_RESTART  4
+#define UIP_CLIENT_CONNECTED 0x10
+#define UIP_CLIENT_CLOSE 0x20
+#define UIP_CLIENT_REMOTECLOSED 0x40
+#define UIP_CLIENT_RESTART 0x80
+#define UIP_CLIENT_STATEFLAGS (UIP_CLIENT_CONNECTED | UIP_CLIENT_CLOSE | UIP_CLIENT_REMOTECLOSED | UIP_CLIENT_RESTART)
+#define UIP_CLIENT_SOCKETS ~UIP_CLIENT_STATEFLAGS
 
 typedef uint8_t uip_socket_ptr;
 
-typedef struct
-{
-    uint8_t     state;
-    memhandle   packets_in[UIP_SOCKET_NUMPACKETS];
-    uint16_t    lport;  /**< The local TCP port, in network byte order. */
+typedef struct {
+  uint8_t state;
+  memhandle packets_in[UIP_SOCKET_NUMPACKETS];
+  uint16_t lport;        /**< The local TCP port, in network byte order. */
 } uip_userdata_closed_t;
 
-typedef struct
-{
-    uint8_t     state;
-    memhandle   packets_in[UIP_SOCKET_NUMPACKETS];
-    memhandle   packets_out[UIP_SOCKET_NUMPACKETS];
-    memaddress  out_pos;
+typedef struct {
+  uint8_t state;
+  memhandle packets_in[UIP_SOCKET_NUMPACKETS];
+  memhandle packets_out[UIP_SOCKET_NUMPACKETS];
+  memaddress out_pos;
+#if UIP_CLIENT_TIMER >= 0
+  unsigned long timer;
+#endif
 } uip_userdata_t;
 
-class UIPClient :
-    public Client
-{
+class UIPClient : public Client {
+
 public:
-    UIPClient(void);
-    int                     connect(IPAddress ip, uint16_t port);
-    int                     connect(const char* host, uint16_t port);
-    int                     read(uint8_t* buf, size_t size);
-    void                    stop(void);
-    uint8_t                 connected(void);
-    operator                bool(void);
-    virtual bool operator   ==(const EthernetClient& );
-    virtual bool operator   !=(const EthernetClient& rhs)   { return !this->operator ==(rhs); };
+  UIPClient();
+  int connect(IPAddress ip, uint16_t port);
+  int connect(const char *host, uint16_t port);
+  int read(uint8_t *buf, size_t size);
+  void stop();
+  uint8_t connected();
+  operator bool();
+  virtual bool operator==(const EthernetClient&);
+  virtual bool operator!=(const EthernetClient& rhs) { return !this->operator==(rhs); };
 
-    size_t                  write(uint8_t);
-    size_t                  write(const uint8_t* buf, size_t size);
-    int                     available(void);
-    int                     read(void);
-    int                     peek(void);
-    void                    flush(void);
+  size_t write(uint8_t);
+  size_t write(const uint8_t *buf, size_t size);
+  int available();
+  int read();
+  int peek();
+  void flush();
+
+//  using Print::write;
+
 private:
-    UIPClient(struct uip_conn* _conn);
-    UIPClient(uip_userdata_closed_t* closed_conn);
+  UIPClient(struct uip_conn *_conn);
+  UIPClient(uip_userdata_t* conn_data);
+
+  uip_userdata_t* data;
 
-    struct uip_conn*                _uip_conn;
+  static uip_userdata_t all_data[UIP_CONNS];
+  static uip_userdata_t* _allocateData();
 
-    uip_userdata_t*                 data;
-
-    static uip_userdata_closed_t*   closed_conns[UIP_CONNS];
+  static size_t _write(uip_userdata_t *,const uint8_t *buf, size_t size);
+  static int _available(uip_userdata_t *);
 
-    static size_t                   _write(struct uip_conn* , const uint8_t* buf, size_t size);
-    static int                      _available(uip_userdata_t* );
+  static uint8_t _currentBlock(memhandle* blocks);
+  static void _eatBlock(memhandle* blocks);
+  static void _flushBlocks(memhandle* blocks);
+
+#ifdef UIPETHERNET_DEBUG_CLIENT
+  static void _dumpAllData();
+#endif
 
-    static memhandle*               _currentBlock(memhandle* blocks);
-    static void                     _eatBlock(memhandle* blocks);
-    static void                     _flushBlocks(memhandle* blocks);
+  friend class UIPEthernetClass;
+  friend class UIPServer;
 
-    friend class                    UIPEthernetClass;
-    friend class                    UIPServer;
-    static void                     uip_callback(uip_tcp_appstate_t* s);
+  friend void uipclient_appcall(void);
+
 };
+
 #endif