Murata RF modules are designed to simplify wireless development and certification by minimizing the amount of RF expertise you need to wirelessly enable a wide range of applications.

MuRata.cpp

Committer:
yangcq88517
Date:
2016-03-16
Revision:
9:0ce800923eda
Parent:
8:5856c23794b1

File content as of revision 9:0ce800923eda:

#include "MuRata.h"

using namespace SmartLabMuRata;

MuRata::MuRata(PinName tx, PinName rx)
    : _SSIDRecordIndication(NULL),_WIFIConnectionIndication(NULL),_TCPStatusIndication(NULL),_SocketReceiveInidcation(NULL),
      _UDPReceivedIndication(NULL),_HTTPResponseIndication(NULL),
      _WIFIStatusResponse(NULL),_InitializationResponse(NULL),_SendFromSocketResponse(NULL),_DHCPInfoResponse(NULL),_SocketStartReceiveResponse(NULL),_CreateSocketResponse(NULL),_HTTPResponse(NULL)
{
    serial = new Serial(tx,rx);
    serial->format();
    serial->baud(DEFAULT_BAUDRATE );
}

MuRata::MuRata(PinName tx, PinName rx, int baudrate ,int bits, Serial::Parity parity, int stop_bits)
    : _SSIDRecordIndication(NULL),_WIFIConnectionIndication(NULL),_TCPStatusIndication(NULL),_SocketReceiveInidcation(NULL),
      _UDPReceivedIndication(NULL),_HTTPResponseIndication(NULL),
      _WIFIStatusResponse(NULL),_InitializationResponse(NULL),_SendFromSocketResponse(NULL),_DHCPInfoResponse(NULL),_SocketStartReceiveResponse(NULL),_CreateSocketResponse(NULL),_HTTPResponse(NULL)
{
    serial = new Serial(tx,rx);
    serial->format(bits, parity, stop_bits);
    serial->baud(baudrate);
}

SSIDRecordIndication * MuRata::Get_ScanResultIndication()
{
    if (FrameReceive())
        if (_payload.GetResponseFlag() == Request_Indication
                && _frame.GetCommandID() == CMD_ID_WIFI
                && _payload.GetSubCommandID() == WIFI_SCAN_RESULT_IND) {
            _SSIDRecordIndication.SetPayload(&_payload);
            return &_SSIDRecordIndication;
        }

    return NULL;
}

WIFIConnectionIndication * MuRata::Get_WiFiStatusIndication()
{
    if (FrameReceive())
        if (_payload.GetResponseFlag() == Request_Indication
                && _frame.GetCommandID() == CMD_ID_WIFI
                && _payload.GetSubCommandID() == WIFI_NETWORK_STATUS_IND) {
            _WIFIConnectionIndication.SetPayload(&_payload);
            return &_WIFIConnectionIndication;
        }

    return NULL;
}

ResetCode MuRata::Get_PowerUpIndication()
{
    if (FrameReceive())
        if (_payload.GetResponseFlag() == Request_Indication
                && _frame.GetCommandID() == CMD_ID_GEN
                && _payload.GetSubCommandID() == GEN_PWR_UP_IND)
            return (ResetCode)(_payload.GetData()[2] << 8 | _payload.GetData()[3]);

    return N0_Indication;
}

TCPStatusIndication * MuRata::Get_TcpConnectionStatusIndication()
{
    if (FrameReceive())
        if (_payload.GetResponseFlag() == Request_Indication
                && _frame.GetCommandID() == CMD_ID_SNIC
                && _payload.GetSubCommandID() == SNIC_TCP_CONNECTION_STATUS_IND) {
            _TCPStatusIndication.SetPayload(&_payload);
            return &_TCPStatusIndication;
        }

    return NULL;
}

SocketReceiveInidcation * MuRata::Get_SocketReceiveIndication()
{
    if (FrameReceive())
        if (_payload.GetResponseFlag() == Request_Indication
                && _frame.GetCommandID() == CMD_ID_SNIC
                && _payload.GetSubCommandID() == SNIC_CONNECTION_RECV_IND) {
            _SocketReceiveInidcation.SetPayload(&_payload);
            return &_SocketReceiveInidcation;
        }

    return NULL;
}

