..

Dependencies:   ESP8266Interface WIZnetInterface_namespace mbed-src

Dual Network Interface

Some our customers want dual network interface like below. /media/uploads/SteveKim/dual-nic-2.jpg

So, I decided to implement dual network interface with ESP8266(WiFi) and WIZwiki-W7500(Ethernet).

Implementation

But, I had some troubles because of the below.

  • There is no abstract class for all network interface
  • Same header file name in two library WIZnetInterface(EthernetInterface) and ESP8266Interface
  • Same class name in two library WIZnetInterface and ESP8266Interface

If I can modify Makefile, there will be better way to solve this problem. But, I couldn't modify Makefile in mbed.

So I solved this problem using namespace. Of course, there may be another way to change all class name and file name in the library. But, I wanted to minimize the changes of original library.

First, I changed the header file name in WIZnetInterface from <*.h> to <*.hpp>.

Declaration namespace in header file

// Endpoint.hpp
namespace wiznet_space {
   class Endpoint {
       friend class UDPSocket;
       ....................
   }
}

// Socket.hpp
namespace wiznet_space {

  class Socket {
  public:
       Socket();
  ..........................
  }
}
..........................
..........................

Using namespace in source file

// main.c
..........................

ESP8266Interface wifi(D1, D0, D2, "WizFiDemoAP","12345678",115200); // tx, rx for
wiznet_space::EthernetInterface eth;

bool InitializeWiznetEthernet()
{
    uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0xFF, 0x11, 0x22};
 
    eth.init(mac_addr, "192.168.3.102", "255.255.255.0", "192.168.3.1"); //Use DHCP

    .......................................................................................................................    
}

bool InitializeESP8266()
{   
    wifi.init();

    .......................................................................................................................    
}

int main()
{
    ....................................................................

    // Ethernet : WIZnet hardwired TCP/IP in W7500
    if ( InitializeWiznetEthernet() )
    {
        // Send TCP/IP data via Ethernet
        ProcessDataViaEthernet();
    }    
    
    // WiFi : ESP8266
    if ( InitializeESP8266() )
    {
        // Send TCP/IP data via WiFi
        ProcessDataViaWiFi();
    }

    ....................................................................
}

// ProcessDataViaEthernet.cpp
void ProcessDataViaEthernet()
{
    wiznet_space::TCPSocketConnection eth_sock;
    
    eth_sock.connect("192.168.3.64", 6000);
    char send_data[] = "This is from Ethernet Interface\r\n";
    eth_sock.send_all(send_data, sizeof(send_data)-1);
    eth_sock.close();
}

// ProcessDataViaWiFi.cpp
void ProcessDataViaWiFi()
{
    ::TCPSocketConnection wifi_sock;
    
    wifi_sock.connect("192.168.3.64", 6000);    
    char send_data[] = "This is from WiFi Interface\r\n";
    wifi_sock.send_all(send_data, sizeof(send_data)-1);
    wifi_sock.close();
}

And, here are screenshots of this test. /media/uploads/SteveKim/esd01-2.jpg /media/uploads/SteveKim/esd01-3.jpg

Conclusion

I know that this way is a kind of work-around way. Best way is to design a new network-abstract-class and hierarchical network-interface-classes based on the network-abstract-class.

  • Ethernet : lwIP, WIZnet hardwired TCP/IP
  • WiFi : ESP8266, WiFly, WizFi250, CC3000, ....
  • Other interfaces(3G/4G, BT, .....)

I believe that mbed-team will release a new network classes based on a hierarchical architecture .

Until then, you can refer to the this code for dual network interface, temporarily.

