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.

/media/uploads/hudakz/enc28j60_module01.jpg

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.
  • Works with both Mbed OS 2 and Mbed OS 5.

Usage:

  • Import the library into your project.
  • Add #include "UipEthernet.h" to main.cpp
  • Create one instance of the UipEthernet class initialized with the MAC address you'd like to use and SPI pins of the connected Mbed board.

Example programs:

Import programWebSwitch_ENC28J60

HTTP Server serving a simple webpage which enables to remotely turn a digital output 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

MQTT Client example program. Ethernet connection is via an ENC28J60 module.

Files at this revision

API Documentation at this revision

Comitter:
hudakz
Date:
Sat Aug 31 20:34:52 2019 +0000
Parent:
12:1dd995402b99
Child:
14:7648334eb41b
Commit message:
TcpClient, TcpServer and UipEthernet modified to make TcpClient work.

Changed in this revision

TcpClient.cpp Show annotated file Show diff for this revision Revisions of this file
TcpClient.h Show annotated file Show diff for this revision Revisions of this file
TcpServer.cpp Show annotated file Show diff for this revision Revisions of this file
UipEthernet.cpp Show annotated file Show diff for this revision Revisions of this file
UipEthernet.h Show annotated file Show diff for this revision Revisions of this file
utility/uip-conf.h Show annotated file Show diff for this revision Revisions of this file
--- a/TcpClient.cpp	Fri Aug 30 19:15:42 2019 +0000
+++ b/TcpClient.cpp	Sat Aug 31 20:34:52 2019 +0000
@@ -40,7 +40,8 @@
  * @retval
  */
 TcpClient::TcpClient() :
-    data(NULL)
+    data(NULL),
+    _instance(NULL)
 { }
 
 /**
@@ -50,7 +51,8 @@
  * @retval
  */
 TcpClient::TcpClient(uip_userdata_t* conn_data) :
-    data(conn_data)
+    data(conn_data),
+    _instance(NULL)
 { }
 
 /**
@@ -59,6 +61,20 @@
  * @param
  * @retval
  */
+int TcpClient::open(UipEthernet* ethernet)
+{
+    if (UipEthernet::ethernet != ethernet)
+        UipEthernet::ethernet = ethernet;
+
+    return 0;
+}
+
+/**
+ * @brief
+ * @note
+ * @param
+ * @retval
+ */
 int TcpClient::connect(IpAddress ip, uint16_t port)
 {
     stop();
@@ -79,7 +95,7 @@
 #ifdef UIPETHERNET_DEBUG_CLIENT
                 printf("connected, state: %d, first packet in: %d\r\n", data->state, data->packets_in[0]);
 #endif
-                return 1;
+                return 0;
             }
 
 #if UIP_CONNECT_TIMEOUT > 0
@@ -91,7 +107,7 @@
         }
     }
 
-    return 0;
+    return 1;
 }
 
 /**
@@ -171,6 +187,17 @@
  * @param
  * @retval
  */
+void TcpClient::setInstance(TcpClient *client)
+{
+    _instance = client;
+}
+
+/**
+ * @brief
+ * @note
+ * @param
+ * @retval
+ */
 bool TcpClient::operator==(const TcpClient& rhs)
 {
     return data && rhs.data && (data == rhs.data);
@@ -439,7 +466,8 @@
 void TcpClient::close()
 {
     stop();
-    delete this;
+    if (_instance)
+        delete this;
 }
 
 /**
--- a/TcpClient.h	Fri Aug 30 19:15:42 2019 +0000
+++ b/TcpClient.h	Sat Aug 31 20:34:52 2019 +0000
@@ -59,6 +59,8 @@
     memaddress      out_pos;
 } uip_userdata_t;
 
+class UipEthernet;
+
 class TcpClient
 {
 public:
@@ -66,11 +68,13 @@
     TcpClient(uip_userdata_t* conn_data);
     virtual ~TcpClient() {}
 
+    int                     open(UipEthernet* ethernet);
     int                     connect(IpAddress ip, uint16_t port);
     int                     connect(const char* host, uint16_t port);
     int                     recv(uint8_t* buf, size_t size);
     void                    stop();
     uint8_t                 connected();
+    void                    setInstance(TcpClient* client);
     operator                bool();
     virtual bool operator   ==(const TcpClient& );
     virtual bool operator   !=(const TcpClient& rhs)    { return !this->operator ==(rhs); }
@@ -92,6 +96,7 @@
 
 private:
     uip_userdata_t*         data;
+    TcpClient*              _instance;
     static uip_userdata_t*  _allocateData();
     static size_t           _available(uip_userdata_t* );
     static uint8_t          _currentBlock(memhandle* blocks);
--- a/TcpServer.cpp	Fri Aug 30 19:15:42 2019 +0000
+++ b/TcpServer.cpp	Sat Aug 31 20:34:52 2019 +0000
@@ -40,6 +40,8 @@
  */
 TcpClient* TcpServer::accept()
 {
+    TcpClient* result = NULL;
+
     UipEthernet::ethernet->tick();
     for (uip_userdata_t * data = &TcpClient::all_data[0]; data < &TcpClient::all_data[_conns]; data++) {
         if
@@ -52,11 +54,13 @@
         ) {
             data->ripaddr[0] =  uip_conns[data->state & UIP_CLIENT_SOCKETS].ripaddr[0];
             data->ripaddr[1] =  uip_conns[data->state & UIP_CLIENT_SOCKETS].ripaddr[1];
-            return(new TcpClient(data));
+            result = new TcpClient(data);
+            result->setInstance(result);
+            return result;
         }
     }
 
-    return NULL;
+    return result;
 }
 
 /**
--- a/UipEthernet.cpp	Fri Aug 30 19:15:42 2019 +0000
+++ b/UipEthernet.cpp	Sat Aug 31 20:34:52 2019 +0000
@@ -151,6 +151,17 @@
  * @param
  * @retval
  */
+void UipEthernet::disconnect()
+{
+     ethernet = NULL;
+}
+
+/**
+ * @brief
+ * @note
+ * @param
+ * @retval
+ */
 void UipEthernet::set_network(const char *ip_address, const char *netmask, const char *gateway)
 {
     _ip = IpAddress(ip_address, strlen(ip_address));
--- a/UipEthernet.h	Fri Aug 30 19:15:42 2019 +0000
+++ b/UipEthernet.h	Sat Aug 31 20:34:52 2019 +0000
@@ -69,6 +69,7 @@
     UipEthernet (const uint8_t mac[6], PinName mosi, PinName miso, PinName sck, PinName cs);
 
     int               connect();
+    void              disconnect();
     void              set_network(uint8_t octet1, uint8_t octet2, uint8_t octet3, uint8_t octet4);
     void              set_network(IpAddress ip);
     void              set_network(IpAddress ip, IpAddress dns);
--- a/utility/uip-conf.h	Fri Aug 30 19:15:42 2019 +0000
+++ b/utility/uip-conf.h	Sat Aug 31 20:34:52 2019 +0000
@@ -85,7 +85,7 @@
  *
  * \hideinitializer
  */
-#define UIP_CONF_MAX_LISTENPORTS    4
+#define UIP_CONF_MAX_LISTENPORTS    5
 
 /**
  * UIP buffer size.