UDPReceivedIndication * MuRata::Get_UDPReceiveIndication()
{
    if (FrameReceive())
        if (_payload.GetResponseFlag() == Request_Indication
                && _frame.GetCommandID() == CMD_ID_SNIC
                && _payload.GetSubCommandID() == SNIC_UDP_RECV_IND) {
            _UDPReceivedIndication.SetPayload(&_payload);
            return &_UDPReceivedIndication;
        }

    return NULL;
}

HTTPResponseIndication * MuRata::Get_HTTPResponseIndication()
{
    if (FrameReceive())
        if (_payload.GetResponseFlag() == Request_Indication
                && _frame.GetCommandID() == CMD_ID_SNIC
                && _payload.GetSubCommandID() == SNIC_HTTP_RSP_IND) {
            _HTTPResponseIndication.SetPayload(&_payload);
            return &_HTTPResponseIndication;
        }

    return NULL;
}

void MuRata::Send()
{
    _frame.SetACKRequired(false);
    _payload.SetResponseFlag(Request_Indication);
    serial->putc(UARTFrame::SOM);

    serial->putc(_frame.GetL0() | 0x80);
    serial->putc(_frame.GetL1() | 0x80 | (_frame.GetACKRequired() ? 0x40 : 0x00));

    serial->putc(_frame.GetCommandID() | 0x80);

    for (int i = 0; i < _payload.GetPosition(); i++)
        serial->putc(_payload.GetData()[i]);

    serial->putc(_frame.GetChecksum() | 0x80);

    serial->putc(UARTFrame::EOM);
}

bool MuRata::FrameReceive()
{
    timer.reset();
    timer.start();

    while (serial->readable() <= 0) {
        if (timer.read_ms() > 1000) {
            timer.stop();
            return false;
        }
    }
    timer.stop();

    int value = serial->getc();
    while (value != UARTFrame::SOM)
        value = serial->getc();

    _frame.SetL0(serial->getc());
    _frame.SetL1(serial->getc());

    _frame.SetCommandID(serial->getc());

    int _size = _frame.GetPayloadLength();

    _payload.Allocate(_size);
    while (_payload.GetPosition() < _size)
        _payload.SetContent(serial->getc());

    _frame.SetChecksum(serial->getc());

    if (serial->getc() == UARTFrame::EOM && _frame.VerifyChecksum())
        return true;
    else return false;
}

const char * MuRata::GEN_GetFirmwareVersionInfo()
{
    _payload.Rewind();
    _payload.SetSubCommandID(GEN_FW_VER_GET_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _frame.SetCommandID(CMD_ID_GEN);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive()) {
        if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_FW_VER_GET_REQ) {
            if (_payload.GetData()[2] == GEN_SUCCESS) {
                // set the null for the string
                _payload.GetData()[4 + _payload.GetData()[3]] = 0x00;
                return _payload.GetData() + 4;
            }
        }
    }
    return NULL;
}

CMDCode MuRata::GEN_RestoreNVMtoFactoryDefault()
{
    _payload.Rewind();
    _payload.SetSubCommandID(GEN_RESTORE_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _frame.SetCommandID(CMD_ID_GEN);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_RESTORE_REQ)
            return (CMDCode)_payload.GetData()[2];

    return GEN_NORESPONSE;
}

CMDCode MuRata::GEN_SoftReset()
{
    _payload.Rewind();
    _payload.SetSubCommandID(GEN_RESET_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _frame.SetCommandID(CMD_ID_GEN);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_RESET_REQ)
            return (CMDCode)_payload.GetData()[2];

    return GEN_NORESPONSE;
}

CMDCode MuRata::GEN_UARTConfiguration(UARTConfig * config)
{
    _payload.Rewind();
    _payload.SetSubCommandID(GEN_UART_CFG_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(config->GetValue(), 0, 6);

    _frame.SetCommandID(CMD_ID_GEN);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_GEN && _payload.GetSubCommandID() == GEN_UART_CFG_REQ)
            return (CMDCode)_payload.GetData()[2];

    return GEN_NORESPONSE;
}


