Modified version of NetServices. Fixes an issue where connections failed should the HTTP response status line be received in a packet on its own prior to any further headers. Changes are made to the HTTPClient.cpp file's readHeaders method.
Diff: drv/gprs/GPRSModem.cpp
- Revision:
- 0:ec559500a63f
diff -r 000000000000 -r ec559500a63f drv/gprs/GPRSModem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/drv/gprs/GPRSModem.cpp Fri Apr 08 14:39:41 2011 +0000 @@ -0,0 +1,292 @@ + +/* +Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) + +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. +*/ + +#include "GPRSModem.h" +#include "mbed.h" + +//#define __DEBUG +#include "dbg/dbg.h" + +#define WAIT_BTW_NETW_POLLS 3. + +#include "netCfg.h" +#if NET_GPRS + +GPRSModem::GPRSModem() : ATIf() +{ + DBG("New GPRSModem@%p\n", this); +} + +GPRSModem::~GPRSModem() +{ + +} + +GPRSErr GPRSModem::getNetworkState() +{ + ATIf::flushBuffer(); + /* + netState can be : (Telit_AT_Reference_Guide.pdf p.98) + 0 - not registered, ME is not currently searching a new operator to register to + 1 - registered, home network + 2 - not registered, but ME is currently searching a new operator to register to + 3 - registration denied + 4 - unknown + 5 - registered, roaming + */ + // DBG("Network?...\r\n"); + ATIf::setReadMode(false); //Discard chars + ATIf::setTimeout(10000); + ATIf::setLineMode(true); //Line mode + int netState = 0; + int len; + len = ATIf::printf("AT+CREG?"); //Registered ? + if(!len) DBG("\r\nprintf - len=%d\r\n",len); + if(!len) + return GPRS_MODEM; //Nothing was actually sent + + len = ATIf::scanf("+CREG: 0,%d", &netState); //Get status + if(len != 1) DBG("\r\nscanf - len=%d\r\n",len); + if(len != 1) //Likely +CMS ERROR was returned + return GPRS_MODEM; + + if( !!ATIf::checkOK() ) //Should not be a problem + {DBG("\r\nNOK\r\n"); return GPRS_MODEM; } + + switch(netState) + { + case 1: + case 5: //TODO: Option allow roaming + DBG("\r\nNetwork is up!\r\n"); + return GPRS_OK; + case 3: + DBG("\r\nAccess to network denied.\r\n"); + return GPRS_DENIED; + case 0: + DBG("\r\nNo network.\r\n"); + return GPRS_NONETWORK; + case 4: + case 2: + //DBG("\r\nRegistering...\r\n"); + return GPRS_REGISTERING; + } + + return GPRS_MODEM; // Should not reach this + +} + +GPRSErr GPRSModem::setNetworkUp() +{ + ATIf::flushBuffer(); + GPRSErr err = GPRS_REGISTERING; + while(true) + { + err = getNetworkState(); + if(err != GPRS_REGISTERING) + break; + wait(WAIT_BTW_NETW_POLLS); + } + return err; +} + +//Same, but for GPRS +GPRSErr GPRSModem::getGPRSState() +{ + ATIf::flushBuffer(); + /* + netState can be : (Telit_AT_Reference_Guide.pdf p.192) + 0 - not registered, terminal is not currently searching a new operator to register to + 1 - registered, home network + 2 - not registered, but terminal is currently searching a new operator to register to + 3 - registration denied + 4 - unknown + 5 - registered, roaming + */ + + DBG("GPRS?...\r\n"); + ATIf::setReadMode(false); //Discard chars + ATIf::setTimeout(10000); + ATIf::setLineMode(true); //Line mode + int netState = 0; + int len; + len = ATIf::printf("AT+CGREG?"); //Registered ? + if(!len) + return GPRS_MODEM; //Nothing was actually sent + + len = ATIf::scanf("+CGREG: %*d,%d", &netState); //Get GPRS status, see GSM 07.07 spec as Telit AT ref is wrong + if(len != 1) DBG("\r\nscanf - len=%d\r\n",len); + if(len != 1) //Likely +CMS ERROR was returned + return GPRS_MODEM; + + if( !!ATIf::checkOK() ) //Should not be a problem + return GPRS_MODEM; + + switch(netState) + { + case 1: + case 5: //TODO: Option allow roaming + DBG("\r\nNetwork is up!\r\n"); + return GPRS_OK; + case 3: + DBG("\r\nAccess to network denied.\r\n"); + return GPRS_DENIED; + case 0: + DBG("\r\nNo network.\r\n"); + return GPRS_NONETWORK; + case 4: + case 2: + DBG("\r\nRegistering...\r\n"); + return GPRS_REGISTERING; + } + + return GPRS_MODEM; // Should not reach this + +} + +GPRSErr GPRSModem::setGPRSUp() +{ + ATIf::flushBuffer(); + GPRSErr err; + + err = setNetworkUp(); + if(err) + return err; + + DBG("\r\nAttaching GPRS...\r\n"); + ATIf::setReadMode(false); //Discard chars + ATIf::setTimeout(10000); + ATIf::setLineMode(true); //Line mode + int len; + + err = getGPRSState(); + if(err == GPRS_NONETWORK) + { + len = ATIf::printf("AT+CGATT=1"); //Attach + if(!len) + return GPRS_MODEM; //Nothing was actually sent + + if( !!ATIf::checkOK() ) //Should not be a problem + return GPRS_MODEM; + } + + while(true) + { + err = getGPRSState(); + if(err != GPRS_REGISTERING) + break; + wait(WAIT_BTW_NETW_POLLS); + } + return err; +} + +GPRSErr GPRSModem::setGPRSDown() +{ + ATIf::flushBuffer(); + DBG("\r\nDetaching GPRS...\r\n"); + ATIf::setReadMode(false); //Discard chars + ATIf::setTimeout(10000); + ATIf::setLineMode(true); //Line mode + int len; + + len = ATIf::printf("AT+CGATT=0"); //Detach + if(!len) + return GPRS_MODEM; //Nothing was actually sent + + if( !!ATIf::checkOK() ) //Should not be a problem + return GPRS_MODEM; + + return GPRS_OK; +} + + +GPRSErr GPRSModem::connect(const char* apn /*=NULL*/) +{ + ATIf::flushBuffer(); + GPRSErr err; + + ATIf::setReadMode(false); //Discard chars + ATIf::setTimeout(5000); + ATIf::setLineMode(true); //Line mode + + DBG("\r\nConnecting...\r\n"); + + int len; + + if( apn != NULL ) //Config APN + { + len = ATIf::printf("AT+CGDCONT=1,\"IP\",\"%s\"",apn); //Define APN + if(!len) + return GPRS_MODEM; //Nothing was actually sent + + if( !!ATIf::checkOK() ) //Should not be a problem + return GPRS_MODEM; + } + + err = setGPRSUp(); + if(err) + return err; + + ATIf::setReadMode(false); //Discard chars + ATIf::setTimeout(60000); + ATIf::setLineMode(true); //Line mode + // + //len = ATIf::printf("AT+CGDATA=\"PPP\",1"); //Connect using PDP context #1 +// len = ATIf::printf("ATDT *99***1#"); + len = ATIf::printf("ATDT *99#"); + if(!len) + return GPRS_MODEM; //Nothing was actually sent + + len = ATIf::scanf("CONNECT"); //Beginning of session + if(len != 0) //Likely +CME ERROR was returned or NO CARRIER + return GPRS_MODEM; + + //ATIf::setSignals(false); + + DBG("\r\nConnected.\r\n"); + + return GPRS_OK; //Time to enter a PPP Session ! + +} + +GPRSErr GPRSModem::disconnect() +{ + ATIf::flushBuffer(); + ATIf::setReadMode(false); //Discard chars + ATIf::setTimeout(5000); + ATIf::setLineMode(true); //Line mode + + if( !!ATIf::checkOK() ) //Should be present at the end of connection + return GPRS_MODEM; + + GPRSErr err; + err = setGPRSDown(); + if(err) + return err; + + DBG("\r\nDisconnected.\r\n"); + + return GPRS_OK; +} + +#endif +