Committer:
SteveKim
Date:
Mon Jun 29 09:42:11 2015 +0000
Revision:
0:0543bf604693
Child:
1:a79f264f321f
...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SteveKim 0:0543bf604693 1 #include "mbed.h"
SteveKim 0:0543bf604693 2 #include "EthernetInterface.h"
SteveKim 0:0543bf604693 3 //#include "ESP8266Interface.h"
SteveKim 0:0543bf604693 4
SteveKim 0:0543bf604693 5 #define MAC "\x00\x08\xDC\xAA\xAA\xAA"
SteveKim 0:0543bf604693 6 #define IP "192.168.3.110"
SteveKim 0:0543bf604693 7 #define MASK "255.255.255.0"
SteveKim 0:0543bf604693 8 #define GATEWAY "192.168.3.1"
SteveKim 0:0543bf604693 9
SteveKim 0:0543bf604693 10 int main() {
SteveKim 0:0543bf604693 11 EthernetInterface eth;
SteveKim 0:0543bf604693 12
SteveKim 0:0543bf604693 13 ////////////////////////////////////////////////////////////////////////////////////
SteveKim 0:0543bf604693 14 // sekim XXXX
SteveKim 0:0543bf604693 15 //eth.init(); //Use DHCP
SteveKim 0:0543bf604693 16 //uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0xFF, 0x11, 0x22};
SteveKim 0:0543bf604693 17 //eth.init(mac_addr);
SteveKim 0:0543bf604693 18 eth.init((uint8_t*)MAC,IP,MASK,GATEWAY); //IP,mask,Gateway
SteveKim 0:0543bf604693 19 eth.link();
SteveKim 0:0543bf604693 20 ////////////////////////////////////////////////////////////////////////////////////
SteveKim 0:0543bf604693 21
SteveKim 0:0543bf604693 22 eth.connect();
SteveKim 0:0543bf604693 23 printf("\r\nIP address is %s\r\n", eth.getIPAddress());
SteveKim 0:0543bf604693 24
SteveKim 0:0543bf604693 25 TCPSocketConnection sock;
SteveKim 0:0543bf604693 26 sock.connect("google.com", 80);
SteveKim 0:0543bf604693 27
SteveKim 0:0543bf604693 28 printf("XXX 200 : Connected\r\n");
SteveKim 0:0543bf604693 29
SteveKim 0:0543bf604693 30 char http_cmd[] = "GET /hello.txt HTTP/1.0\n\n";
SteveKim 0:0543bf604693 31 sock.send_all(http_cmd, sizeof(http_cmd)-1);
SteveKim 0:0543bf604693 32
SteveKim 0:0543bf604693 33 char buffer[300];
SteveKim 0:0543bf604693 34 int ret;
SteveKim 0:0543bf604693 35 while (true) {
SteveKim 0:0543bf604693 36 ret = sock.receive(buffer, sizeof(buffer)-1);
SteveKim 0:0543bf604693 37 printf("XXX 210 : Recv(%d) \r\n", ret);
SteveKim 0:0543bf604693 38 if (ret <= 0)
SteveKim 0:0543bf604693 39 break;
SteveKim 0:0543bf604693 40 buffer[ret] = '\0';
SteveKim 0:0543bf604693 41 printf("Received %d chars from server:\n%s\r\n", ret, buffer);
SteveKim 0:0543bf604693 42 }
SteveKim 0:0543bf604693 43
SteveKim 0:0543bf604693 44 printf("XXX 220 : Closed\r\n");
SteveKim 0:0543bf604693 45
SteveKim 0:0543bf604693 46 sock.close();
SteveKim 0:0543bf604693 47
SteveKim 0:0543bf604693 48 eth.disconnect();
SteveKim 0:0543bf604693 49
SteveKim 0:0543bf604693 50 while(1) {}
SteveKim 0:0543bf604693 51 }
SteveKim 0:0543bf604693 52
SteveKim 0:0543bf604693 53 /*
SteveKim 0:0543bf604693 54
SteveKim 0:0543bf604693 55
SteveKim 0:0543bf604693 56
SteveKim 0:0543bf604693 57
SteveKim 0:0543bf604693 58
SteveKim 0:0543bf604693 59
SteveKim 0:0543bf604693 60
SteveKim 0:0543bf604693 61
SteveKim 0:0543bf604693 62
SteveKim 0:0543bf604693 63
SteveKim 0:0543bf604693 64
SteveKim 0:0543bf604693 65
SteveKim 0:0543bf604693 66 #include "mbed.h"
SteveKim 0:0543bf604693 67 #include "EthernetInterface.h"
SteveKim 0:0543bf604693 68
SteveKim 0:0543bf604693 69 AnalogIn pot1(A0);
SteveKim 0:0543bf604693 70 AnalogIn pot2(A1);
SteveKim 0:0543bf604693 71
SteveKim 0:0543bf604693 72 DigitalOut led1(LED1);
SteveKim 0:0543bf604693 73 DigitalOut led2(LED2);
SteveKim 0:0543bf604693 74 DigitalOut led3(LED3);
SteveKim 0:0543bf604693 75 DigitalOut led4(LED4);
SteveKim 0:0543bf604693 76
SteveKim 0:0543bf604693 77 EthernetInterface eth;
SteveKim 0:0543bf604693 78 TCPSocketConnection sock;
SteveKim 0:0543bf604693 79
SteveKim 0:0543bf604693 80 int main()
SteveKim 0:0543bf604693 81 {
SteveKim 0:0543bf604693 82 //uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0x02};
SteveKim 0:0543bf604693 83 uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0xFF, 0x11, 0x22};
SteveKim 0:0543bf604693 84 char *MODEL = "mbed";
SteveKim 0:0543bf604693 85 char *SERIAL_NUM = "input_your_serial_num";
SteveKim 0:0543bf604693 86 float DEADBAND = 0.015;
SteveKim 0:0543bf604693 87 char* ip;
SteveKim 0:0543bf604693 88
SteveKim 0:0543bf604693 89 int http_cmd_sz=800;
SteveKim 0:0543bf604693 90 char http_cmd[http_cmd_sz];
SteveKim 0:0543bf604693 91 int buffer_sz=300;
SteveKim 0:0543bf604693 92 char buffer[buffer_sz];
SteveKim 0:0543bf604693 93 int returnCode = 0;
SteveKim 0:0543bf604693 94
SteveKim 0:0543bf604693 95 for (int i=0; i<5; i++) {
SteveKim 0:0543bf604693 96 led1 = 1;
SteveKim 0:0543bf604693 97 wait(0.2);
SteveKim 0:0543bf604693 98 led1 = 0;
SteveKim 0:0543bf604693 99 wait(0.2);
SteveKim 0:0543bf604693 100 }
SteveKim 0:0543bf604693 101
SteveKim 0:0543bf604693 102 led1 = 1;
SteveKim 0:0543bf604693 103 led2 = 1;
SteveKim 0:0543bf604693 104 led3 = 1;
SteveKim 0:0543bf604693 105 led4 = 1;
SteveKim 0:0543bf604693 106
SteveKim 0:0543bf604693 107 printf("initializing Ethernet\r\n");
SteveKim 0:0543bf604693 108 eth.init(mac_addr); //Use DHCP
SteveKim 0:0543bf604693 109 if ( returnCode == 0 )
SteveKim 0:0543bf604693 110 {
SteveKim 0:0543bf604693 111 printf(" - Ethernet ready\r\n");
SteveKim 0:0543bf604693 112 led1 = returnCode;
SteveKim 0:0543bf604693 113 }
SteveKim 0:0543bf604693 114 else
SteveKim 0:0543bf604693 115 {
SteveKim 0:0543bf604693 116 printf(" - Could not initialize Ethernet - ending\r\n");
SteveKim 0:0543bf604693 117 return 0;
SteveKim 0:0543bf604693 118 }
SteveKim 0:0543bf604693 119
SteveKim 0:0543bf604693 120 eth.ethernet_link();
SteveKim 0:0543bf604693 121 printf("eth.ethernet_link() %d \r\n", eth.ethernet_link());
SteveKim 0:0543bf604693 122
SteveKim 0:0543bf604693 123 printf("Ethernet.connecting \r\n");
SteveKim 0:0543bf604693 124 returnCode = eth.connect();
SteveKim 0:0543bf604693 125
SteveKim 0:0543bf604693 126 printf(" - connecting returned %d \r\n", returnCode);
SteveKim 0:0543bf604693 127 led2 = returnCode != -1 ? 0: 1;
SteveKim 0:0543bf604693 128 printf("Trying to get IP address..\r\n");
SteveKim 0:0543bf604693 129 ip = eth.getIPAddress();
SteveKim 0:0543bf604693 130 led3 = strlen(ip)<4 ? 1: 0;
SteveKim 0:0543bf604693 131 printf(" - IP address:%s\r\n", ip);
SteveKim 0:0543bf604693 132
SteveKim 0:0543bf604693 133 float oil_level = 0.0;
SteveKim 0:0543bf604693 134 float oil_level2= 0.0;
SteveKim 0:0543bf604693 135 float oldPotVal = -2.0;
SteveKim 0:0543bf604693 136 float oldPotVal2 = -2.0;
SteveKim 0:0543bf604693 137
SteveKim 0:0543bf604693 138 while(1) {
SteveKim 0:0543bf604693 139 oil_level = pot1.read();
SteveKim 0:0543bf604693 140 oil_level2= pot2.read();
SteveKim 0:0543bf604693 141
SteveKim 0:0543bf604693 142 if ( abs(oil_level - oldPotVal) < DEADBAND && abs(oil_level2 - oldPotVal2) < DEADBAND)
SteveKim 0:0543bf604693 143 {
SteveKim 0:0543bf604693 144 continue;
SteveKim 0:0543bf604693 145 }
SteveKim 0:0543bf604693 146 else
SteveKim 0:0543bf604693 147 {
SteveKim 0:0543bf604693 148 led4 = 1;
SteveKim 0:0543bf604693 149 oldPotVal = oil_level;
SteveKim 0:0543bf604693 150 oldPotVal2 = oil_level2;
SteveKim 0:0543bf604693 151 printf("Sending Value for well1 %.2f\n\r", oil_level);
SteveKim 0:0543bf604693 152 printf("Sending Value for well2 %.2f\n\r", oil_level2);
SteveKim 0:0543bf604693 153 sock.connect("toolbox-connect.axeda.com", 80);
SteveKim 0:0543bf604693 154
SteveKim 0:0543bf604693 155 snprintf(http_cmd, http_cmd_sz, "POST /ammp/data/1/%s!%s HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: 65\r\n\r\n{\"data\":[{\"di\":{\"oil_level\":%.2f, \"oil_level2\":%.2f}}]}\r\n\r\n", MODEL, SERIAL_NUM, oil_level, oil_level2);
SteveKim 0:0543bf604693 156 sock.send_all(http_cmd, http_cmd_sz-1);
SteveKim 0:0543bf604693 157
SteveKim 0:0543bf604693 158 while ( (returnCode = sock.receive(buffer, buffer_sz-1)) > 0)
SteveKim 0:0543bf604693 159 {
SteveKim 0:0543bf604693 160 buffer[returnCode] = '\0';
SteveKim 0:0543bf604693 161 printf("Received %d chars from server:\n\r%s\n", returnCode, buffer);
SteveKim 0:0543bf604693 162 }
SteveKim 0:0543bf604693 163 led4 = returnCode;
SteveKim 0:0543bf604693 164 sock.close();
SteveKim 0:0543bf604693 165 }
SteveKim 0:0543bf604693 166
SteveKim 0:0543bf604693 167 }
SteveKim 0:0543bf604693 168
SteveKim 0:0543bf604693 169 }
SteveKim 0:0543bf604693 170 */