WIFICode MuRata::WIFI_TurnOn()
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_ON_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    /*
     * Country code is a 2-character ASCII string. E.g., “US” = the United States. For the complete list, see Appendix A. The default country code is “US”, which is one of the startup parameters in NVM. If the WIFI_ON_REQ has no intention of changing the country code, put 0x0000 in the two-byte Country code, so that the firmware will use the country code configured in NVM.
     */
    _payload.SetContent(0x00);
    _payload.SetContent(0x00);

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_ON_REQ)
            return (WIFICode)_payload.GetData()[2];

    return WIFI_NORESPONSE;
}

WIFICode MuRata::WIFI_TurnOff()
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_OFF_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_OFF_REQ)
            return (WIFICode)_payload.GetData()[2];

    return WIFI_NORESPONSE;
}

/*
 * Parameters are as follows:
 * UINT8 Request Sequence
 * UINT8 Onoff
 * UINT8 Persistency
 * UINT8 SSID [up to 33]
 * UINT8 Channel
 * UINT8 Security mode
 * UINT8 Security key length (0-64)
 * … Security key [ ]
 * OnOff = 0 indicates AP is to be turned off. The rest of the parameters are ignored.
 * OnOff = 1 indicates turning on soft AP using existing NVM parameters,
 * OnOff = 2 indicates turning on AP with the parameters provided. If the soft AP is already on, it is first turned off.
 * Persistency=1 indicates the soft AP’s on/off state and parameters (if OnOff = 2) will be saved in NVM. For example, if OnOff =0 and Persistency=1, the soft AP will not be turned on after a reset.
 */
WIFICode MuRata::WIFI_SoftAPControl(SoftAPConfig * config)
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_AP_CTRL_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _payload.SetContent(config->GetOnOffStatus());
    _payload.SetContent(config->GetPersistency());
    if (config->GetOnOffStatus() == SoftAPConfig::ON_PARAMETERS) {
        const char * ssid = config->GetSSID();
        int length = strlen(ssid);
        _payload.SetContent(ssid, 0 , length);
        _payload.SetContent(0x00);
    }
    _payload.SetContent(config->GetChannel());
    _payload.SetContent(config->GetSecurityMode());

    const char * key = config->GetSecurityKey();
    int keyLength = 0;
    if (key != NULL)
        keyLength = strlen(key);

    _payload.SetContent(keyLength);
    if (config->GetSecurityMode() != WIFI_SECURITY_OPEN && keyLength > 0)
        _payload.SetContent(key, 0 , keyLength);

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_AP_CTRL_REQ)
            return (WIFICode)_payload.GetData()[2];

    return WIFI_NORESPONSE;
}

WIFICode MuRata::WIFI_AssociateNetwork(WIFINetwork * AP)
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_JOIN_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(AP->GetSSID(), 0, strlen(AP->GetSSID()));
    _payload.SetContent(0x00);

    _payload.SetContent(AP->GetSecurityMode());

    int keyLength = strlen(AP->GetSecurityKey());
    _payload.SetContent(keyLength);
    if (keyLength > 0)
        _payload.SetContent(AP->GetSecurityKey(), 0, keyLength);

    if (AP->GetBSSID() != NULL) {
        _payload.SetContent(AP->GetChannel());
        _payload.SetContent(AP->GetBSSID(), 0, 6);
    }

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_JOIN_REQ)
            return (WIFICode)_payload.GetData()[2];

    return WIFI_NORESPONSE;
}

WIFICode MuRata::WIFI_DisconnectNetwork()
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_DISCONNECT_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_DISCONNECT_REQ)
            return (WIFICode)_payload.GetData()[2];

    return WIFI_NORESPONSE;
}
WIFIStatusResponse * MuRata::WIFI_GetStatus(const WIFIInterface WiFiInterface)
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_GET_STATUS_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(WiFiInterface);

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STATUS_REQ) {
            _WIFIStatusResponse.SetPayload(&_payload);
            return &_WIFIStatusResponse;
        }

    return NULL;
}

int8_t MuRata::WIFI_GetRSSI()
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_GET_STA_RSSI_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_GET_STA_RSSI_REQ)
            return _payload.GetData()[2];

    return 127;
}

