// DigiX WiFi module example - released by Digistump LLC/Erik Kettenburg under CC-BY-SA 3.0 #include "DigiFi.h" #define DEBUG bool digiFiDebugState = false; uint8_t digiFiMode = TCP; bool digiFiServer = false; uint32_t digiFiActivityTimeout = 0; DigiFi::DigiFi() { } /* Stream Implementation */ int DigiFi::available( void ) { uint8_t available = Serial1.available(); if(available>0) digiFiActivityTimeout = millis() +1000; return available; } int DigiFi::peek( void ) { return Serial1.peek(); } int DigiFi::read( void ) { return Serial1.read(); } int DigiFi::read(uint8_t *buf, size_t size) { return Serial1.readBytes((char*)buf,size); } void DigiFi::flush( void ) { return Serial1.flush(); } void DigiFi::stop( void ) { startATMode(); setTCPConn("off"); endATMode(); } void DigiFi::setFlowControl( boolean en ) { Serial1.setCTSPin(DIGIFI_CTS); Serial1.enableCTS(en); } size_t DigiFi::write( const uint8_t c ) { digiFiActivityTimeout = millis() + (requestTimeout*1000); return Serial1.write(c); } size_t DigiFi::write(const uint8_t *buf, size_t size) { digiFiActivityTimeout = millis() + (requestTimeout*1000); return Serial1.write(buf,size); } void DigiFi::closeChunk() { Serial1.println('0'); Serial1.println(); } void DigiFi::printChunk(int str) { printChunk(String(str)); } void DigiFi::printChunk(long str) { printChunk(String(str)); } void DigiFi::printChunk(const char *str) { printChunk(String(str)); } void DigiFi::printChunk(String str) { Serial1.println(str.length()+2,HEX); Serial1.println(str); Serial1.println(); } DigiFi::operator bool() { return Serial1; } void DigiFi::begin(int aBaud, bool en) { setFlowControl(en); Serial1.begin(aBaud); /** / //Enable USART HW Flow Control USART0->US_MR |= US_MR_USART_MODE_HW_HANDSHAKING; //Disable PIO Control of URTS pin PIOB->PIO_ABSR |= (0u << 25); PIOB->PIO_PDR |= PIO_PB25A_RTS0; //Disable PIO Control of UCTS pin PIOB->PIO_ABSR |= (0u << 26); PIOB->PIO_PDR |= PIO_PB26A_CTS0; //Disable PIO Control of WRTS pin PIOC->PIO_ABSR |= (0u << 27); PIOC->PIO_PDR |= (1u << 27); //Disable PIO Control of WCTS pin PIOC->PIO_ABSR |= (0u << 20); PIOC->PIO_PDR |= (1u << 20); /**/ while(Serial1.available()){Serial1.read();} } void DigiFi::startATMode() { bool ATsuccess = false; // ensure the module properly acknowledges // our request for AT mode. Otherwise retry. int retries = 0; // TODO: make constant do { if (retries > 5) { debug("Retried 5 times, bailing"); // need to change return-types perhaps to // trigger some kind of reset higher up. return; } ATsuccess = startATSequence(); retries += 1; } while (!ATsuccess); debug("Send client acknowledge AT mode"); Serial1.print("a"); debug(readResponse(0)); debug("echo off"); Serial1.print("AT+E\r"); debug(readResponse(0)); } bool DigiFi::startATSequence(){ //silly init sequence for wifi module delay(50); // changed from 100 // clear the incoming buffer while(Serial1.available()){Serial1.read();} debug("start at mode"); debug("next"); Serial1.write("+++"); debug("wait for a"); // there's a ~4s (see datasheet for newer G2 module) // time within which the handshake must complete // if time is longer than that, it's failed. // TODO: turn the timeout into a constant unsigned long timeout = millis() + (4*1000); while(!Serial1.available()){ delay(1); if (millis() > timeout) { debug("FAILED: AT handshake timeout"); return false; } } debug("check for a"); char resp = Serial1.read(); if (resp == 'a') { debug("OK: module acknowledge AT mode"); return true; } // otherwise it's failed. debug("FAILED: module acknowledge AT mode"); return false; } void DigiFi::endATMode() { //back to transparent mode Serial1.print("AT+E\r"); debug(readResponse(0)); Serial1.print("AT+ENTM\r"); debug(readResponse(0)); debug("exit at mode"); } bool DigiFi::ready(){ startATMode(); //debug("send cmd"); //+ok=< LF >< LF > //”Disconnected”, if no WiFi connection; //”AP’ SSID(AP’s MAC” ), if WiFi connection available; //”RF Off”, if WiFi OFF; debug("Check Link"); String ret = STALinkStatus(); debug("OUT"); debug(ret); endATMode(); debug(ret); //change this to report the AP it is connected to if(ret.substring(0,10) == "+ok=RF Off" || ret.substring(0,16) == "+ok=Disconnected") return 0; else return 1; } uint8_t DigiFi::maintain() {return 0;} IPAddress DigiFi::localIP(){ startATMode(); String response = getSTANetwork(); endATMode(); response = response.substring(response.indexOf(",")+1); response = response.substring(0,response.indexOf(",")); String ip1 = response.substring(0,response.indexOf(".")); String ip2 = response.substring(response.indexOf(".")+1); String ip3 = ip2.substring(ip2.indexOf(".")+1); String ip4 = ip3.substring(ip3.indexOf(".")+1); ip2 = ip2.substring(0,ip2.indexOf(".")); ip3 = ip3.substring(0,ip3.indexOf(".")); IPAddress ip(ip1.toInt(),ip2.toInt(),ip3.toInt(),ip4.toInt()); return ip; } IPAddress DigiFi::subnetMask(){ startATMode(); String response = getSTANetwork(); endATMode(); response = response.substring(response.indexOf(",")+1); response = response.substring(response.indexOf(",")+1); response = response.substring(0,response.indexOf(",")); String ip1 = response.substring(0,response.indexOf(".")); String ip2 = response.substring(response.indexOf(".")+1); String ip3 = ip2.substring(ip2.indexOf(".")+1); String ip4 = ip3.substring(ip3.indexOf(".")+1); ip2 = ip2.substring(0,ip2.indexOf(".")); ip3 = ip3.substring(0,ip3.indexOf(".")); IPAddress ip(ip1.toInt(),ip2.toInt(),ip3.toInt(),ip4.toInt()); return ip; } IPAddress DigiFi::gatewayIP(){ startATMode(); String response = getSTANetwork(); endATMode(); response = response.substring(response.indexOf(",")+1); response = response.substring(response.indexOf(",")+1); response = response.substring(response.indexOf(",")+1); response = response.substring(0,response.indexOf("\r")); String ip1 = response.substring(0,response.indexOf(".")); String ip2 = response.substring(response.indexOf(".")+1); String ip3 = ip2.substring(ip2.indexOf(".")+1); String ip4 = ip3.substring(ip3.indexOf(".")+1); ip2 = ip2.substring(0,ip2.indexOf(".")); ip3 = ip3.substring(0,ip3.indexOf(".")); IPAddress ip(ip1.toInt(),ip2.toInt(),ip3.toInt(),ip4.toInt()); return ip; } IPAddress DigiFi::dnsServerIP(){ startATMode(); String response = getSTADNS(); endATMode(); response = response.substring(4,response.indexOf("\r")); String ip1 = response.substring(0,response.indexOf(".")); String ip2 = response.substring(response.indexOf(".")+1); String ip3 = ip2.substring(ip2.indexOf(".")+1); String ip4 = ip3.substring(ip3.indexOf(".")+1); ip2 = ip2.substring(0,ip2.indexOf(".")); ip3 = ip3.substring(0,ip3.indexOf(".")); IPAddress ip(ip1.toInt(),ip2.toInt(),ip3.toInt(),ip4.toInt()); return ip; } //server functions String DigiFi::server(uint16_t port){ startATMode(); while(Serial1.available()){Serial1.read();} String conn=getNetParams(); String isServer = conn.substring(conn.indexOf("+ok"),conn.length()); isServer = isServer.substring(8,14); setNetParams("TCP","SERVER",port,"127.0.0.1"); //setTCPConn("On"); //is this needed? if(isServer != "Server"){ debug("restart for switch to server mode"); reset(); delay(3000); uint32_t startTime = millis(); while(!ready() && millis()-startTime < 30000){ delay(1000); } startATMode(); } String response = getSTANetwork(); response = response.substring(response.indexOf(",")+1); response = response.substring(0,response.indexOf(",")); endATMode(); return response; } bool DigiFi::serverRequest(){ if(Serial1.available()){ String response = readResponse(0); response = response.substring(4); response = response.substring(0,response.indexOf("\n")); response = response.substring(0,response.lastIndexOf("HTTP/")-1); debug(response); serverRequestPathString = response; return true; } else return false; } String DigiFi::serverRequestPath(){ return serverRequestPathString; } void DigiFi::serverResponse(String response, int code) //defaults to code = 200 { Serial1.print("HTTP/1.1 "); Serial1.print(code); if(code==200) Serial1.print(" OK"); else if(code==404) Serial1.print(" Not Found"); else Serial1.print(" OK"); //left as OK to not mess anything up Serial1.print(" \r\n"); Serial1.print("Content-Type: text/html;\r\n"); Serial1.print("Content-Length: "); Serial1.print(response.length()); Serial1.print("\r\n"); Serial1.print("Connection: close\r\n\r\n"); Serial1.print(response); Serial1.print("\r\n\r\n"); return; } void DigiFi::setTCPTimeout(uint16_t timeout){ startATMode(); Serial1.print("AT+TCPTO="); Serial1.print(timeout); Serial1.print("\r"); endATMode(); } uint8_t DigiFi::connected(){ uint8_t ret = 0; if(Serial1.available() > 0) return 1; if(millis() < digiFiActivityTimeout) return 1; startATMode(); debug("Checking for link build up"); String status=getTCPLnk(); if (status.substring(0,6)=="+ok=on") ret = 1; endATMode(); return ret; } //client functions int DigiFi::connect(IPAddress ip, uint16_t port = 80){ //uint8_t* server = rawIPAddress(ip); String server = String(ip[0]) + "." + String(ip[1])+ "." + String(ip[2])+ "." + String(ip[3]); return connect(server.c_str(),port); } int DigiFi::connect(const char *host, uint16_t port = 80){ debug("::connect(*char host, uint port)"); uint8_t lastMode = TCP; debug("Connect"); startATMode(); debug("send client settings"); setTCPConn("off"); //assuming port 80 for now String conn=getNetParams(); String isServer = conn.substring(8,14); if(conn.substring(4,7)=="UDP") lastMode = UDP; debug(conn.substring(4,7)); conn=conn.substring(conn.lastIndexOf(',')+1,conn.length()-1); debug(conn); debug(host); debug(isServer); if(conn != host || isServer == "Server" || lastMode != digiFiMode){ if(digiFiMode == TCP) setNetParams("TCP","CLIENT",port,host); else setNetParams("UDP","CLIENT",port,host); debug("setting net params"); } else{ debug("skipping net params"); } //lastHost = conn; if(isServer == "Server" || lastMode != digiFiMode){ debug("restart for switch to client mode"); reset(); delay(3000); startATMode(); setTCPConn("off"); } setTCPConn("On"); uint32_t linkStart = millis(); if(digiFiMode == TCP){ getNetParams(); debug("Checking for link build up"); String status=getTCPLnk(); while(status.substring(0,6)!="+ok=on"){ debug("Status:"); debug(status); debug("Re-checking for link build up"); status=getTCPLnk(); debug(status); if(millis()-linkStart > (requestTimeout*1000)){ endATMode(); return 0; } } } else{ debug("Checking for host ready"); String status = ping((char*)host); if(status.substring(0,11)!="+ok=Success"){ while(status.substring(0,11)!="+ok=Success"){ debug("Re-checking for host ready"); status=ping((char*)host); debug(status); if(millis()-linkStart > (requestTimeout*1000)){ endATMode(); return 0; } } debug("Wait for UDP to be ready to receive as well"); delay(2000); } } endATMode(); return 1; } int DigiFi::disconnect() { debug("::disconnect(*char host, uint port)"); startATMode(); setTCPConn("off"); endATMode(); return 1; } String DigiFi::body(){ return aBody; } String DigiFi::header(){ return aHeader; } void DigiFi::setDebug(bool debugStateVar){ digiFiDebugState = debugStateVar; } void DigiFi::setMode(uint8_t protocol){ digiFiMode = protocol; } void DigiFi::debug(String output){ if(digiFiDebugState == true) Serial.println(output); } void DigiFi::debugWrite(char output){ if(digiFiDebugState == true) Serial.write(output); } /* Return value should be the HTTP return code (i.e. 100 and above). If something else fails, the non-HTTP error codes are negative numbers. -1 - connect failure -2 - connect successful, but request failed -3 - invalid HTTP return-code returned */ int DigiFi::get(char *aHost, char *aPath){ if(connect(aHost) == 1){ //delay(500); Serial1.print("GET "); Serial1.print(aPath); Serial1.print(" HTTP/1.1\r\nHost: "); Serial1.print(aHost); Serial1.print("\r\nCache-Control: no-cache\r\nConnection: close\r\n\r\n"); Serial1.flush(); //don't block while awating reply debug("wait for response..."); bool success = true; int i=0; int st = millis(); while(!Serial1.available()){ if(millis() - st > requestTimeout * 1000) { success = false; break; } if(((millis() - st) % 1000) == 1) debugWrite('.'); i++; } debug("get header"); if(success == false) return -2; aHeader = readResponse(0); debug(aHeader); String contentLength = aHeader.substring(aHeader.lastIndexOf("Content-Length: ")); contentLength = contentLength.substring(16,contentLength.indexOf("\r")); debug("Length:"+contentLength+";"); if(contentLength.toInt() != 0) { debug("get body for later"); aBody = readResponse(contentLength.toInt()); } else { debug("Skip body"); } debug("return from get"); // work out the returncode int iRetCode = aHeader.substring(9,12).toInt(); if (iRetCode == 0) { debug("Invalid return code"); return -3; } return iRetCode; } else return -1; //To do: /* User agent! Better handle timeouts/other errors Efficiency! */ } String DigiFi::URLEncode(String smsg) { const char *msg = smsg.c_str(); const char *hex = "0123456789abcdef"; String encodedMsg = ""; while (*msg!='\0'){ if( ('a' <= *msg && *msg <= 'z') || ('A' <= *msg && *msg <= 'Z') || ('0' <= *msg && *msg <= '9') ) { encodedMsg += *msg; } else { encodedMsg += '%'; encodedMsg += hex[*msg >> 4]; encodedMsg += hex[*msg & 15]; } msg++; } return encodedMsg; } /* Return value should be the HTTP return code (i.e. 100 and above). If something else fails, the non-HTTP error codes are negative numbers. -1 - connect failure -2 - connect successful, but request failed -3 - invalid HTTP return-code returned */ int DigiFi::post(char *aHost, char *aPath, String postData) { if(connect(aHost) == 1){ Serial1.print("POST "); Serial1.print(aPath); Serial1.print(" HTTP/1.1\r\nHost: "); Serial1.print(aHost); Serial1.print("\r\nCache-Control: no-cache\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n"); Serial1.print("Content-Length: "); Serial1.print(postData.length()); Serial1.print("\r\n\r\n"); Serial1.print(postData); Serial1.print("\r\n\r\n"); Serial1.flush(); debug("wait for response..."); bool success = true; int i=0; int st = millis(); while(!Serial1.available()){ if(millis() - st > requestTimeout * 1000) { success = false; break; } if(((millis() - st) % 1000) == 1) debugWrite('.'); i++; } if(success == false) return -2; debug("Get header"); aHeader = readResponse(0); debug(aHeader); String contentLength = aHeader.substring(aHeader.lastIndexOf("Content-Length: ")); contentLength = contentLength.substring(16,contentLength.indexOf("\n")); debug(contentLength); if(contentLength.toInt() != 0) { debug("Get body"); aBody = readResponse(contentLength.toInt()); } else { debug("Skip body"); } // connection: close hard-coded, so disconnect here. disconnect(); // TODO: // + make connection: close header optional // and run disconnect dependent on that option // + remove the disconnect command (TCPDIS=off) // from the start of the connect command. // but need to have connection checking upfront // first. // work out the returncode int iRetCode = aHeader.substring(9,12).toInt(); if (iRetCode == 0) { debug("Invalid return code"); return -3; } return iRetCode; } else return -1; //To do: /* User agent! accept post data as array or array or string, etc Better handle timeouts/other errors Efficiency! */ } void DigiFi::close() { //clear buffer while(Serial1.available()){Serial1.read();} Serial1.end(); } String DigiFi::readResponse(int contentLength) //0 = cmd, 1 = header, 2=body { String stringBuffer; char inByte; int rCount = 0; int nCount = 0; int curLength = 0; bool end = false; Serial1.flush(); bool timeout = false; int st = millis(); while (!end) { //look for this to be four bytes in a row if (Serial1.available()) { inByte = Serial1.read(); curLength++; //debugWrite(inByte);// disabled, leads to lots of duplicate debug logging if(contentLength == 0){ if (inByte == '\n' && rCount == 2 && nCount == 1) { end = true; int strLength = stringBuffer.length()-3; stringBuffer = stringBuffer.substring(0,strLength); } else if (inByte == '\r') rCount++; else if (inByte == '\n') nCount++; else{ rCount = 0; nCount = 0; } } else if(curLength>=contentLength) end = true; stringBuffer += inByte; } else { // need a timeout otherwise we can get stuck in // here if the server drops out for some reason // does though imply that 15s is sufficient to // retrieve whatever it is your after // seems OK though as DigiX doesn't have a large // amount of memory if(millis() - st > requestTimeout * 1000) { timeout = true; break; } } } if(stringBuffer.substring(0,4) == "+ERR") { lastErr = stringBuffer.substring(5,2).toInt(); } else if (timeout) { lastErr = -1; } else { lastErr = 0; } return stringBuffer; } int DigiFi::lastError() { return lastErr; } String DigiFi::AT(char *cmd, char *params) { Serial1.print("AT+"); Serial1.print(cmd); if(sizeof(*params) > 0) { Serial1.print("="); Serial1.print(params); } Serial1.print("\r"); return readResponse(0); } void DigiFi::toggleEcho() //E { Serial1.print("AT+E\r"); readResponse(0); } String DigiFi::getWifiMode() //WMODE AP STA APSTA { Serial1.print("AT+WMODE\r"); return readResponse(0); } void DigiFi::setWifiMode(char *mode) { Serial1.print("AT+WMODE="); Serial1.print(mode); Serial1.print("\r"); readResponse(0); } void DigiFi::setTransparent() //ENTM { Serial1.print("AT+ENTM\r"); readResponse(0); } String DigiFi::getTMode() //TMODE throughput cmd { Serial1.print("AT+TMODE\r"); return readResponse(0); } void DigiFi::setTMode(char *mode) { Serial1.print("AT+TMODE="); Serial1.print(mode); Serial1.print("\r"); readResponse(0); } String DigiFi::getModId() //MID { Serial1.print("AT+MID\r"); return readResponse(0); } String DigiFi::version() //VER { Serial1.print("AT+VER\r"); return readResponse(0); } void DigiFi::factoryRestore() //RELD rebooting... { Serial1.print("AT+RELD\r"); readResponse(0); } void DigiFi::reset() //Z (No return) { Serial1.print("AT+Z\r"); //readResponse(0); lastErr=0; //This command doesnt return anything. } String DigiFi::help()//H { Serial1.print("AT+H\r"); return readResponse(0); } int DigiFi::readConfig(byte* buffer)//CFGRD { Serial1.print("AT+CFGRD\r"); Serial1.readBytes((char*)buffer,4); if((char*)buffer=="+ERR") return -1; //TODO Set lastErr here (Technically it shouldn't ever error here) Serial1.readBytes((char*)buffer,2); int len=(int)word(buffer[1],buffer[0]); Serial1.readBytes((char*)buffer,len); return len; } void DigiFi::writeConfig(byte* config, int len)//CFGWR { Serial1.print("AT+CFGWR="); Serial1.write(highByte(len)); Serial1.write(lowByte(len)); Serial1.write(config,len); Serial1.print("\r"); readResponse(0); } int DigiFi::readFactoryDef(byte* buffer)//CFGFR { Serial1.print("AT+CFGFR\r"); Serial1.readBytes((char*)buffer,4); if((char*)buffer=="+ERR") return -1; //TODO Set lastErr here (Technically it shouldn't ever error here) Serial1.readBytes((char*)buffer,2); int len=(int)word(buffer[1],buffer[0]); Serial1.readBytes((char*)buffer,len); return len; } void DigiFi::makeFactory() //CFGTF { Serial1.print("AT+CFGTF\r"); readResponse(0); } String DigiFi::getUart()//UART baudrate,data_bits,stop_bit,parity { Serial1.print("AT+UART\r"); return readResponse(0); } void DigiFi::setUart(int baudrate,int data_bits,int stop_bit,char *parity) { Serial1.print("AT+UART="); Serial1.print(baudrate); Serial1.print(","); Serial1.print(data_bits); Serial1.print(","); Serial1.print(stop_bit); Serial1.print(","); Serial1.print(parity); Serial1.print("\r"); readResponse(0); } /* String getAutoFrame(); //UARTF void setAutoFrame(char *para); int getAutoFrmTrigTime(); //UARTFT void setAutoFrmTrigTime(int ms); int getAutoFrmTrigLength(); //UARTFL void setAutoFrmTrigLength(int v); */ void DigiFi::sendData(int len, char *data)//SEND { Serial1.print("AT+SEND="); Serial1.print(len); Serial1.print(","); Serial1.print(data); Serial1.print("\r"); readResponse(0); } String DigiFi::recvData(int len)//RECV len,data (+ok=0 if timeout (3sec)) { Serial1.print("AT+RECV="); Serial1.print(len); Serial1.print("\r"); return readResponse(0); } String DigiFi::ping(char *ip)//PING Success Timeout Unknown host { Serial1.print("AT+PING="); Serial1.print(ip); Serial1.print("\r"); return readResponse(0); } String DigiFi::getNetParams()//NETP (TCP|UDP),(SERVER|CLIENT),port,IP { Serial1.print("AT+NETP\r"); return readResponse(0); } void DigiFi::setNetParams(char *proto, char *cs, int port, const char *ip) { if(cs == "SERVER") digiFiServer = true; else digiFiServer = false; Serial1.print("AT+NETP="); Serial1.print(proto); Serial1.print(","); Serial1.print(cs); Serial1.print(","); Serial1.print(port); Serial1.print(","); Serial1.print(ip); Serial1.print("\r"); readResponse(0); } String DigiFi::getTCPLnk()//TCPLK on|off { Serial1.print("AT+TCPLK\r"); return readResponse(0); } String DigiFi::getTCPTimeout()//TCPTO 0 <= int <= 600 (Def 300) { Serial1.print("AT+TCPTO\r"); return readResponse(0); } String DigiFi::getTCPConn()//TCPDIS On|off { Serial1.print("AT+TCPDIS\r"); return readResponse(0); } void DigiFi::setTCPConn(char *sta) { Serial1.print("AT+TCPDIS="); Serial1.print(sta); Serial1.print("\r"); readResponse(0); } String DigiFi::getWSSSID()//WSSSID { Serial1.print("AT+WSSSID\r"); return readResponse(0); } void DigiFi::setWSSSID(char *ssid) { Serial1.print("AT+WSSSID="); Serial1.print(ssid); Serial1.print("\r"); readResponse(0); } String DigiFi::getSTAKey()//WSKEY (OPEN|SHARED|WPAPSK|WPA2PSK),(NONE|WEP|TKIP|AES),key { Serial1.print("AT+WSKEY\r"); return readResponse(0); } void DigiFi::setSTAKey(char* auth,char *encry,char *key) { Serial1.print("AT+WSKEY="); Serial1.print(auth); Serial1.print(","); Serial1.print(encry); Serial1.print(","); Serial1.print(key); Serial1.print("\r"); readResponse(0); } String DigiFi::getSTANetwork()//WANN (static|DHCP),ip,subnet,gateway { Serial1.print("AT+WANN\r"); return readResponse(0); } void DigiFi::setSTANetwork(char *mode, char *ip, char *subnet, char *gateway) { Serial1.print("AT+WANN="); Serial1.print(mode); Serial1.print(","); Serial1.print(ip); Serial1.print(","); Serial1.print(subnet); Serial1.print(","); Serial1.print(gateway); Serial1.print("\r"); readResponse(0); } String DigiFi::getSTAMac()//WSMAC returns MAC { Serial1.print("AT+WSMAC\r"); return readResponse(0); } void DigiFi::setSTAMac(int code, char *mac)//Code default is 8888, no idea what its for { Serial1.print("AT+WSSSID="); Serial1.print(code); Serial1.print(","); Serial1.print(mac); Serial1.print("\r"); readResponse(0); } String DigiFi::STALinkStatus()//WSLK (Disconnected|AP SSID (AP MAC)|RF Off) { Serial1.print("AT+WSLK\r"); return readResponse(0); } String DigiFi::STASignalStrength()//WSLQ (Disconnected|Value) { Serial1.print("AT+WSLQ\r"); return readResponse(0); } String DigiFi::scan()//WSCAN returns list { Serial1.print("AT+WSCAN\r"); return readResponse(0); } String DigiFi::getSTADNS()//WSDNS address { Serial1.print("AT+WSDNS\r"); return readResponse(0); } void DigiFi::setSTADNS(char *dns) { Serial1.print("AT+WSDNS="); Serial1.print(dns); Serial1.print("\r"); readResponse(0); } String DigiFi::getAPNetwork()//LANN ip,subnet { Serial1.print("AT+LANN\r"); return readResponse(0); } void DigiFi::setAPNetwork(char *ip, char *subnet) { Serial1.print("AT+LANN="); Serial1.print(ip); Serial1.print(","); Serial1.print(subnet); Serial1.print("\r"); readResponse(0); } String DigiFi::getAPParams()//WAP (11B|11BG|11BGN),SSID,(AUTO|C1...C11) { Serial1.print("AT+WAP\r"); return readResponse(0); } void DigiFi::setAPParams(char *mode, char *ssid, char *channel) { Serial1.print("AT+WAP="); Serial1.print(mode); Serial1.print(","); Serial1.print(ssid); Serial1.print(","); Serial1.print(channel); Serial1.print("\r"); readResponse(0); } String DigiFi::getAPKey()//WAKEY (OPEN|WPA2PSK),(NONE|AES),key { Serial1.print("AT+WAKEY\r"); return readResponse(0); } void DigiFi::setAPKey(char* auth,char *encry,char *key) { Serial1.print("AT+WAKEY="); Serial1.print(auth); Serial1.print(","); Serial1.print(encry); Serial1.print(","); Serial1.print(key); Serial1.print("\r"); readResponse(0); } String DigiFi::getAPMac()//WAMAC returns MAC { Serial1.print("AT+WAMAC\r"); return readResponse(0); } String DigiFi::getAPDHCP()//WADHCP (on|off) { Serial1.print("AT+WADHCP\r"); return readResponse(0); } void DigiFi::setAPDHCP(char *status) { Serial1.print("AT+WADHCP="); Serial1.print(status); Serial1.print("\r"); readResponse(0); } String DigiFi::getAPPageDomain()//WADMN domain { Serial1.print("AT+WADM\r"); return readResponse(0); } void DigiFi::setAPPageDomain(char *domain) { Serial1.print("AT+WADMN="); Serial1.print(domain); Serial1.print("\r"); readResponse(0); } void DigiFi::setPageDisplayMode(char *mode)//WEBSWITCH (iw|ew) { Serial1.print("AT+WEBSWITCH="); Serial1.print(mode); Serial1.print("\r"); readResponse(0); } void DigiFi::setPageLanguage(char *lang)//PLANG CN|EN { Serial1.print("AT+PLANG="); Serial1.print(lang); Serial1.print("\r"); readResponse(0); } String DigiFi::getUpgradeUrl()//UPURL url !!!DANGEROUS!!! { Serial1.print("AT+UPURL\r"); return readResponse(0); } void DigiFi::setUpgradeUrl(char *url)//url,filename (filename is optional, if provided upgrade is auto started) { Serial1.print("AT+UPURL="); Serial1.print(url); Serial1.print("\r"); readResponse(0); } String DigiFi::getUpgradeFile()//UPFILE filename !!!DANGEROUS!!! { Serial1.print("AT+UPFILE\r"); return readResponse(0); } void DigiFi::setUpgradeFile(char *filename) { Serial1.print("AT+UPFILE="); Serial1.print(filename); Serial1.print("\r"); readResponse(0); } String DigiFi::startUpgrade()//UPST !!!DANGEROUS!!! { Serial1.print("AT+UPST\r"); return readResponse(0); } String DigiFi::getWebAuth()//WEBU user,pass { Serial1.print("AT+WEBU\r"); return readResponse(0); } void DigiFi::setWebAuth(char *user, char *pass) { Serial1.print("AT+WEBU="); Serial1.print(user); Serial1.print(","); Serial1.print(pass); Serial1.print("\r"); readResponse(0); } String DigiFi::getSleepMode()//MSLP normal|standby { Serial1.print("AT+MSLP\r"); return readResponse(0); } void DigiFi::setSleepMode(char *mode) { Serial1.print("AT+MSLP="); Serial1.print(mode); Serial1.print("\r"); readResponse(0); } void DigiFi::setModId(char *modid)//WRMID { Serial1.print("AT+WRMID="); Serial1.print(modid); Serial1.print("\r"); readResponse(0); } String DigiFi::getWifiCfgPassword()//ASWD aswd { Serial1.print("AT+ASWD\r"); return readResponse(0); } void DigiFi::setWifiCfgPassword(char *aswd) { Serial1.print("AT+ASWD="); Serial1.print(aswd); Serial1.print("\r"); readResponse(0); }