aboutsummaryrefslogtreecommitdiff
path: root/libraries/GSM/GSM3ShieldV1DataNetworkProvider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/GSM/GSM3ShieldV1DataNetworkProvider.cpp')
-rw-r--r--libraries/GSM/GSM3ShieldV1DataNetworkProvider.cpp363
1 files changed, 363 insertions, 0 deletions
diff --git a/libraries/GSM/GSM3ShieldV1DataNetworkProvider.cpp b/libraries/GSM/GSM3ShieldV1DataNetworkProvider.cpp
new file mode 100644
index 0000000..aaffdba
--- /dev/null
+++ b/libraries/GSM/GSM3ShieldV1DataNetworkProvider.cpp
@@ -0,0 +1,363 @@
+#include <GSM3ShieldV1DataNetworkProvider.h>
+#include <Arduino.h>
+
+char _command_CGATT[] PROGMEM = "AT+CGATT=";
+char _command_SEPARATOR[] PROGMEM = "\",\"";
+
+//Attach GPRS main function.
+GSM3_NetworkStatus_t GSM3ShieldV1DataNetworkProvider::attachGPRS(char* apn, char* user_name, char* password, bool synchronous)
+{
+ user = user_name;
+ passwd = password;
+ // A sad use of byte reuse
+ theGSM3ShieldV1ModemCore.setPhoneNumber(apn);
+
+ theGSM3ShieldV1ModemCore.openCommand(this,ATTACHGPRS);
+ theGSM3ShieldV1ModemCore.setStatus(CONNECTING);
+
+ attachGPRSContinue();
+
+ // If synchronous, wait till attach is over, or not.
+ if(synchronous)
+ {
+ // if we shorten this delay, the command fails
+ while(ready()==0)
+ delay(100);
+ }
+
+ return theGSM3ShieldV1ModemCore.getStatus();
+}
+
+//Atthach GPRS continue function.
+void GSM3ShieldV1DataNetworkProvider::attachGPRSContinue()
+{
+ bool resp;
+ // 1: Attach to GPRS service "AT+CGATT=1"
+ // 2: Wait attach OK and Set the context 0 as FGCNT "AT+QIFGCNT=0"
+ // 3: Wait context OK and Set bearer type as GPRS, APN, user name and pasword "AT+QICSGP=1..."
+ // 4: Wait bearer OK and Enable the function of MUXIP "AT+QIMUX=1"
+ // 5: Wait for disable MUXIP OK and Set the session mode as non transparent "AT+QIMODE=0"
+ // 6: Wait for session mode OK and Enable notification when data received "AT+QINDI=1"
+ // 8: Wait domain name OK and Register the TCP/IP stack "AT+QIREGAPP"
+ // 9: Wait for Register OK and Activate FGCNT "AT+QIACT"
+ // 10: Wait for activate OK
+
+ int ct=theGSM3ShieldV1ModemCore.getCommandCounter();
+ if(ct==1)
+ {
+ //AT+CGATT
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_CGATT,false);
+ theGSM3ShieldV1ModemCore.print(1);
+ theGSM3ShieldV1ModemCore.print('\r');
+ theGSM3ShieldV1ModemCore.setCommandCounter(2);
+ }
+ else if(ct==2)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ //AT+QIFGCNT
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QIFGCNT=0"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(3);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==3)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ // Great. Go for the next step
+ //DEBUG
+ //Serial.println("AT+QICSGP.");
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QICSGP=1,\""),false);
+ theGSM3ShieldV1ModemCore.print(theGSM3ShieldV1ModemCore.getPhoneNumber());
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_SEPARATOR,false);
+ theGSM3ShieldV1ModemCore.print(user);
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_SEPARATOR,false);
+ theGSM3ShieldV1ModemCore.print(passwd);
+ theGSM3ShieldV1ModemCore.print("\"\r");
+ theGSM3ShieldV1ModemCore.setCommandCounter(4);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==4)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ // AT+QIMUX=1 for multisocket
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QIMUX=0"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(5);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==5)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ //AT+QIMODE=0 for multisocket
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QIMODE=1"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(6);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==6)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ // AT+QINDI=1
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QINDI=1"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(8);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==8)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ // AT+QIREGAPP
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QIREGAPP"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(9);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==9)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if(resp)
+ {
+ // AT+QIACT
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QIACT"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(10);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+ else if(ct==10)
+ {
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ if (resp)
+ {
+ theGSM3ShieldV1ModemCore.setStatus(GPRS_READY);
+ theGSM3ShieldV1ModemCore.closeCommand(1);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ }
+}
+
+//Detach GPRS main function.
+GSM3_NetworkStatus_t GSM3ShieldV1DataNetworkProvider::detachGPRS(bool synchronous)
+{
+ theGSM3ShieldV1ModemCore.openCommand(this,DETACHGPRS);
+ theGSM3ShieldV1ModemCore.setStatus(CONNECTING);
+ detachGPRSContinue();
+
+ if(synchronous)
+ {
+ while(ready()==0)
+ delay(1);
+ }
+
+ return theGSM3ShieldV1ModemCore.getStatus();
+}
+
+void GSM3ShieldV1DataNetworkProvider::detachGPRSContinue()
+{
+ bool resp;
+ // 1: Detach to GPRS service "AT+CGATT=0"
+ // 2: Wait dettach +PDP DEACT
+ // 3: Wait for OK
+
+ switch (theGSM3ShieldV1ModemCore.getCommandCounter()) {
+ case 1:
+ //AT+CGATT=0
+ theGSM3ShieldV1ModemCore.genericCommand_rq(_command_CGATT,false);
+ theGSM3ShieldV1ModemCore.print(0);
+ theGSM3ShieldV1ModemCore.print('\r');
+ theGSM3ShieldV1ModemCore.setCommandCounter(2);
+ break;
+ case 2:
+ char auxLocate[12];
+ prepareAuxLocate(PSTR("+PDP DEACT"), auxLocate);
+ if(theGSM3ShieldV1ModemCore.theBuffer().locate(auxLocate))
+ {
+ if(resp)
+ {
+ // Received +PDP DEACT;
+ theGSM3ShieldV1ModemCore.setCommandCounter(3);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ break;
+ case 3:
+ if(theGSM3ShieldV1ModemCore.genericParse_rsp(resp))
+ {
+ // OK received
+ if (resp)
+ {
+ theGSM3ShieldV1ModemCore.setStatus(GSM_READY);
+ theGSM3ShieldV1ModemCore.closeCommand(1);
+ }
+ else theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ break;
+ }
+}
+
+//QILOCIP parse.
+bool GSM3ShieldV1DataNetworkProvider::parseQILOCIP_rsp(char* LocalIP, int LocalIPlength, bool& rsp)
+{
+ if (!(theGSM3ShieldV1ModemCore.theBuffer().extractSubstring("\r\n","\r\n", LocalIP, LocalIPlength)))
+ rsp = false;
+ else
+ rsp = true;
+ return true;
+}
+
+//Get IP main function.
+int GSM3ShieldV1DataNetworkProvider::getIP(char* LocalIP, int LocalIPlength)
+{
+ theGSM3ShieldV1ModemCore.setPhoneNumber(LocalIP);
+ theGSM3ShieldV1ModemCore.setPort(LocalIPlength);
+ theGSM3ShieldV1ModemCore.openCommand(this,GETIP);
+ getIPContinue();
+ return theGSM3ShieldV1ModemCore.getCommandError();
+}
+
+void GSM3ShieldV1DataNetworkProvider::getIPContinue()
+{
+
+ bool resp;
+ // 1: Read Local IP "AT+QILOCIP"
+ // 2: Waiting for IP.
+
+ switch (theGSM3ShieldV1ModemCore.getCommandCounter()) {
+ case 1:
+ //AT+QILOCIP
+ theGSM3ShieldV1ModemCore.genericCommand_rq(PSTR("AT+QILOCIP"));
+ theGSM3ShieldV1ModemCore.setCommandCounter(2);
+ break;
+ case 2:
+ if(parseQILOCIP_rsp(theGSM3ShieldV1ModemCore.getPhoneNumber(), theGSM3ShieldV1ModemCore.getPort(), resp))
+ {
+ if (resp)
+ theGSM3ShieldV1ModemCore.closeCommand(1);
+ else
+ theGSM3ShieldV1ModemCore.closeCommand(3);
+ }
+ theGSM3ShieldV1ModemCore.theBuffer().flush();
+ theGSM3ShieldV1ModemCore.gss.spaceAvailable();
+ break;
+ }
+}
+
+//Get IP with IPAddress object
+IPAddress GSM3ShieldV1DataNetworkProvider::getIPAddress() {
+ char ip_temp[15]="";
+ getIP(ip_temp, 15);
+ unsigned long m=millis();
+
+ while((millis()-m)<10*1000 && (!ready())){
+ // wait for a response from the modem:
+ delay(100);
+ }
+ IPAddress ip;
+ inet_aton(ip_temp, ip);
+ return ip;
+}
+
+int GSM3ShieldV1DataNetworkProvider::inet_aton(const char* aIPAddrString, IPAddress& aResult)
+{
+ // See if we've been given a valid IP address
+ const char* p =aIPAddrString;
+ while (*p &&
+ ( (*p == '.') || (*p >= '0') || (*p <= '9') ))
+ {
+ p++;
+ }
+
+ if (*p == '\0')
+ {
+ // It's looking promising, we haven't found any invalid characters
+ p = aIPAddrString;
+ int segment =0;
+ int segmentValue =0;
+ while (*p && (segment < 4))
+ {
+ if (*p == '.')
+ {
+ // We've reached the end of a segment
+ if (segmentValue > 255)
+ {
+ // You can't have IP address segments that don't fit in a byte
+ return 0;
+ }
+ else
+ {
+ aResult[segment] = (byte)segmentValue;
+ segment++;
+ segmentValue = 0;
+ }
+ }
+ else
+ {
+ // Next digit
+ segmentValue = (segmentValue*10)+(*p - '0');
+ }
+ p++;
+ }
+ // We've reached the end of address, but there'll still be the last
+ // segment to deal with
+ if ((segmentValue > 255) || (segment > 3))
+ {
+ // You can't have IP address segments that don't fit in a byte,
+ // or more than four segments
+ return 0;
+ }
+ else
+ {
+ aResult[segment] = (byte)segmentValue;
+ return 1;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+//Response management.
+void GSM3ShieldV1DataNetworkProvider::manageResponse(byte from, byte to)
+{
+ switch(theGSM3ShieldV1ModemCore.getOngoingCommand())
+ {
+ case ATTACHGPRS:
+ attachGPRSContinue();
+ break;
+ case DETACHGPRS:
+ detachGPRSContinue();
+ break;
+ case GETIP:
+ getIPContinue();
+ break;
+ }
+}