WIFICode MuRata::WIFI_StartWPSProcess(const WPSMode mode, const char * pin, int pinLength)
{
    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_WPS_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(mode);

    if (mode == Pin) {
        if (Pin == NULL)
            return WIFI_NORESPONSE;

        _payload.SetContent(pin, 0 , pinLength);
        _payload.SetContent(0x00);
    }

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_WPS_REQ)
            return (WIFICode)_payload.GetData()[2];

    return WIFI_NORESPONSE;
}

WIFICode MuRata::WIFI_ScanNetworks(const ScanType scan, const BSSType bss)
{
    /*
     * This command instructs the module to scan available networks. Parameters are as follows:
     * UINT8 Request Sequence
     * UINT8 Scan Type
     * UINT8 BSS Type
     * UINT8 BSSID [6]
     * UINT8 Channel list []
     * UINT8 SSID[]
     * BSSID, Channel List, and SSID are optional fields. All 0’s for BSSID, Channel list or SSID indicates it is not present.
     * - Scan Type: 0 = Active scan, 1= Passive scan
     * - BSS Type: 0 = Infrastructure, 1 = ad hoc, 2 = any
     * - BSSID: 6 bytes MAC address of the AP or STA. 6 bytes of 0’s indicates it is not present.
     * - Channel list: 0 terminated array, up to 10 array elements.
     * - SSID: 0 terminated string for the AP or STA SSID, up to 33 bytes including NUL-termination.
     */

    _payload.Rewind();
    _payload.SetSubCommandID(WIFI_SCAN_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(scan);
    _payload.SetContent(bss);

    for (int i = 0; i < 8; i++)
        _payload.SetContent(0x00);

    _frame.SetCommandID(CMD_ID_WIFI);
    _frame.SetPayload(&_payload);

    Send();

    if (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_SCAN_REQ)
            return (WIFICode)_payload.GetData()[2];

    return WIFI_NORESPONSE;
}

InitializationResponse * MuRata::SNIC_Initialization(int receiveBufferSize)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_INIT_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(receiveBufferSize >> 8);
    _payload.SetContent(receiveBufferSize);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_INIT_REQ) {
            _InitializationResponse.SetPayload(&_payload);
            return &_InitializationResponse;
        }

    return NULL;
}

SNICCode MuRata::SNIC_Cleanup()
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_CLEANUP_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_CLEANUP_REQ)
            return (SNICCode)_payload.GetData()[2];

    return SNIC_NORESPONSE;

}


SendFromSocketResponse * MuRata::SNIC_SendFromSocket(const char SocketID, const SocketSentOption option, const char * payload, int offset, int length)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_SEND_FROM_SOCKET_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(SocketID);
    _payload.SetContent(option);
    _payload.SetContent(length >> 8);
    _payload.SetContent(length);
    _payload.SetContent(payload, offset, length);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_SEND_FROM_SOCKET_REQ) {
            _SendFromSocketResponse.SetPayload(&_payload);
            return &_SendFromSocketResponse;
        }

    return NULL;
}

SNICCode MuRata::SNIC_SloseSocket(const char SocketID)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_CLOSE_SOCKET_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(SocketID);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_CLOSE_SOCKET_REQ)
            return (SNICCode)_payload.GetData()[2];

    return SNIC_NORESPONSE;
}

DHCPInfoResponse * MuRata::SNIC_GetDHCPInfo(const WIFIInterface wifiInterface)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_GET_DHCP_INFO_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(wifiInterface);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_GET_DHCP_INFO_REQ) {
            _DHCPInfoResponse.SetPayload(&_payload);
            return &_DHCPInfoResponse;
        }

    return NULL;
}

IPAddress * MuRata::SNIC_ResolveHostName(const char * host)
{
    int hostLength = strlen(host);

    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_RESOLVE_NAME_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(STA);
    _payload.SetContent(hostLength);
    _payload.SetContent(host, 0, hostLength);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_RESOLVE_NAME_REQ)
            if ((SNICCode)_payload.GetData()[2] == SNIC_SUCCESS) {
                ip.SetValue(_payload.GetData(), 3);
                return &ip;
            }

    return NULL;
}

