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:
- 2015-02-03
- Revision:
- 0:8e83b9448758
- Child:
- 1:fd19bd683e90
File content as of revision 0:8e83b9448758:
#include "MuRata.h" using namespace SmartLabMuRata; MuRata::MuRata(PinName tx, PinName rx) { 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) { serial = new Serial(tx,rx); serial->format(bits, parity, stop_bits); serial->baud(baudrate ); } SSIDRecordIndication * MuRata::Get_ScanResultIndication() { if (FrameReceive() && _payload.GetResponseFlag() == Request_Indication && _frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_SCAN_RESULT_IND) { return new SSIDRecordIndication(&_payload); } return NULL; } WIFIConnectionIndication * MuRata::Get_WiFiStatusIndication() { if (FrameReceive() && _payload.GetResponseFlag() == Request_Indication && _frame.GetCommandID() == CMD_ID_WIFI && _payload.GetSubCommandID() == WIFI_NETWORK_STATUS_IND) { return new WIFIConnectionIndication(&_payload); } return NULL; } void MuRata::Send() { _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() { 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; } VersionInfoResponse * 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(); if (FrameReceive()) return new VersionInfoResponse(&_payload); else 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(); if (FrameReceive()) return (CMDCode)_payload.GetData()[2]; else 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(); if (FrameReceive()) return (CMDCode)_payload.GetData()[2]; else 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(); if (FrameReceive()) return (CMDCode)_payload.GetData()[2]; else 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(); if (FrameReceive()) return (WIFICode)_payload.GetData()[2]; else 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(); if (FrameReceive()) return (WIFICode)_payload.GetData()[2]; else return WIFI_NORESPONSE; } 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() == 0x02) { int length = config->GetSSID().length(); _payload.SetContent(config->GetSSID().c_str(), 0 , length); _payload.SetContent(0x00); } _payload.SetContent(config->GetChannel()); _payload.SetContent((char)config->GetSecurityMode()); int keyLength = config->GetSecurityKey().length(); _payload.SetContent(keyLength); if (config->GetSecurityMode() != WIFI_SECURITY_OPEN && keyLength > 0) _payload.SetContent(config->GetSecurityKey().c_str(), 0 , keyLength); _frame.SetCommandID(CMD_ID_WIFI); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return (WIFICode)_payload.GetData()[2]; else 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().c_str(), 0, AP->GetSSID().length()); _payload.SetContent(0x00); _payload.SetContent((char)AP->GetSecurityMode()); int keyLength = AP->GetSecurityKey().length(); _payload.SetContent(keyLength); if (keyLength > 0) _payload.SetContent(AP->GetSecurityKey().c_str(), 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(); if (FrameReceive()) return (WIFICode)_payload.GetData()[2]; else 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(); if (FrameReceive()) return (WIFICode)_payload.GetData()[2]; else 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((char)WiFiInterface); _frame.SetCommandID(CMD_ID_WIFI); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new WIFIStatusResponse(&_payload); else return NULL; } int 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(); if (FrameReceive()) { char value = _payload.GetData()[2]; if (value >> 7 == 0x01) return (~(_payload.GetData()[2] - 1) & 0x7F) * -1; return value; } else 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((char)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(); if (FrameReceive()) return (WIFICode)_payload.GetData()[2]; else 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((char)scan); _payload.SetContent((char)bss); for (int i = 0; i < 8; i++) _payload.SetContent(0x00); _frame.SetCommandID(CMD_ID_WIFI); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return (WIFICode)_payload.GetData()[2]; else 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(); if (FrameReceive()) return new InitializationResponse(&_payload); else 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(); if (FrameReceive()) return (SNICCode)_payload.GetData()[2]; else 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((char)option); _payload.SetContent(length >> 8); _payload.SetContent(length); _payload.SetContent(payload, offset, length); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new SendFromSocketResponse(&_payload); else 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(); if (FrameReceive()) return (SNICCode)_payload.GetData()[2]; else 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((char)wifiInterface); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new DHCPInfoResponse(&_payload); else return NULL; } IPAddress MuRata::SNIC_ResolveHostName(const string * host) { _payload.Rewind(); _payload.SetSubCommandID(SNIC_RESOLVE_NAME_REQ); _payload.SetFrameID(_payload.GetFrameID() + 1); _payload.SetContent((char)STA); _payload.SetContent((char)host->length()); _payload.SetContent(host->c_str(), 0, host->length()); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); IPAddress ip; if (FrameReceive()) if ((SNICCode)_payload.GetData()[2] == SNIC_SUCCESS) ip.SetValue(_payload.GetData(), 3); return ip; } SNICCode MuRata::SNIC_ConfigureDHCPorStaticIP(DHCPConfig * config) { _payload.Rewind(); _payload.SetSubCommandID(SNIC_IP_CONFIG_REQ); _payload.SetFrameID(_payload.GetFrameID() + 1); _payload.SetContent((char)config->GetInterface()); _payload.SetContent((char)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(); if (FrameReceive()) return (SNICCode)_payload.GetData()[2]; else 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((char)(remotePort >> 8)); _payload.SetContent((char)remotePort); _payload.SetContent((char)(receiveBufferSize >> 8)); _payload.SetContent((char)receiveBufferSize); _payload.SetContent(timeout); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new SocketStartReceiveResponse(&_payload); else 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((char)(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((char)(localPort >> 8)); _payload.SetContent((char)localPort); } _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new CreateSocketResponse(&_payload); else 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((char)(receiveBufferSize >> 8)); _payload.SetContent((char)receiveBufferSize); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new SocketStartReceiveResponse(&_payload); else 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((char)(remotePort >> 8)); _payload.SetContent((char)remotePort); _payload.SetContent((char)(length >> 8)); _payload.SetContent((char)length); _payload.SetContent(payload, offset, length); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new SendFromSocketResponse(&_payload); else 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((char)(remotePort >> 8)); _payload.SetContent((char)remotePort); _payload.SetContent(SocketID); _payload.SetContent((char)(connectServer ? 0x01 : 0x00)); _payload.SetContent((char)(length >> 8)); _payload.SetContent((char)length); _payload.SetContent(payload, offset, length); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new SendFromSocketResponse(&_payload); else return NULL; } HTTPResponse * MuRata::SNIC_SendHTTPRequest(HTTPContent * content, const bool isHTTPS, const bool chunked) { _payload.Rewind(); if (isHTTPS) _payload.SetSubCommandID(SNIC_HTTPS_REQ); else _payload.SetSubCommandID(SNIC_HTTP_REQ); _payload.SetFrameID(_payload.GetFrameID() + 1); _payload.SetContent((char)(content->GetRemotePort() >> 8)); _payload.SetContent((char)content->GetRemotePort()); _payload.SetContent((char)content->GetMethod()); _payload.SetContent(content->GetTimeout()); _payload.SetContent(content->GetRemoteHost()->c_str(), 0, content->GetRemoteHost()->length()); _payload.SetContent(0x00); _payload.SetContent(content->GetURI()->c_str(), 0, content->GetURI()->length()); _payload.SetContent(0x00); _payload.SetContent(content->GetContentType()->c_str(), 0, content->GetContentType()->length()); _payload.SetContent(0x00); string * _others = new string(); content->GetOtherHeaders(_others); _payload.SetContent(_others->c_str(), 0, _others->length()); _payload.SetContent(0x00); delete _others; if (content->GetMethod() == POST) { int length = content->GetContentLength(); char msb = (char)(length >> 8); if (chunked) msb |= 0x80; else msb &= 0x7F; _payload.SetContent(msb); _payload.SetContent((char)length); if (length > 0) _payload.SetContent(content->GetBody(), 0, length); } _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (FrameReceive()) return new HTTPResponse(&_payload); else 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 = (char)(length >> 8); if (chunked) msb |= 0x80; else msb &= 0x7F; _payload.SetContent(msb); _payload.SetContent((char)length); if (length > 0) _payload.SetContent(content->GetBody(), 0, length); _frame.SetCommandID(CMD_ID_SNIC); _frame.SetPayload(&_payload); Send(); if (chunked) return NULL; if (FrameReceive()) return new HTTPResponse(&_payload); else 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); }