This is WizFi250 library for NetworkInterfaceAPI of mbed5

Dependents:   HelloWizFi250Interface

Files at this revision

API Documentation at this revision

Comitter:
kaizen
Date:
Tue Aug 30 00:05:24 2016 +0000
Commit message:
First release WizFi250Interface for NetworkInterfaceAPI

Changed in this revision

WizFi250/CBuffer.h Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250.h Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250_at.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250_conf.h Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250_hal.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250_ifc.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250_msg.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250_sock.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250/WizFi250_util.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250Interface.cpp Show annotated file Show diff for this revision Revisions of this file
WizFi250Interface.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r e3dc9e54a15b WizFi250/CBuffer.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/CBuffer.h	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,78 @@
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef CIRCBUFFER_H_
+#define CIRCBUFFER_H_
+
+template <class T>
+class CircBuffer {
+public:
+    CircBuffer(int length) {
+        write = 0;
+        read = 0;
+        size = length + 1;
+        buf = (T *)malloc(size * sizeof(T));
+        if (buf == NULL)
+            error("Can't allocate memory");
+    };
+
+    bool isFull() {
+        return (((write + 1) % size) == read);
+    };
+
+    bool isEmpty() {
+        return (read == write);
+    };
+
+    void queue(T k) {
+        if (isFull()) {
+//            read++;
+//            read %= size;
+            return;
+        }
+        buf[write++] = k;
+        write %= size;
+    }
+
+    void flush() {
+        read = 0;
+        write = 0;
+    }
+
+
+    uint32_t available() {
+        return (write >= read) ? write - read : size - read + write;
+    };
+
+    bool dequeue(T * c) {
+        bool empty = isEmpty();
+        if (!empty) {
+            *c = buf[read++];
+            read %= size;
+        }
+        return(!empty);
+    };
+
+private:
+    volatile uint32_t write;
+    volatile uint32_t read;
+    uint32_t size;
+    T * buf;
+};
+
+#endif
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+#include "mbed.h"
+#include "WizFi250.h"
+
+WizFi250 * WizFi250::_inst;
+
+
+WizFi250::WizFi250(PinName tx,PinName rx,PinName cts, PinName rts,PinName reset, PinName alarm, int baud):
+    _wizfi(tx,rx), _reset(reset)
+{
+    _inst = this;
+    memset(&_state, 0, sizeof(_state));
+    memset(&_con, 0, sizeof(_con));
+    _state.initialized = false;
+    _state.status = STAT_READY;
+    _state.cid = -1;
+    _state.buf = new CircBuffer<char>(CFG_DATA_SIZE);
+
+    initUart(cts, rts, alarm, baud);
+    _reset.output();
+
+    setRts(true); // release
+    /*
+    wait_ms(500);
+    cmdAT();
+    cmdMECHO(false);
+    if(cts != NC && rts != NC)
+        cmdUSET(baud,"HW");
+    else
+        cmdUSET(baud,"N");
+
+    // WizFi250 will restart by cmdUSET command.
+    wait_ms(1000);
+    cmdAT();
+    */
+}
+
+int WizFi250::join(WiFiMode mode)
+{
+    char sec[10];
+
+    if( cmdMMAC() ) return -1;
+
+    if(mode == WM_AP)
+        _state.wm = WM_AP;
+    else
+        _state.wm = WM_STATION;
+
+    if ( cmdWNET(_state.dhcp) ) return -1;
+    if ( cmdWSET(_state.wm, _state.ssid) ) return -1;
+
+    switch (_state.sec)
+    {
+    case SEC_AUTO:
+        strcpy(sec,"");
+        break;
+    case SEC_OPEN:
+        strcpy(sec,"OPEN");
+        break;
+    case SEC_WEP:
+        strcpy(sec,"WEP");
+        break;
+    case SEC_WPA_TKIP:
+        strcpy(sec,"WPA");
+        break;
+    case SEC_WPA_AES:
+        strcpy(sec,"WPAAES");
+        break;
+    case SEC_WPA2_AES:
+        strcpy(sec,"WPA2AES");
+        break;
+    case SEC_WPA2_TKIP:
+        strcpy(sec,"WPA2TKIP");
+        break;
+    case SEC_WPA2_MIXED:
+        strcpy(sec,"WPA2");
+        break;
+    }
+    if ( cmdWSEC(_state.wm, _state.pass, sec) ) return -1;
+    if ( cmdWJOIN() )   return -1;;
+    _state.associated = true;
+
+    return 0;
+}
+
+bool WizFi250::isAssociated()
+{
+    return _state.associated;
+}
+
+int WizFi250::setMacAddress (const char *mac)
+{
+    if (cmdMMAC(mac)) return -1;
+    strncpy(_state.mac, mac, sizeof(_state.mac));
+    return 0;
+}
+
+int WizFi250::getMacAddress (char *mac)
+{
+    if (cmdMMAC())  return -1;
+    strcpy(mac, _state.mac);
+    return 0;
+}
+
+int WizFi250::setAddress (const char *name)
+{
+    _state.dhcp = true;
+    strncpy(_state.name, name, sizeof(_state.name));
+    return 0;
+}
+
+int WizFi250::setAddress (const char *ip, const char *netmask, const char *gateway, const char *dns, const char *name)
+{
+    _state.dhcp = false;
+    strncpy(_state.ip, ip, sizeof(_state.ip));
+    strncpy(_state.netmask, netmask, sizeof(_state.netmask));
+    strncpy(_state.gateway, gateway, sizeof(_state.gateway));
+    strncpy(_state.nameserver, dns, sizeof(_state.nameserver));
+    strncpy(_state.name, name, sizeof(_state.name));
+    return 0;
+}
+
+int WizFi250::getAddress (char *ip, char *netmask, char *gateway)
+{
+    strcpy(ip, _state.ip);
+    strcpy(netmask, _state.netmask);
+    strcpy(gateway, _state.gateway);
+    return 0;
+}
+
+int WizFi250::setSsid (const char *ssid)
+{
+    strncpy(_state.ssid, ssid, sizeof(_state.ssid));
+    return 0;
+}
+
+int WizFi250::setSec ( Security sec, const char *phrase )
+{
+    _state.sec = sec;
+    strncpy(_state.pass, phrase, strlen(phrase));
+    return 0;
+}
+
+const char *WizFi250::getIPAddress(void)
+{
+    return _state.ip;
+}
+
+const char *WizFi250::getMACAddress(void)
+{
+    return _state.mac;
+}
+
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250.h	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,321 @@
+/* Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+#ifndef WIZFI250_H_
+#define WIZFI250_H_
+
+#include "WizFi250_conf.h"
+
+#include "mbed.h"
+#include "RawSerial.h"
+#include "Serial.h"
+#include "CBuffer.h"
+#include <ctype.h>
+#include <stdlib.h>
+#include <string>
+
+using namespace std;
+
+#define BUF_SIZE 1600
+
+//Debug is disabled by default
+#if 1
+#define WIZ_DBG(x, ...) std::printf("[WizFi250: DBG]" x "\r\n", ##__VA_ARGS__);
+#define WIZ_WARN(x, ...) std::printf("[WizFi250: WARN]" x "\r\n", ##__VA_ARGS__);
+#define WIZ_ERR(x, ...) std::printf("[WizFi250: ERR]" x "\r\n", ##__VA_ARGS__);
+#define WIZ_INFO(x, ...) std::printf("[WizFi250: INFO]" x "\r\n", ##__VA_ARGS__);
+#else
+#define WIZ_DBG(x, ...)
+#define WIZ_WARN(x, ...)
+#define WIZ_ERR(x, ...)
+#define WIZ_INFO(x, ...)
+#endif
+
+
+class WizFi250
+{
+public:
+
+    enum AntennaMode{
+        PCB = 0,
+        UFL = 1,
+        AUTO = 3,
+    };
+
+    enum WiFiMode {
+        WM_STATION = 0,
+        WM_AP = 1,
+    };
+
+    /** Wi-Fi security
+     */
+    enum Security {
+        // kaizen need to change
+        SEC_AUTO        = 0,
+        SEC_OPEN        = 1,
+        SEC_WEP         = 2,
+        SEC_WPA_TKIP    = 3,
+        SEC_WPA_AES     = 4,
+        SEC_WPA2_AES    = 5,
+        SEC_WPA2_TKIP   = 6,
+        SEC_WPA2_MIXED  = 7,
+    };
+
+    /** TCP/IP protocol
+     */
+    enum Protocol {
+        PROTO_UDP = 0,
+        PROTO_TCP = 1,
+    };
+
+    /** Client/Server
+     */
+    enum Type {
+        TYPE_CLIENT = 0,
+        TYPE_SERVER = 1,
+    };
+
+    enum Response {
+        RES_NULL,
+        RES_MACADDRESS,
+        RES_WJOIN,
+        RES_CONNECT,
+        RES_SSEND,
+        RES_FDNS,
+        RES_SMGMT,
+        RES_WSTATUS,
+    };
+
+    enum Mode {
+        MODE_COMMAND,
+        MODE_CMDRESP,
+        MODE_DATA_RX,
+        MODE_DATA_RXUDP,
+        MODE_DATA_RXUDP_BULK,
+    };
+
+    enum Status {
+        STAT_NONE,
+        STAT_READY,
+        STAT_STANDBY,
+        STAT_WAKEUP,
+        STAT_DEEPSLEEP,
+    };
+
+
+    WizFi250 (PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm = NC, int baud = 115200);
+
+    // --------- WizFi250_at.cpp ---------
+    void clearFlags     ();
+    int  sendCommand    (const char * cmd, Response res = RES_NULL, int timeout = DEFAULT_WAIT_RESP_TIMEOUT, int opt = 2);
+
+    int cmdAT       ();
+    int cmdMECHO    (bool flg);
+    int cmdUSET     (int baud, char *flow);
+    int cmdMMAC     (const char *mac = NULL);
+    int cmdWSET     (WiFiMode mode, const char *ssid, const char *bssid = NULL, int channel = 1);
+    int cmdWANT     (AntennaMode mode);
+    int cmdWNET     (bool is_dhcp);
+    int cmdWSEC     (WiFiMode mode, const char *key, const char *sec = NULL);
+    int cmdWJOIN    ();
+    int cmdWLEAVE   ();
+    int cmdWSTATUS  ();
+    int cmdSCON     ( const char *openType, const char *socketType, int localPort, const char *dataMode = "0");
+    int cmdSCON     ( const char *openType, const char *socketType, const char *remoteIp, int remotePort, int localPort = 0, const char *dataMode = "0");
+    int cmdSSEND    ( const char *data, int cid, int sendSize, const char *remoteIp = NULL, int remotePort = 0, int Timeout = 2000 );
+    int cmdCLOSE    ( int cid );
+    int cmdFDNS     (const char *host);
+    int cmdSMGMT    ( int cid );
+
+
+    static WizFi250 * getInstance() {
+        return _inst;
+    };
+
+
+    // --------- WizFi2550_sock.cpp ---------
+    int getHostByName   (const char * host, char *ip);
+    int open            (Protocol proto, const char *ip, int remotePort, int localPort = 0, void(*func)(int) = NULL);
+    int listen          (Protocol proto, int port, void(*func)(int)=NULL);
+    int close           (int cid);
+    void initCon        (int cid, bool connected);
+    int send            (int cid, const char *buf, int len);
+    int sendto          (int cid, const char *buf, int len, const char *ip, int port);
+    int recv            (int cid, char *buf, int len);
+    int recvfrom        (int cid, char *buf, int len, char *ip, int *port);
+    int readable        (int cid);
+    bool isConnected    (int cid);
+    int accept          (int cid);
+    int getRemote       (int cid, char **ip, int *port);
+
+
+
+protected:
+    static WizFi250 * _inst;
+
+
+    // Serial _wizfi
+    RawSerial _wizfi;
+    int _baud;
+    DigitalIn *_cts;
+    DigitalOut *_rts;
+    int _flow;
+
+    DigitalInOut _reset;
+
+    struct STATE {
+        WiFiMode wm;
+        Security sec;
+        char ssid[35];
+        char pass[66];
+        char ip[16];
+        char netmask[16];
+        char gateway[16];
+        char nameserver[16];
+        char mac[18];
+        char resolv[16];
+        char name[32];
+        int rssi;
+        bool dhcp;
+        time_t time;
+
+        bool initialized;
+        bool associated;
+        volatile Mode mode;
+        volatile Status status;
+        bool escape;
+        volatile bool ok, failure;
+        volatile Response res;
+        int cid;
+        int n;
+        CircBuffer<char> *buf;
+        char dbgRespBuf[BUF_SIZE];
+        //char dummyBuf[BUF_SIZE];
+    } _state;
+
+
+public:
+    struct CONNECTION {
+        Protocol protocol;
+        Type type;
+        bool connected;
+        char ip[16];
+        int port;
+        int send_length;
+        int recv_length;
+        CircBuffer<char> *buf;
+        volatile bool received;
+        volatile int parent;
+        volatile bool accept;
+        void(*func)(int);
+    } _con[8];
+
+    // --------- WizFi250.cpp ---------
+
+    int join(WiFiMode mode);
+    bool isAssociated();
+
+    //int limitedap ();
+    //int dissociate ();
+    /*
+    int disconnect () {
+        return dissociate();
+    }
+    */
+
+    Status getStatus ();
+
+    int setMacAddress   (const char *mac);
+    int getMacAddress   (char *mac);
+    int setAddress      (const char *name = NULL);
+    int setAddress      (const char *ip, const char *netmask, const char *gateway, const char *dns = NULL, const char *name = NULL);
+    int getAddress      (char *ip, char *netmask, char *gateway);
+    int setSsid         (const char *ssid);
+    int setSec          (Security sec, const char *phrase);
+
+    const char* getIPAddress    (void);
+    const char* getMACAddress   (void);
+
+    // --------- WizFi250_msg.cpp ---------
+    void recvData       ( char c );
+    int  parseMessage   ();
+    void msgOk          (const char *buf);
+    void msgError       (const char *buf);
+    void msgConnect     (const char *buf);
+    void msgDisconnect  (const char *buf);
+    void msgListen      (const char *buf);
+
+    void resMacAddress  (const char *buf);
+    void resWJOIN       (const char *buf);
+    void resConnect     (const char *buf);
+    void resSSEND       (const char *buf);
+    void resFDNS        (const char *buf);
+    void resSMGMT       (const char *buf);
+    void resWSTATUS     (const char *buf);
+
+
+    // --------- WizFi250_hal.cpp ---------
+    void setReset   (bool flg);
+    void isrUart    ();
+    int  getUart    ();
+    void putUart    (char c);
+    void setRts     (bool flg);
+    int  lockUart   (int ms);
+    void unlockUart ();
+    void initUart   (PinName cts, PinName rts, PinName alarm, int baud);
+
+
+    // --------- WizFi2550_util.cpp ---------
+    int x2i     (char c);
+    int i2x     (int i);
+
+    // --------- WizFi250_ifc.cpp (For NetworkSocketAPI) ---------
+    /**
+    * Startup the WizFi250
+    *
+    * @return true only if WizFi250 was setup correctly
+    */
+    bool startup(void);
+
+    /**
+    * Reset WizFi250
+    *
+    * @return true only if WizFi250 resets successfully
+    */
+    bool reset(void);
+
+    /**
+    * Disconnect WizFi250 from AP
+    *
+    * @return true only if WizFi250 is disconnected successfully
+    */
+    bool disconnect(void);
+
+    /**
+    * Check if WizFi250 is conenected
+    *
+    * @return true only if the chip has an IP address
+    */
+    bool isConnected(void);
+
+};
+
+#endif /* WIZFI250_H_ */
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250_at.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_at.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,345 @@
+/*
+ * Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+
+#include "WizFi250.h"
+
+
+
+void WizFi250::clearFlags()
+{
+    _state.ok = false;
+    _state.failure = false;
+    _state.res = RES_NULL;
+    _state.n = 0;
+}
+
+
+int WizFi250::sendCommand(const char * cmd, Response res, int timeout, int opt)
+{
+    unsigned int i;
+    Timer t;
+
+  if (lockUart(timeout)) return -1;
+
+    clearFlags();
+    _state.res = res;
+
+    WIZ_INFO("%s", cmd)
+    for (i=0; i< strlen(cmd); i++)
+    {
+        putUart(cmd[i]);
+    }
+
+    if(opt == 1)
+    {
+        putUart('\r');
+    }
+    else if(opt == 2)
+    {
+        putUart('\r');
+        putUart('\n');
+    }
+    unlockUart();
+
+    if(timeout)
+    {
+        t.start();
+        for(;;)
+        {
+            if (_state.ok && _state.res == RES_NULL){
+                break;
+            }
+            if (_state.failure || t.read_ms() > timeout)
+            {
+                WIZ_WARN("failure of timeout[%d]ms\r\n",t.read_ms());
+                _state.res = RES_NULL;
+                t.stop();
+                return -1;
+            }
+        }
+
+        t.stop();
+    }
+
+    WIZ_INFO("[OK]\r\n");
+    _state.res = RES_NULL;
+
+    return 0;
+}
+
+int WizFi250::cmdAT()
+{
+    int resp;
+
+    resp = sendCommand("AT");
+
+    return resp;
+}
+
+int WizFi250::cmdMECHO(bool flg)
+{
+    int status;
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+MECHO=%d",flg);
+    status = sendCommand(cmd);
+
+    return status;
+}
+
+int WizFi250::cmdUSET(int baud, char *flow)
+{
+    int status;
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+USET=%d,N,8,1,%s",baud, flow);
+    status = sendCommand(cmd);
+
+    if(status == 0)
+    {
+        wait(1);
+        _state.buf->flush();
+    }
+
+    return status;
+}
+
+int WizFi250::cmdMMAC(const char *mac)
+{
+    int resp;
+    char cmd[CFG_CMD_SIZE];
+
+    if (mac)
+    {
+        sprintf(cmd, "AT+MMAC=%s",mac);
+        resp = sendCommand(cmd);
+    }
+    else
+    {
+        sprintf(cmd, "AT+MMAC=?");
+        resp = sendCommand(cmd, RES_MACADDRESS);
+    }
+
+    return resp;
+}
+
+int WizFi250::cmdWSET(WiFiMode mode, const char *ssid, const char *bssid, int channel)
+{
+    char cmd[CFG_CMD_SIZE];
+
+    if(*bssid == NULL)
+    {
+        sprintf(cmd, "AT+WSET=%d,%s",mode, ssid);
+    }
+    else
+    {
+        sprintf(cmd, "AT+WSET=%d,%s,%s,%d",mode, ssid, bssid, channel);
+    }
+
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdWANT(AntennaMode mode)
+{
+    char cmd[CFG_CMD_SIZE];
+    sprintf(cmd, "AT+WANT=%d",mode);
+    
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdWNET(bool is_dhcp)
+{
+    char cmd[CFG_CMD_SIZE];
+
+    if(is_dhcp == true)
+    {
+        sprintf(cmd, "AT+WNET=1");
+    }
+    else
+    {
+        sprintf(cmd, "AT+WNET=0,%s,%s,%s",_state.ip,_state.netmask,_state.gateway);
+    }
+
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdWSEC(WiFiMode mode, const char *key, const char *sec)
+{
+    char cmd[CFG_CMD_SIZE];
+
+    if(*sec == NULL)
+    {
+        sprintf(cmd, "AT+WSEC=%d,,%s",mode, key);
+    }
+    else
+    {
+        sprintf(cmd, "AT+WSEC=%d,%s,%s",mode, sec, key);
+    }
+
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdWJOIN()
+{
+    //if( sendCommand("AT+WJOIN", RES_WJOIN, CFG_JOIN_TIMEOUT) )
+    if( sendCommand("AT+WJOIN", RES_NULL, CFG_JOIN_TIMEOUT) )
+    {
+        WIZ_ERR("cmdWJOIN");
+        return -1;
+    }
+
+    if( cmdWSTATUS() )
+        return -1;
+
+    WIZ_INFO("WizFi250 is successfully join to AP");
+
+    return 0;
+}
+
+int WizFi250::cmdWLEAVE()
+{
+    return sendCommand("AT+WLEAVE");
+}
+
+
+int WizFi250::cmdWSTATUS()
+{
+    if( sendCommand("AT+WSTATUS", RES_WSTATUS, DEFAULT_WAIT_RESP_TIMEOUT) )
+    {
+        WIZ_ERR("cmdWSTATUS");
+        return -1;
+    }
+
+    WIZ_INFO("IP      : %s", _state.ip);
+    WIZ_INFO("Gateway : %s", _state.gateway);
+
+    return 0;
+}
+
+int WizFi250::cmdSCON ( const char *openType, const char *socketType, int localPort, const char *dataMode)
+{
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+SCON=%s,%s,,,%d,%s",openType, socketType, localPort, dataMode);
+    return sendCommand(cmd);
+}
+
+int WizFi250::cmdSCON ( const char *openType, const char *socketType, const char *remoteIp, int remotePort, int localPort, const char *dataMode)
+{
+    int resp;
+    char cmd[CFG_CMD_SIZE];
+
+    if(localPort == 0)
+        sprintf(cmd,"AT+SCON=%s,%s,%s,%d,%s,%s",openType, socketType, remoteIp, remotePort, "", dataMode);
+    else
+        sprintf(cmd,"AT+SCON=%s,%s,%s,%d,%d,%s",openType, socketType, remoteIp, remotePort, localPort, dataMode);
+
+    resp = sendCommand(cmd, RES_CONNECT, 30000 );
+
+    return resp;
+}
+
+int WizFi250::cmdSSEND ( const char *data, int cid, int sendSize, const char *remoteIp, int remotePort, int Timeout )
+{
+    int i, resp;
+    Timer t;
+    char cmd[CFG_CMD_SIZE];
+
+    if (lockUart(Timeout))    return -1;
+
+    clearFlags();
+    if(remoteIp == NULL)
+    {
+        sprintf(cmd,"AT+SSEND=%d,,,%d",cid, sendSize);
+    }
+    else
+    {
+        sprintf(cmd,"AT+SSEND=%d,%s,%d,%d",cid, remoteIp, remotePort, sendSize);
+    }
+
+    _con[cid].send_length = sendSize;
+
+    resp = sendCommand(cmd, RES_SSEND, 2000, 1);
+
+    unlockUart();
+    if(resp){
+        WIZ_DBG("Fail cmdSSEND")
+       return -1;
+    }
+
+    for(i=0; i<sendSize; i++)
+    {
+        putUart(data[i]);
+    }
+    unlockUart();
+
+    if(Timeout)
+    {
+        t.start();
+        for(;;)
+        {
+            if (_state.ok) break;
+            if (_state.failure || t.read_ms() > Timeout)
+            {
+                WIZ_WARN("failure or timeout\r\n");
+                return -1;
+            }
+        }
+        t.stop();
+    }
+
+    wait(0.05);
+    WIZ_INFO("%s\r\n",data);
+
+    return i;
+}
+
+
+int WizFi250::cmdCLOSE ( int cid )
+{
+    char cmd[CFG_CMD_SIZE];
+
+    sprintf(cmd,"AT+SMGMT=%d",cid);
+    return sendCommand(cmd);
+}
+
+
+int WizFi250::cmdFDNS (const char *host)
+{
+    char cmd[CFG_CMD_SIZE];
+    int resp;
+
+    sprintf(cmd,"AT+FDNS=%s,3000",host);
+    resp = sendCommand(cmd, RES_FDNS);
+
+    WIZ_DBG("%s",_state.resolv);
+    return resp;
+}
+
+int WizFi250::cmdSMGMT ( int cid )
+{
+    int resp;
+
+    resp = sendCommand("AT+SMGMT=?", RES_SMGMT);
+    return resp;
+}
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250_conf.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_conf.h	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,38 @@
+/* Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+#ifndef WIZFI250_CONF_H_
+#define WIZFI250_CONF_H_
+
+
+#define CFG_TRYJOIN 3
+
+
+#define DEFAULT_WAIT_RESP_TIMEOUT    2000 // ms
+#define CFG_JOIN_TIMEOUT            60000 // ms
+#define CFG_CMD_SIZE 128
+
+#define CFG_DATA_SIZE BUF_SIZE
+
+#define CFG_DEFAULT_MAC "00:08:DC:00:00:00"
+
+
+#endif /* WIZFI250_CONF_H_ */
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250_hal.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_hal.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+#include "WizFi250.h"
+
+void WizFi250::setReset(bool flg)
+{
+    if( flg )
+    {
+        // low
+        _reset.output();
+        _reset = 0;
+    }
+    else
+    {
+        // high z
+        _reset.input();
+        _reset.mode(PullNone);
+    }
+}
+
+void WizFi250::isrUart()
+{
+    char c;
+
+    c = getUart();
+
+    recvData(c);
+    //S_UartPutc(c);
+}
+
+int WizFi250::getUart()
+{
+    return _wizfi.getc();
+}
+
+void WizFi250::putUart (char c)
+{
+    _wizfi.putc(c);
+}
+
+void WizFi250::setRts (bool flg)
+{
+    if (flg)
+    {
+        if(_flow == 2)
+        {
+            if(_rts)
+            {
+                _rts->write(0); // low
+            }
+        }
+    }
+    else
+    {
+        if(_flow == 2)
+        {
+            if(_rts)
+            {
+                _rts->write(1); // high
+            }
+        }
+    }
+}
+
+int WizFi250::lockUart (int ms)
+{
+    Timer t;
+
+    if(_state.mode != MODE_COMMAND)
+    {
+        t.start();
+        while(_state.mode != MODE_COMMAND)
+        {
+            if(t.read_ms() >= ms)
+            {
+                  WIZ_WARN("lock timeout (%d)\r\n", _state.mode);
+                return -1;
+            }
+        }
+    }
+
+#ifdef CFG_ENABLE_RTOS
+    if (_mutexUart.lock(ms) != osOK) return -1;
+#endif
+
+    if(_flow == 2)
+    {
+        if(_cts && _cts->read())
+        {
+            // CTS check
+            t.start();
+            while (_cts->read())
+            {
+                if(t.read_ms() >= ms)
+                {
+                    WIZ_DBG("cts timeout\r\n");
+                    return -1;
+                }
+            }
+        }
+    }
+
+    setRts(false);      // blcok
+    return 0;
+}
+
+void WizFi250::unlockUart()
+{
+    setRts(true);       // release
+#ifdef CFG_ENABLE_RTOS
+    _mutexUart.unlock();
+#endif
+}
+
+void WizFi250::initUart (PinName cts, PinName rts, PinName alarm, int baud)
+{
+    _baud = baud;
+    if (_baud) _wizfi.baud(_baud);
+
+    _wizfi.attach(this, &WizFi250::isrUart, Serial::RxIrq);
+
+    _cts = NULL;
+    _rts = NULL;
+    _flow = 0;
+
+    if(cts != NC)
+    {
+        _cts = new DigitalIn(cts);
+    }
+    if(rts != NC)
+    {
+        _rts = new DigitalOut(rts);
+        _flow = 2;
+    }
+}
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250_ifc.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_ifc.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,46 @@
+/* WizFi250 
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "WizFi250.h"
+
+bool WizFi250::startup(void)
+{
+    reset();
+
+    cmdAT();
+    if( cmdMECHO(false) == -1)  return false;
+    //if( cmdMECHO(true) == -1) return false;
+    if(_cts != NULL && _rts != NULL)
+    {
+        if( cmdUSET(_baud,"HW") == -1)  return false;
+    }
+    else
+    {
+        if( cmdUSET(_baud,"N") == -1)   return false;
+    }
+    wait_ms(1000);
+    if( cmdAT() == -1)          return false;
+
+    return true;
+}
+
+bool WizFi250::reset(void)
+{
+    _reset = 0;
+    wait_ms(500);
+    _reset = 1;
+
+    return true;
+}
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250_msg.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_msg.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,431 @@
+/*
+/* Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+#include "WizFi250.h"
+
+#ifdef CFG_ENABLE_RTOS
+#undef WIZ_DBG
+#define WIZ_DBG(x, ...)
+#endif
+
+// This function is operating in ISR. So you can't use debug message.
+void WizFi250::recvData ( char c )
+{
+    static int cid, sub, len, count;
+
+    switch(_state.mode)
+    {
+        case MODE_COMMAND:
+            switch(c)
+            {
+                case 0:
+                case 0x0a:  // LF
+                case 0x0d:  // CR
+                break;
+
+                case '{':
+                _state.buf->flush();
+                _state.mode = MODE_DATA_RX;
+                sub = 0;
+                break;
+
+                default:
+                _state.buf->flush();
+                _state.buf->queue(c);
+                _state.mode = MODE_CMDRESP;
+                break;
+            }
+            break;
+
+        case MODE_CMDRESP:
+            switch(c)
+            {
+                case 0:
+                    break;
+                case 0x0a: // LF
+                    break;
+                case 0x0d: // CR
+                    if (_flow == 2) setRts(false);      // block
+                    _state.mode = MODE_COMMAND;
+                    parseMessage();
+                    if (_flow == 2) setRts(true);       // release
+                    break;
+                default:
+                    _state.buf->queue(c);
+                    break;
+            }
+            break;
+
+        case MODE_DATA_RX:
+            switch(sub)
+            {
+                case 0:
+                // cid
+                if( (c >= '0') && (c <= '9') )
+                {
+                    cid = x2i(c);
+                }
+                else if ( c == ',' )
+                {
+                    sub++;
+                    count = 0;
+                    len = 0;
+                }
+                else
+                {
+                    _state.mode = MODE_COMMAND;
+                }
+                break;
+
+            case 1:
+                // ip
+                if ((c >= '0' && c <= '9') || c == '.')
+                {
+                    _con[cid].ip[count] = c;
+                    count++;
+                }
+                else if( c == ',' )
+                {
+                    _con[cid].ip[count] = '\0';
+                    _con[cid].port = 0;
+                    sub++;
+                }
+                else
+                {
+                    _state.mode = MODE_COMMAND;
+                }
+                break;
+
+            case 2:
+                // port
+                if ( c >= '0' && c <= '9' )
+                {
+                    _con[cid].port = (_con[cid].port * 10) + ( c - '0' );
+                }
+                else if( c == ',')
+                {
+                    sub++;
+                    count = 0;
+                }
+                else
+                {
+                    _state.mode = MODE_COMMAND;
+                }
+                break;
+
+            case 3:
+                // data length
+                if ( c >= '0' && c <= '9' )
+                {
+                    //_con[cid].recv_length = (_con[cid].recv_length * 10) + (c - '0');
+                    len = (len * 10) + (c - '0');
+                }
+                else if( c == '}' )
+                {
+                    sub++;
+                    count = 0;
+                    _con[cid].recv_length = len;
+                }
+                else
+                {
+                    _state.mode = MODE_COMMAND;
+                }
+                break;
+
+            default:
+                if(_con[cid].buf != NULL)
+                {
+                    _con[cid].buf->queue(c);
+                    if(_con[cid].buf->available() > CFG_DATA_SIZE - 16 )
+                    {
+                        setRts(false);     // blcok
+                        _con[cid].received = true;
+                        WIZ_WARN("buf full");
+                    }
+                }
+                _con[cid].recv_length--;
+                if(_con[cid].recv_length == 0)
+                {
+                     //WIZ_DBG("recv cid: %d, count : %d, len : %d",cid, count, len);
+                    _con[cid].received = true;
+                    _state.mode = MODE_COMMAND;
+                }
+                break;
+            }
+            break;
+    }
+}
+
+
+#define MSG_TABLE_NUM 6
+#define RES_TABLE_NUM 7
+int WizFi250::parseMessage () {
+    int i;
+    char buf[128];
+
+    static const struct MSG_TABLE {
+        const char msg[24];
+        void (WizFi250::*func)(const char *);
+    } msg_table[MSG_TABLE_NUM] = {
+        {"[OK]",                    &WizFi250::msgOk},
+        {"[ERROR]",                 &WizFi250::msgError},
+        {"[ERROR:INVALIDINPUT]",    &WizFi250::msgError},
+        {"[CONNECT ",               &WizFi250::msgConnect},
+        {"[DISCONNECT ",            &WizFi250::msgDisconnect},
+        {"[LISTEN ",                &WizFi250::msgListen},
+    };
+    static const struct RES_TABLE{
+        const Response res;
+        void (WizFi250::*func)(const char *);
+    }res_table[RES_TABLE_NUM]={
+        {RES_NULL,          NULL},
+        {RES_MACADDRESS,    &WizFi250::resMacAddress},
+//      {RES_WJOIN,         &WizFi250::resWJOIN},
+        {RES_CONNECT,       &WizFi250::resConnect},
+        {RES_SSEND,         &WizFi250::resSSEND},
+        {RES_FDNS,          &WizFi250::resFDNS},
+        {RES_SMGMT,         &WizFi250::resSMGMT},
+        {RES_WSTATUS,       &WizFi250::resWSTATUS},
+    };
+
+
+    for( i=0; i<sizeof(buf); i++ )
+    {
+        if( _state.buf->dequeue(&buf[i]) == false ) break;
+    }
+
+    buf[i] = '\0';
+    //strncpy(_state.dbgRespBuf, buf, sizeof(buf) );
+    //WIZ_DBG("%s\r\n",_state.dbgRespBuf);
+
+    if(_state.res != RES_NULL)
+    {
+        for( i=0; i<RES_TABLE_NUM; i++)
+        {
+            if(res_table[i].res == _state.res)
+            {
+                //WIZ_DBG("parse res %d '%s'\r\n", i, buf);
+                if(res_table[i].func != NULL)
+                {
+                    (this->*(res_table[i].func))(buf);
+                }
+
+                if(res_table[i].res == RES_CONNECT && _state.n < 2)
+                    return -1;
+            }
+        }
+    }
+
+    for( i=0; i<MSG_TABLE_NUM; i++)
+    {
+        if( strncmp(buf, msg_table[i].msg, strlen(msg_table[i].msg)) == 0 )
+        {
+            //WIZ_DBG("parse msg '%s'\r\n", buf);
+            if(msg_table[i].func != NULL)
+            {
+                (this->*(msg_table[i].func))(buf);
+            }
+            return 0;
+        }
+    }
+
+    return -1;
+}
+
+
+void WizFi250::msgOk (const char *buf)
+{
+    _state.ok = true;
+}
+
+void WizFi250::msgError (const char *buf)
+{
+    _state.failure = true;
+}
+
+void WizFi250::msgConnect (const char *buf)
+{
+    int cid;
+
+    if (buf[9] < '0' || buf[9] > '8' || buf[10] != ']') return;
+
+    cid = x2i(buf[9]);
+
+    initCon(cid, true);
+    _state.cid = cid;
+    _con[cid].accept = true;
+    _con[cid].parent = cid;
+}
+
+void WizFi250::msgDisconnect (const char *buf)
+{
+    int cid;
+
+    if(buf[12] < '0' || buf[12] > '8' || buf[13] != ']')    return;
+
+    cid = x2i(buf[12]);
+    _con[cid].connected = false;
+}
+
+void WizFi250::msgListen (const char *buf)
+{
+    int cid;
+
+    if(buf[8] < '0' || buf[8] > '8' || buf[9] != ']')   return;
+
+    cid = x2i(buf[8]);
+    _state.cid = cid;
+}
+
+void WizFi250::resMacAddress (const char *buf)
+{
+    if( buf[2] == ':' && buf[5] == ':')
+    {
+        strncpy(_state.mac, buf, sizeof(_state.mac));
+        _state.mac[17] = 0;
+        _state.res = RES_NULL;
+
+        if(strncmp(_state.mac,CFG_DEFAULT_MAC,sizeof(CFG_DEFAULT_MAC)) == 0)
+            _state.ok = false;
+        _state.ok = true;
+    }
+}
+
+void WizFi250::resConnect (const char *buf)
+{
+    int cid;
+
+    if (buf[0] == '[' && buf[1] == 'O' && buf[2] == 'K' && buf[3] == ']')
+    {
+        _state.n++;
+    }
+    else if( buf[0] == '[' && buf[1] == 'C' && buf[2] == 'O' && buf[3] == 'N' &&
+              buf[4] == 'N' && buf[5] == 'E' && buf[6] == 'C' && buf[7] == 'T')
+    {
+        cid = x2i(buf[9]);
+        _state.cid = cid;
+        _state.n++;
+    }
+
+    if(_state.n >= 2)
+    {
+        _state.res = RES_NULL;
+        _state.ok = true;
+    }
+}
+
+void WizFi250::resSSEND (const char *buf)
+{
+    if(_state.cid != -1)
+    {
+        _state.res = RES_NULL;
+        _state.ok = true;
+    }
+}
+
+void WizFi250::resFDNS (const char *buf)
+{
+    int i;
+
+    for(i=0; i<strlen(buf); i++)
+    {
+        if( (buf[i] < '0' || buf[i] > '9') && buf[i] != '.' )
+        {
+            return;
+        }
+    }
+
+    strncpy(_state.resolv, buf, sizeof(_state.resolv));
+    _state.res = RES_NULL;
+}
+
+void WizFi250::resSMGMT (const char *buf)
+{
+    int cid, i;
+    char *c;
+
+    if( (buf[0] < '0' || buf[0] > '8') )    return;
+
+    cid = x2i(buf[0]);
+    if( cid != _state.cid )                 return;
+
+    // IP
+    c = (char*)(buf+6);
+    for( i=0; i<16; i++ )
+    {
+        if( *(c+i) == ':')
+        {
+            _con[cid].ip[i] = '\0';
+            i++;
+            break;
+        }
+        if( ( *(c+i) < '0' || *(c+i) > '9') && *(c+i) != '.' )  return;
+        _con[cid].ip[i] = *(c+i);
+    }
+
+    // Port
+    c = (c+i);
+    _con[cid].port = 0;
+    for( i=0; i<5; i++ )
+    {
+        if( *(c+i) == '/')                  break;
+        if( *(c+i) < '0' || *(c+i) > '9' )  return;
+
+        _con[cid].port = (_con[cid].port * 10) + ( *(c+i) - '0' );
+    }
+
+    _state.res = RES_NULL;
+}
+
+void WizFi250::resWSTATUS (const char *buf)
+{
+    int idx=0,sep_cnt=0;
+    int ip_idx=0,gw_idx=0;
+
+    if(_state.n == 0)
+    {
+        _state.n++;
+    }
+    else if(_state.n == 1)
+    {
+        for(idx=0;buf[idx]!='\r';idx++)
+        {
+            if(buf[idx] =='/')
+            {
+                sep_cnt++;
+                continue;
+            }
+
+            if( sep_cnt == 2)    // IP Address
+            {
+                _state.ip[ip_idx++] = buf[idx];
+            }
+            else if(sep_cnt == 3)
+            {
+                _state.gateway[gw_idx++] = buf[idx];
+            }
+        }
+        _state.ip[ip_idx] = '\0';
+        _state.gateway[gw_idx] = '\0';
+        _state.res = RES_NULL;
+    }
+}
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250_sock.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_sock.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,243 @@
+/*
+/* Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+#include "WizFi250.h"
+
+
+int WizFi250::getHostByName(const char * host, char *ip)
+{
+    int i, flg = 0;
+
+    if(!isAssociated() || _state.status != STAT_READY)  return -1;
+
+    for(i=0; i<strlen(host); i++)
+    {
+        if( (host[i] < '0' || host[i] > '9') && host[i] != '.')
+        {
+            flg = 1;
+            break;
+        }
+    }
+    if (!flg)
+    {
+        strncpy(ip, host, 16);
+        return 0;
+    }
+
+    if ( cmdFDNS(host) )
+    {
+        wait_ms(1000);
+        if( cmdFDNS(host) ) return -1;
+    }
+    strncpy(ip, _state.resolv, 16);
+    return 0;
+}
+
+int WizFi250::open(Protocol proto, const char *ip, int remotePort, int localPort, void(*func)(int))
+{
+    int cid;
+
+    if (!isAssociated() || _state.status != STAT_READY)     return -1;
+
+    _state.cid = -1;
+
+    if (proto == PROTO_TCP)
+    {
+        if( cmdSCON( "O","TCN",ip, remotePort, localPort, "0" ) )   return -1;
+    }
+    else if(proto == PROTO_UDP)
+    {
+        if( cmdSCON( "O","UCN",ip, remotePort, localPort, "0" ) )   return -1;
+    }
+    if(_state.cid < 0) return -1;
+
+    initCon(_state.cid, true);
+    cid = _state.cid;
+    _con[cid].protocol = proto;
+    _con[cid].type = TYPE_CLIENT;
+    _con[cid].func = func;
+    return cid;
+}
+
+int WizFi250::listen (Protocol proto, int port, void(*func)(int))
+{
+    int cid;
+
+    if(!isAssociated() || _state.status != STAT_READY)  return -1;
+
+    _state.cid = -1;
+
+    if(proto == PROTO_TCP)
+    {
+        if( sendCommand("AT+MEVTMSG=1") )   return -1;
+        if( cmdSCON("O","TSN",port) )       return -1;
+    }
+    else
+    {
+        if( cmdSCON("O","USN",port) )   return -1;
+    }
+
+    if (_state.cid < 0) return -1;
+    cid = _state.cid;
+    _con[cid].protocol = proto;
+    _con[cid].type = TYPE_SERVER;
+    _con[cid].func = func;
+
+    return cid;
+}
+
+int WizFi250::close (int cid)
+{
+//    if(!isConnected(cid))   return -1;
+
+    _con[cid].connected = false;
+    return cmdCLOSE(cid);
+}
+
+
+void WizFi250::initCon ( int cid, bool connected )
+{
+    _con[cid].parent = -1;      // It will be delete because It is not need
+    _con[cid].func = NULL;
+    _con[cid].accept = false;
+
+//#ifndef CFG_ENABLE_RTOS
+    if ( _con[cid].buf == NULL )
+    {
+        _con[cid].buf = new CircBuffer<char>(CFG_DATA_SIZE);
+        if ( _con[cid].buf == NULL )    error("Can't allocate memory");
+    }
+//#endif
+    if ( _con[cid].buf != NULL )
+    {
+        _con[cid].buf->flush();
+    }
+    _con[cid].connected = connected;
+}
+
+int WizFi250::send(int cid, const char *buf, int len)
+{
+    if(!isConnected(cid)) return -1;
+
+    if((_con[cid].protocol == PROTO_TCP) ||
+            (_con[cid].protocol == PROTO_UDP && _con[cid].type == TYPE_CLIENT) )
+    {
+//        if ( len > CFG_DATA_SIZE)   len = CFG_DATA_SIZE;
+        return cmdSSEND(buf,cid,len);
+    }
+    else
+    {
+        return -1;
+    }
+}
+
+int WizFi250::sendto (int cid, const char *buf, int len, const char *ip, int port)
+{
+    if(!isConnected(cid))   return -1;
+
+    if((_con[cid].protocol == PROTO_UDP && _con[cid].type == TYPE_SERVER))
+    {
+        if ( len > CFG_DATA_SIZE )  len = CFG_DATA_SIZE;
+        return cmdSSEND(buf,cid,len,ip,port);
+    }
+    else
+    {
+        return -1;
+    }
+}
+
+int WizFi250::recv (int cid, char *buf, int len)
+{
+    int i;
+
+    if (!isConnected(cid))  return -1;
+
+    if (_con[cid].buf == NULL ) return 0;
+    while (!_con[cid].received && _state.mode != MODE_COMMAND);
+    _con[cid].received = false;
+    for(i=0; i<len; i++)
+    {
+        if(_con[cid].buf->dequeue(&buf[i]) == false)    break;
+    }
+    setRts(true);       // release
+    return i;
+}
+
+int WizFi250::recvfrom (int cid, char *buf, int len, char *ip, int *port)
+{
+    int i;
+
+    if (!isConnected(cid))  return -1;
+
+    if (_con[cid].buf == NULL)  return 0;
+
+    while (!_con[cid].received && _state.mode != MODE_COMMAND);
+
+    _con[cid].received = false;
+    for(i=0; i<len; i++)
+    {
+        if( _con[cid].buf->dequeue(&buf[i]) == false )  break;
+    }
+    //buf[i] = '\0';
+    strncpy(ip, _con[cid].ip, 16);
+    *port = _con[cid].port;
+    setRts(true);       // release
+
+    return i;
+}
+
+int WizFi250::readable (int cid)
+{
+    if (!isConnected(cid))  return -1;
+
+    if(_con[cid].buf == NULL)   return -1;
+    return _con[cid].buf->available();
+}
+
+bool WizFi250::isConnected (int cid)
+{
+    if ( cid < 0 || cid >=8 ) return false;
+
+    return _con[cid].connected;
+}
+
+int WizFi250::accept (int cid)
+{
+    if(!isConnected(cid))   return -1;
+
+    if(_con[cid].connected && _con[cid].accept)
+    {
+        _con[cid].accept = false;
+        return cid;
+    }
+
+    return -1;
+}
+
+int WizFi250::getRemote(int cid, char **ip, int *port)
+{
+    if (!isConnected(cid))  return -1;
+
+    *ip = _con[cid].ip;
+    *port = _con[cid].port;
+    return 0;
+}
diff -r 000000000000 -r e3dc9e54a15b WizFi250/WizFi250_util.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250/WizFi250_util.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2013 gsfan, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/* Copyright (C) 2014 Wiznet, MIT License
+ *  port to the Wiznet Module WizFi250
+ */
+
+#include "WizFi250.h"
+
+int WizFi250::x2i(char c)
+{
+    if ( c >= '0' && c <= '9')
+    {
+        return c - '0';
+    }
+    else if ( c >= 'A' && c <= 'F')
+    {
+        return c - 'A' + 10;
+    }
+    else if ( c >= 'a' && c <= 'f')
+    {
+        return c - 'a' + 10;
+    }
+
+    return 0;
+}
+
+int WizFi250::i2x(int i)
+{
+    if ( i >= 0 && i <= 9 )
+    {
+        return i + '0';
+    }
+    else if ( i >= 10 && i <= 15 )
+    {
+        return i - 10 + 'A';
+    }
+
+    return 0;
+}
diff -r 000000000000 -r e3dc9e54a15b WizFi250Interface.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250Interface.cpp	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,214 @@
+/* WizFi250 implementation of NetworkInterfaceAPI
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+
+#include "WizFi250Interface.h"
+
+// Various timeouts for different WizFi250 operations
+#define WizFi250_CONNECT_TIMEOUT 15000
+#define WizFi250_SEND_TIMEOUT    500
+#define WizFi250_RECV_TIMEOUT    0
+#define WizFi250_MISC_TIMEOUT    500
+
+#define WizFi250_DELAY_MS       300
+
+
+// WizFi250Interface implementation
+WizFi250Interface::WizFi250Interface(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm,  int baud)
+    : _wizfi250(tx, rx, cts, rts, reset, alarm, baud)
+{
+    memset(_ids, 0, sizeof(_ids));
+}
+
+int WizFi250Interface::connect(
+    const char *ssid,
+    const char *pass,
+    nsapi_security_t security)
+{
+    if (!_wizfi250.startup()) 
+    {
+        return NSAPI_ERROR_DEVICE_ERROR;
+    }
+
+    _wizfi250.setSsid(ssid);
+    _wizfi250.setSec(WizFi250::SEC_AUTO, pass);
+    _wizfi250.setAddress("");
+    
+    if( _wizfi250.join(WizFi250::WM_STATION) == -1)
+    {
+        return NSAPI_ERROR_NO_CONNECTION;
+    }
+
+    return 0;
+}
+
+int WizFi250Interface::disconnect()
+{
+    if ( _wizfi250.cmdWLEAVE() == -1 )  return NSAPI_ERROR_DEVICE_ERROR;
+
+    return 0;
+}
+
+const char *WizFi250Interface::get_ip_address()
+{
+    return _wizfi250.getIPAddress();
+}
+
+const char *WizFi250Interface::get_mac_address()
+{
+    return _wizfi250.getMACAddress();
+}
+
+struct wizfi250_socket {
+    int id;
+    nsapi_protocol_t proto;
+    bool connected;
+};
+
+int WizFi250Interface::socket_open(void **handle, nsapi_protocol_t proto)
+{
+    // Look for an unused socket
+
+    /*
+    int id = -1;
+ 
+    for (int i = 0; i < WIZFI250_SOCKET_COUNT; i++) {
+        if (_ids[i] == false) {
+            id = i;
+            _ids[i] = true;
+            break;
+        }
+    }
+ 
+    if (id == -1) {
+        return NSAPI_ERROR_NO_SOCKET;
+    }
+    */
+    
+    struct wizfi250_socket *socket = new struct wizfi250_socket;
+    if (!socket) {
+        return NSAPI_ERROR_NO_SOCKET;
+    }
+    
+    socket->id = -1;
+    socket->proto = proto;
+    socket->connected = false;
+    *handle = socket;
+    return 0;
+}
+
+int WizFi250Interface::socket_close(void *handle)
+{
+    struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
+    int err = 0;
+ 
+    if(socket->id == -1){
+        err = NSAPI_ERROR_NO_SOCKET;
+    }
+    else if (_wizfi250.close(socket->id) == -1) {
+        err = NSAPI_ERROR_DEVICE_ERROR;
+    }
+
+    _ids[socket->id] = false;
+    wait_ms(WizFi250_DELAY_MS);
+    delete socket;
+    return err;
+}
+
+int WizFi250Interface::socket_bind(void *handle, const SocketAddress &address)
+{
+    return NSAPI_ERROR_UNSUPPORTED;
+}
+
+int WizFi250Interface::socket_listen(void *handle, int backlog)
+{
+    return NSAPI_ERROR_UNSUPPORTED;
+}
+
+int WizFi250Interface::socket_connect(void *handle, const SocketAddress &addr)
+{
+    int cid=-1;
+    struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
+
+    WizFi250::Protocol proto = (socket->proto == NSAPI_UDP) ? WizFi250::PROTO_UDP : WizFi250::PROTO_TCP;
+    if((cid = _wizfi250.open(proto, addr.get_ip_address(), addr.get_port())) == -1 )
+    {
+        return NSAPI_ERROR_DEVICE_ERROR;
+    }
+
+    if(cid >= WIZFI250_SOCKET_COUNT)
+    {
+        return NSAPI_ERROR_NO_SOCKET;
+    }
+    
+    _ids[cid] = true;
+    socket->id = cid;
+    socket->connected = true;
+    wait_ms(WizFi250_DELAY_MS);
+    return 0;
+}
+    
+int WizFi250Interface::socket_accept(void **handle, void *server)
+{
+    return NSAPI_ERROR_UNSUPPORTED;
+}
+
+int WizFi250Interface::socket_send(void *handle, const void *data, unsigned size)
+{
+    struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
+ 
+    if ( _wizfi250.send(socket->id, (const char*)data, size) == -1 ) {
+        return NSAPI_ERROR_DEVICE_ERROR;
+    }
+ 
+    return size;
+}
+
+int WizFi250Interface::socket_recv(void *handle, void *data, unsigned size)
+{
+    struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
+ 
+    int32_t recv = _wizfi250.recv(socket->id, (char*)data, size);
+    if (recv < 0) {
+        return NSAPI_ERROR_WOULD_BLOCK;
+    }
+ 
+    return recv;
+}
+
+int WizFi250Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
+{
+    struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;
+    if (!socket->connected) {
+        int err = socket_connect(socket, addr);
+        if (err < 0) {
+            return err;
+        }
+    }
+    
+    return socket_send(socket, data, size);
+}
+
+int WizFi250Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
+{
+    struct wizfi250_socket *socket = (struct wizfi250_socket *)handle;    
+    return socket_recv(socket, data, size);
+}
+
+void WizFi250Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
+{
+}
+
diff -r 000000000000 -r e3dc9e54a15b WizFi250Interface.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WizFi250Interface.h	Tue Aug 30 00:05:24 2016 +0000
@@ -0,0 +1,158 @@
+/* WizFi250 implementation of NetworkInterfaceAPI
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef WIZFI250_INTERFACE_H
+#define WIZFI250_INTERFACE_H
+
+#include "WiFiInterface.h"
+#include "WizFi250.h"
+
+#define WIZFI250_SOCKET_COUNT 8
+
+/** WizFi250Interface class
+ *  Implementation of the NetworkStack for the WizFi250
+ */
+class WizFi250Interface : public NetworkStack, public WiFiInterface
+{
+public:
+    WizFi250Interface(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud=115200 );
+
+    virtual int connect(
+        const char *ssid,
+        const char *pass,
+        nsapi_security_t security = NSAPI_SECURITY_NONE);
+
+    /** Stop the interface
+     *  @return             0 on success, negative on failure
+     */
+    virtual int disconnect();
+
+    /** Get the internally stored IP address
+     *  @return             IP address of the interface or null if not yet connected
+     */
+    virtual const char *get_ip_address();
+
+    /** Get the internally stored MAC address
+     *  @return             MAC address of the interface
+     */
+    virtual const char *get_mac_address();
+
+protected:
+    /** Open a socket
+     *  @param handle       Handle in which to store new socket
+     *  @param proto        Type of socket to open, NSAPI_TCP or NSAPI_UDP
+     *  @return             0 on success, negative on failure
+     */
+    virtual int socket_open(void **handle, nsapi_protocol_t proto);
+
+    /** Close the socket
+     *  @param handle       Socket handle
+     *  @return             0 on success, negative on failure
+     *  @note On failure, any memory associated with the socket must still 
+     *        be cleaned up
+     */
+    virtual int socket_close(void *handle);
+
+    /** Bind a server socket to a specific port
+     *  @param handle       Socket handle
+     *  @param address      Local address to listen for incoming connections on 
+     *  @return             0 on success, negative on failure.
+     */
+    virtual int socket_bind(void *handle, const SocketAddress &address);
+
+    /** Start listening for incoming connections
+     *  @param handle       Socket handle
+     *  @param backlog      Number of pending connections that can be queued up at any
+     *                      one time [Default: 1]
+     *  @return             0 on success, negative on failure
+     */
+    virtual int socket_listen(void *handle, int backlog);
+
+    /** Connects this TCP socket to the server
+     *  @param handle       Socket handle
+     *  @param address      SocketAddress to connect to
+     *  @return             0 on success, negative on failure
+     */
+    virtual int socket_connect(void *handle, const SocketAddress &address);
+
+    /** Accept a new connection.
+     *  @param handle       Handle in which to store new socket
+     *  @param server       Socket handle to server to accept from
+     *  @return             0 on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_accept(void **handle, void *server);
+
+    /** Send data to the remote host
+     *  @param handle       Socket handle
+     *  @param data         The buffer to send to the host
+     *  @param size         The length of the buffer to send
+     *  @return             Number of written bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_send(void *handle, const void *data, unsigned size);
+
+    /** Receive data from the remote host
+     *  @param handle       Socket handle
+     *  @param data         The buffer in which to store the data received from the host
+     *  @param size         The maximum length of the buffer
+     *  @return             Number of received bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_recv(void *handle, void *data, unsigned size);
+
+    /** Send a packet to a remote endpoint
+     *  @param handle       Socket handle
+     *  @param address      The remote SocketAddress
+     *  @param data         The packet to be sent
+     *  @param size         The length of the packet to be sent
+     *  @return             The number of written bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size);
+
+    /** Receive a packet from a remote endpoint
+     *  @param handle       Socket handle
+     *  @param address      Destination for the remote SocketAddress or null
+     *  @param buffer       The buffer for storing the incoming packet data
+     *                      If a packet is too long to fit in the supplied buffer,
+     *                      excess bytes are discarded
+     *  @param size         The length of the buffer
+     *  @return             The number of received bytes on success, negative on failure
+     *  @note This call is not-blocking, if this call would block, must
+     *        immediately return NSAPI_ERROR_WOULD_WAIT
+     */
+    virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size);
+
+    /** Register a callback on state change of the socket
+     *  @param handle       Socket handle
+     *  @param callback     Function to call on state change
+     *  @param data         Argument to pass to callback
+     *  @note Callback may be called in an interrupt context.
+     */
+    virtual void socket_attach(void *handle, void (*callback)(void *), void *data);
+
+private:
+    WizFi250 _wizfi250;
+    bool _ids[WIZFI250_SOCKET_COUNT];
+};
+
+#endif
+