SNICCode MuRata::SNIC_ConfigureDHCPorStaticIP(DHCPConfig * config)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_IP_CONFIG_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(config->GetInterface());
    _payload.SetContent(config->GetDHCPMode());

    if (config->GetDHCPMode() != dynamic_IP) {
        _payload.SetContent(config->GetLocalIP()->GetValue(), 0, 4);
        _payload.SetContent(config->GetNetmask()->GetValue(), 0, 4);
        _payload.SetContent(config->GetGatewayIP()->GetValue(), 0, 4);
    }

    if (config->GetDHCPMode() == soft_AP) {
        _payload.SetContent(config->GetIPRangeFirst()->GetValue(), 0, 4);
        _payload.SetContent(config->GetIPRangeLast()->GetValue(), 0, 4);
    }

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_IP_CONFIG_REQ)
            return (SNICCode)_payload.GetData()[2];

    return SNIC_NORESPONSE;
}

SocketStartReceiveResponse * MuRata::SNIC_ConnectTCPServer(const char SocketID, IPAddress * remoteIP, const int remotePort, const char timeout, const int receiveBufferSize)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_TCP_CONNECT_TO_SERVER_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(SocketID);
    _payload.SetContent(remoteIP->GetValue(), 0, 4);
    _payload.SetContent((remotePort >> 8));
    _payload.SetContent(remotePort);
    _payload.SetContent((receiveBufferSize >> 8));
    _payload.SetContent(receiveBufferSize);
    _payload.SetContent(timeout);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_TCP_CONNECT_TO_SERVER_REQ) {
            _SocketStartReceiveResponse.SetPayload(&_payload);
            return &_SocketStartReceiveResponse;
        }

    return NULL;
}

CreateSocketResponse * MuRata::SNIC_CreateTCPSocket(const bool bind, IPAddress * localIP, const int localPort)
{
    return SNIC_CreateSocket(SNIC_TCP_CREATE_SOCKET_REQ, bind, localIP, localPort);
}

CreateSocketResponse * MuRata::SNIC_CreateUDPSocket(const bool bind, IPAddress * localIP, const int localPort)
{
    return SNIC_CreateSocket(SNIC_UDP_CREATE_SOCKET_REQ, bind, localIP, localPort);
}

CreateSocketResponse * MuRata::SNIC_CreateSocket(const SubCommandID subID, const bool bind, IPAddress * localIP, const int localPort)
{
    _payload.Rewind();
    _payload.SetSubCommandID(subID);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(bind ? 0x01 : 0x00);

    if (bind) {
        if (localIP != NULL)
            _payload.SetContent(localIP->GetValue(), 0, 4);
        else {
            _payload.SetContent(0x00);
            _payload.SetContent(0x00);
            _payload.SetContent(0x00);
            _payload.SetContent(0x00);
        }

        _payload.SetContent(localPort >> 8);
        _payload.SetContent(localPort);
    }

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == subID) {
            _CreateSocketResponse.SetPayload(&_payload);
            return &_CreateSocketResponse;
        }

    return NULL;
}

SocketStartReceiveResponse * MuRata::SNIC_StartUDPReceive(const char SocketID, const int receiveBufferSize)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_UDP_START_RECV_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(SocketID);
    _payload.SetContent(receiveBufferSize >> 8);
    _payload.SetContent(receiveBufferSize);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_START_RECV_REQ) {
            _SocketStartReceiveResponse.SetPayload(&_payload);
            return &_SocketStartReceiveResponse;
        }

    return NULL;
}

SendFromSocketResponse * MuRata::SNIC_SendUDPPacket(IPAddress * remoteIP, const int remotePort, const char * payload, int offset, int length)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_UDP_SIMPLE_SEND_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(remoteIP->GetValue(), 0 ,4);
    _payload.SetContent(remotePort >> 8);
    _payload.SetContent(remotePort);
    _payload.SetContent(length >> 8);
    _payload.SetContent(length);
    _payload.SetContent(payload, offset, length);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SIMPLE_SEND_REQ) {
            _SendFromSocketResponse.SetPayload(&_payload);
            return &_SendFromSocketResponse;
        }

    return NULL;
}

SendFromSocketResponse * MuRata::SNIC_SendUDPFromSocket(IPAddress * remoteIP, const int remotePort, const char SocketID, const bool connectServer, const char * payload, int offset, int length)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_UDP_SEND_FROM_SOCKET_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(remoteIP->GetValue(),0, 4);
    _payload.SetContent(remotePort >> 8);
    _payload.SetContent(remotePort);
    _payload.SetContent(SocketID);
    _payload.SetContent(connectServer ? 0x01 : 0x00);
    _payload.SetContent(length >> 8);
    _payload.SetContent(length);
    _payload.SetContent(payload, offset, length);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_UDP_SEND_FROM_SOCKET_REQ) {
            _SendFromSocketResponse.SetPayload(&_payload);
            return &_SendFromSocketResponse;
        }

    return NULL;
}

HTTPResponse * MuRata::SNIC_SendHTTPRequest(HTTPContent * content, const bool isHTTPS, const bool chunked)
{
    SubCommandID _id = (isHTTPS == true) ? SNIC_HTTPS_REQ: SNIC_HTTP_REQ;

    _payload.Rewind();
    _payload.SetSubCommandID(_id);
    _payload.SetFrameID(_payload.GetFrameID() + 1);
    _payload.SetContent(content->GetRemotePort() >> 8);
    _payload.SetContent(content->GetRemotePort());
    _payload.SetContent(content->GetMethod());
    _payload.SetContent(content->GetTimeout());

    _payload.SetContent(content->GetRemoteHost(), 0, strlen(content->GetRemoteHost()));
    _payload.SetContent(0x00);

    _payload.SetContent(content->GetURI(), 0, strlen(content->GetURI()));
    _payload.SetContent(0x00);

    _payload.SetContent(content->GetContentType(), 0, strlen(content->GetContentType()));
    _payload.SetContent(0x00);

    string _others;
    content->GetOtherHeaders(&_others);
    _payload.SetContent(_others.c_str(), 0, _others.length());
    _payload.SetContent(0x00);

    while (content->GetMethod() == POST) {
        int length = content->GetContentLength();

        char msb = length >> 8;
        if (chunked)
            msb |= 0x80;
        else msb &= 0x7F;

        _payload.SetContent(msb);
        _payload.SetContent(length);

        if (length > 0)
            _payload.SetContent(content->GetBody(), 0, length);
    }

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == _id) {
            _HTTPResponse.SetPayload(&_payload);
            return &_HTTPResponse;
        }

    return NULL;
}

HTTPResponse * MuRata::SNIC_SendHTTPMoreRequest(HTTPContent * content, const bool chunked)
{
    _payload.Rewind();
    _payload.SetSubCommandID(SNIC_HTTP_MORE_REQ);
    _payload.SetFrameID(_payload.GetFrameID() + 1);

    int length = content->GetContentLength();
    char msb = length;
    if (chunked)
        msb |= 0x80;
    else msb &= 0x7F;

    _payload.SetContent(msb);
    _payload.SetContent(length);

    if (length > 0)
        _payload.SetContent(content->GetBody(), 0, length);

    _frame.SetCommandID(CMD_ID_SNIC);
    _frame.SetPayload(&_payload);

    Send();

    if (chunked)
        return NULL;

    while (FrameReceive())
        if (_frame.GetCommandID() == CMD_ID_SNIC && _payload.GetSubCommandID() == SNIC_HTTP_MORE_REQ) {
            _HTTPResponse.SetPayload(&_payload);
            return &_HTTPResponse;
        }

    return NULL;
}

CreateSocketResponse * MuRata::SNIC_CreateAdvancedTLSTCP(const bool bind, IPAddress * localIP, const int localPort)
{
    return SNIC_CreateSocket(SNIC_TCP_CREATE_ADV_TLS_SOCKET_REQ, bind, localIP, localPort);
}

CreateSocketResponse * MuRata::SNIC_CreateSimpleTLSTCP(const bool bind, IPAddress * localIP, const int localPort)
{
    return SNIC_CreateSocket(SNIC_TCP_CREAET_SIMPLE_TLS_SOCKET_REQ, bind, localIP, localPort);
}