This library is stripped down version of NetServices library. HTTP server and client function is NOT supported.

Dependents:   imu-daq-eth

Committer:
idinor
Date:
Wed Jul 20 11:45:39 2011 +0000
Revision:
0:dcf3c92487ca

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
idinor 0:dcf3c92487ca 1
idinor 0:dcf3c92487ca 2 /*
idinor 0:dcf3c92487ca 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
idinor 0:dcf3c92487ca 4
idinor 0:dcf3c92487ca 5 Permission is hereby granted, free of charge, to any person obtaining a copy
idinor 0:dcf3c92487ca 6 of this software and associated documentation files (the "Software"), to deal
idinor 0:dcf3c92487ca 7 in the Software without restriction, including without limitation the rights
idinor 0:dcf3c92487ca 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
idinor 0:dcf3c92487ca 9 copies of the Software, and to permit persons to whom the Software is
idinor 0:dcf3c92487ca 10 furnished to do so, subject to the following conditions:
idinor 0:dcf3c92487ca 11
idinor 0:dcf3c92487ca 12 The above copyright notice and this permission notice shall be included in
idinor 0:dcf3c92487ca 13 all copies or substantial portions of the Software.
idinor 0:dcf3c92487ca 14
idinor 0:dcf3c92487ca 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
idinor 0:dcf3c92487ca 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
idinor 0:dcf3c92487ca 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
idinor 0:dcf3c92487ca 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
idinor 0:dcf3c92487ca 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
idinor 0:dcf3c92487ca 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
idinor 0:dcf3c92487ca 21 THE SOFTWARE.
idinor 0:dcf3c92487ca 22 */
idinor 0:dcf3c92487ca 23
idinor 0:dcf3c92487ca 24 #include "GPRSModem.h"
idinor 0:dcf3c92487ca 25 #include "mbed.h"
idinor 0:dcf3c92487ca 26
idinor 0:dcf3c92487ca 27 //#define __DEBUG
idinor 0:dcf3c92487ca 28 #include "dbg/dbg.h"
idinor 0:dcf3c92487ca 29
idinor 0:dcf3c92487ca 30 #define WAIT_BTW_NETW_POLLS 3.
idinor 0:dcf3c92487ca 31
idinor 0:dcf3c92487ca 32 #include "netCfg.h"
idinor 0:dcf3c92487ca 33 #if NET_GPRS
idinor 0:dcf3c92487ca 34
idinor 0:dcf3c92487ca 35 GPRSModem::GPRSModem() : ATIf()
idinor 0:dcf3c92487ca 36 {
idinor 0:dcf3c92487ca 37 DBG("New GPRSModem@%p\n", this);
idinor 0:dcf3c92487ca 38 }
idinor 0:dcf3c92487ca 39
idinor 0:dcf3c92487ca 40 GPRSModem::~GPRSModem()
idinor 0:dcf3c92487ca 41 {
idinor 0:dcf3c92487ca 42
idinor 0:dcf3c92487ca 43 }
idinor 0:dcf3c92487ca 44
idinor 0:dcf3c92487ca 45 GPRSErr GPRSModem::getNetworkState()
idinor 0:dcf3c92487ca 46 {
idinor 0:dcf3c92487ca 47 ATIf::flushBuffer();
idinor 0:dcf3c92487ca 48 /*
idinor 0:dcf3c92487ca 49 netState can be : (Telit_AT_Reference_Guide.pdf p.98)
idinor 0:dcf3c92487ca 50 0 - not registered, ME is not currently searching a new operator to register to
idinor 0:dcf3c92487ca 51 1 - registered, home network
idinor 0:dcf3c92487ca 52 2 - not registered, but ME is currently searching a new operator to register to
idinor 0:dcf3c92487ca 53 3 - registration denied
idinor 0:dcf3c92487ca 54 4 - unknown
idinor 0:dcf3c92487ca 55 5 - registered, roaming
idinor 0:dcf3c92487ca 56 */
idinor 0:dcf3c92487ca 57 // DBG("Network?...\r\n");
idinor 0:dcf3c92487ca 58 ATIf::setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 59 ATIf::setTimeout(10000);
idinor 0:dcf3c92487ca 60 ATIf::setLineMode(true); //Line mode
idinor 0:dcf3c92487ca 61 int netState = 0;
idinor 0:dcf3c92487ca 62 int len;
idinor 0:dcf3c92487ca 63 len = ATIf::printf("AT+CREG?"); //Registered ?
idinor 0:dcf3c92487ca 64 if(!len) DBG("\r\nprintf - len=%d\r\n",len);
idinor 0:dcf3c92487ca 65 if(!len)
idinor 0:dcf3c92487ca 66 return GPRS_MODEM; //Nothing was actually sent
idinor 0:dcf3c92487ca 67
idinor 0:dcf3c92487ca 68 len = ATIf::scanf("+CREG: 0,%d", &netState); //Get status
idinor 0:dcf3c92487ca 69 if(len != 1) DBG("\r\nscanf - len=%d\r\n",len);
idinor 0:dcf3c92487ca 70 if(len != 1) //Likely +CMS ERROR was returned
idinor 0:dcf3c92487ca 71 return GPRS_MODEM;
idinor 0:dcf3c92487ca 72
idinor 0:dcf3c92487ca 73 if( !!ATIf::checkOK() ) //Should not be a problem
idinor 0:dcf3c92487ca 74 {DBG("\r\nNOK\r\n"); return GPRS_MODEM; }
idinor 0:dcf3c92487ca 75
idinor 0:dcf3c92487ca 76 switch(netState)
idinor 0:dcf3c92487ca 77 {
idinor 0:dcf3c92487ca 78 case 1:
idinor 0:dcf3c92487ca 79 case 5: //TODO: Option allow roaming
idinor 0:dcf3c92487ca 80 DBG("\r\nNetwork is up!\r\n");
idinor 0:dcf3c92487ca 81 return GPRS_OK;
idinor 0:dcf3c92487ca 82 case 3:
idinor 0:dcf3c92487ca 83 DBG("\r\nAccess to network denied.\r\n");
idinor 0:dcf3c92487ca 84 return GPRS_DENIED;
idinor 0:dcf3c92487ca 85 case 0:
idinor 0:dcf3c92487ca 86 DBG("\r\nNo network.\r\n");
idinor 0:dcf3c92487ca 87 return GPRS_NONETWORK;
idinor 0:dcf3c92487ca 88 case 4:
idinor 0:dcf3c92487ca 89 case 2:
idinor 0:dcf3c92487ca 90 //DBG("\r\nRegistering...\r\n");
idinor 0:dcf3c92487ca 91 return GPRS_REGISTERING;
idinor 0:dcf3c92487ca 92 }
idinor 0:dcf3c92487ca 93
idinor 0:dcf3c92487ca 94 return GPRS_MODEM; // Should not reach this
idinor 0:dcf3c92487ca 95
idinor 0:dcf3c92487ca 96 }
idinor 0:dcf3c92487ca 97
idinor 0:dcf3c92487ca 98 GPRSErr GPRSModem::setNetworkUp()
idinor 0:dcf3c92487ca 99 {
idinor 0:dcf3c92487ca 100 ATIf::flushBuffer();
idinor 0:dcf3c92487ca 101 GPRSErr err = GPRS_REGISTERING;
idinor 0:dcf3c92487ca 102 while(true)
idinor 0:dcf3c92487ca 103 {
idinor 0:dcf3c92487ca 104 err = getNetworkState();
idinor 0:dcf3c92487ca 105 if(err != GPRS_REGISTERING)
idinor 0:dcf3c92487ca 106 break;
idinor 0:dcf3c92487ca 107 wait(WAIT_BTW_NETW_POLLS);
idinor 0:dcf3c92487ca 108 }
idinor 0:dcf3c92487ca 109 return err;
idinor 0:dcf3c92487ca 110 }
idinor 0:dcf3c92487ca 111
idinor 0:dcf3c92487ca 112 //Same, but for GPRS
idinor 0:dcf3c92487ca 113 GPRSErr GPRSModem::getGPRSState()
idinor 0:dcf3c92487ca 114 {
idinor 0:dcf3c92487ca 115 ATIf::flushBuffer();
idinor 0:dcf3c92487ca 116 /*
idinor 0:dcf3c92487ca 117 netState can be : (Telit_AT_Reference_Guide.pdf p.192)
idinor 0:dcf3c92487ca 118 0 - not registered, terminal is not currently searching a new operator to register to
idinor 0:dcf3c92487ca 119 1 - registered, home network
idinor 0:dcf3c92487ca 120 2 - not registered, but terminal is currently searching a new operator to register to
idinor 0:dcf3c92487ca 121 3 - registration denied
idinor 0:dcf3c92487ca 122 4 - unknown
idinor 0:dcf3c92487ca 123 5 - registered, roaming
idinor 0:dcf3c92487ca 124 */
idinor 0:dcf3c92487ca 125
idinor 0:dcf3c92487ca 126 DBG("GPRS?...\r\n");
idinor 0:dcf3c92487ca 127 ATIf::setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 128 ATIf::setTimeout(10000);
idinor 0:dcf3c92487ca 129 ATIf::setLineMode(true); //Line mode
idinor 0:dcf3c92487ca 130 int netState = 0;
idinor 0:dcf3c92487ca 131 int len;
idinor 0:dcf3c92487ca 132 len = ATIf::printf("AT+CGREG?"); //Registered ?
idinor 0:dcf3c92487ca 133 if(!len)
idinor 0:dcf3c92487ca 134 return GPRS_MODEM; //Nothing was actually sent
idinor 0:dcf3c92487ca 135
idinor 0:dcf3c92487ca 136 len = ATIf::scanf("+CGREG: %*d,%d", &netState); //Get GPRS status, see GSM 07.07 spec as Telit AT ref is wrong
idinor 0:dcf3c92487ca 137 if(len != 1) DBG("\r\nscanf - len=%d\r\n",len);
idinor 0:dcf3c92487ca 138 if(len != 1) //Likely +CMS ERROR was returned
idinor 0:dcf3c92487ca 139 return GPRS_MODEM;
idinor 0:dcf3c92487ca 140
idinor 0:dcf3c92487ca 141 if( !!ATIf::checkOK() ) //Should not be a problem
idinor 0:dcf3c92487ca 142 return GPRS_MODEM;
idinor 0:dcf3c92487ca 143
idinor 0:dcf3c92487ca 144 switch(netState)
idinor 0:dcf3c92487ca 145 {
idinor 0:dcf3c92487ca 146 case 1:
idinor 0:dcf3c92487ca 147 case 5: //TODO: Option allow roaming
idinor 0:dcf3c92487ca 148 DBG("\r\nNetwork is up!\r\n");
idinor 0:dcf3c92487ca 149 return GPRS_OK;
idinor 0:dcf3c92487ca 150 case 3:
idinor 0:dcf3c92487ca 151 DBG("\r\nAccess to network denied.\r\n");
idinor 0:dcf3c92487ca 152 return GPRS_DENIED;
idinor 0:dcf3c92487ca 153 case 0:
idinor 0:dcf3c92487ca 154 DBG("\r\nNo network.\r\n");
idinor 0:dcf3c92487ca 155 return GPRS_NONETWORK;
idinor 0:dcf3c92487ca 156 case 4:
idinor 0:dcf3c92487ca 157 case 2:
idinor 0:dcf3c92487ca 158 DBG("\r\nRegistering...\r\n");
idinor 0:dcf3c92487ca 159 return GPRS_REGISTERING;
idinor 0:dcf3c92487ca 160 }
idinor 0:dcf3c92487ca 161
idinor 0:dcf3c92487ca 162 return GPRS_MODEM; // Should not reach this
idinor 0:dcf3c92487ca 163
idinor 0:dcf3c92487ca 164 }
idinor 0:dcf3c92487ca 165
idinor 0:dcf3c92487ca 166 GPRSErr GPRSModem::setGPRSUp()
idinor 0:dcf3c92487ca 167 {
idinor 0:dcf3c92487ca 168 ATIf::flushBuffer();
idinor 0:dcf3c92487ca 169 GPRSErr err;
idinor 0:dcf3c92487ca 170
idinor 0:dcf3c92487ca 171 err = setNetworkUp();
idinor 0:dcf3c92487ca 172 if(err)
idinor 0:dcf3c92487ca 173 return err;
idinor 0:dcf3c92487ca 174
idinor 0:dcf3c92487ca 175 DBG("\r\nAttaching GPRS...\r\n");
idinor 0:dcf3c92487ca 176 ATIf::setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 177 ATIf::setTimeout(10000);
idinor 0:dcf3c92487ca 178 ATIf::setLineMode(true); //Line mode
idinor 0:dcf3c92487ca 179 int len;
idinor 0:dcf3c92487ca 180
idinor 0:dcf3c92487ca 181 err = getGPRSState();
idinor 0:dcf3c92487ca 182 if(err == GPRS_NONETWORK)
idinor 0:dcf3c92487ca 183 {
idinor 0:dcf3c92487ca 184 len = ATIf::printf("AT+CGATT=1"); //Attach
idinor 0:dcf3c92487ca 185 if(!len)
idinor 0:dcf3c92487ca 186 return GPRS_MODEM; //Nothing was actually sent
idinor 0:dcf3c92487ca 187
idinor 0:dcf3c92487ca 188 if( !!ATIf::checkOK() ) //Should not be a problem
idinor 0:dcf3c92487ca 189 return GPRS_MODEM;
idinor 0:dcf3c92487ca 190 }
idinor 0:dcf3c92487ca 191
idinor 0:dcf3c92487ca 192 while(true)
idinor 0:dcf3c92487ca 193 {
idinor 0:dcf3c92487ca 194 err = getGPRSState();
idinor 0:dcf3c92487ca 195 if(err != GPRS_REGISTERING)
idinor 0:dcf3c92487ca 196 break;
idinor 0:dcf3c92487ca 197 wait(WAIT_BTW_NETW_POLLS);
idinor 0:dcf3c92487ca 198 }
idinor 0:dcf3c92487ca 199 return err;
idinor 0:dcf3c92487ca 200 }
idinor 0:dcf3c92487ca 201
idinor 0:dcf3c92487ca 202 GPRSErr GPRSModem::setGPRSDown()
idinor 0:dcf3c92487ca 203 {
idinor 0:dcf3c92487ca 204 ATIf::flushBuffer();
idinor 0:dcf3c92487ca 205 DBG("\r\nDetaching GPRS...\r\n");
idinor 0:dcf3c92487ca 206 ATIf::setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 207 ATIf::setTimeout(10000);
idinor 0:dcf3c92487ca 208 ATIf::setLineMode(true); //Line mode
idinor 0:dcf3c92487ca 209 int len;
idinor 0:dcf3c92487ca 210
idinor 0:dcf3c92487ca 211 len = ATIf::printf("AT+CGATT=0"); //Detach
idinor 0:dcf3c92487ca 212 if(!len)
idinor 0:dcf3c92487ca 213 return GPRS_MODEM; //Nothing was actually sent
idinor 0:dcf3c92487ca 214
idinor 0:dcf3c92487ca 215 if( !!ATIf::checkOK() ) //Should not be a problem
idinor 0:dcf3c92487ca 216 return GPRS_MODEM;
idinor 0:dcf3c92487ca 217
idinor 0:dcf3c92487ca 218 return GPRS_OK;
idinor 0:dcf3c92487ca 219 }
idinor 0:dcf3c92487ca 220
idinor 0:dcf3c92487ca 221
idinor 0:dcf3c92487ca 222 GPRSErr GPRSModem::connect(const char* apn /*=NULL*/)
idinor 0:dcf3c92487ca 223 {
idinor 0:dcf3c92487ca 224 ATIf::flushBuffer();
idinor 0:dcf3c92487ca 225 GPRSErr err;
idinor 0:dcf3c92487ca 226
idinor 0:dcf3c92487ca 227 ATIf::setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 228 ATIf::setTimeout(5000);
idinor 0:dcf3c92487ca 229 ATIf::setLineMode(true); //Line mode
idinor 0:dcf3c92487ca 230
idinor 0:dcf3c92487ca 231 DBG("\r\nConnecting...\r\n");
idinor 0:dcf3c92487ca 232
idinor 0:dcf3c92487ca 233 int len;
idinor 0:dcf3c92487ca 234
idinor 0:dcf3c92487ca 235 if( apn != NULL ) //Config APN
idinor 0:dcf3c92487ca 236 {
idinor 0:dcf3c92487ca 237 len = ATIf::printf("AT+CGDCONT=1,\"IP\",\"%s\"",apn); //Define APN
idinor 0:dcf3c92487ca 238 if(!len)
idinor 0:dcf3c92487ca 239 return GPRS_MODEM; //Nothing was actually sent
idinor 0:dcf3c92487ca 240
idinor 0:dcf3c92487ca 241 if( !!ATIf::checkOK() ) //Should not be a problem
idinor 0:dcf3c92487ca 242 return GPRS_MODEM;
idinor 0:dcf3c92487ca 243 }
idinor 0:dcf3c92487ca 244
idinor 0:dcf3c92487ca 245 err = setGPRSUp();
idinor 0:dcf3c92487ca 246 if(err)
idinor 0:dcf3c92487ca 247 return err;
idinor 0:dcf3c92487ca 248
idinor 0:dcf3c92487ca 249 ATIf::setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 250 ATIf::setTimeout(60000);
idinor 0:dcf3c92487ca 251 ATIf::setLineMode(true); //Line mode
idinor 0:dcf3c92487ca 252 //
idinor 0:dcf3c92487ca 253 //len = ATIf::printf("AT+CGDATA=\"PPP\",1"); //Connect using PDP context #1
idinor 0:dcf3c92487ca 254 // len = ATIf::printf("ATDT *99***1#");
idinor 0:dcf3c92487ca 255 len = ATIf::printf("ATDT *99#");
idinor 0:dcf3c92487ca 256 if(!len)
idinor 0:dcf3c92487ca 257 return GPRS_MODEM; //Nothing was actually sent
idinor 0:dcf3c92487ca 258
idinor 0:dcf3c92487ca 259 len = ATIf::scanf("CONNECT"); //Beginning of session
idinor 0:dcf3c92487ca 260 if(len != 0) //Likely +CME ERROR was returned or NO CARRIER
idinor 0:dcf3c92487ca 261 return GPRS_MODEM;
idinor 0:dcf3c92487ca 262
idinor 0:dcf3c92487ca 263 //ATIf::setSignals(false);
idinor 0:dcf3c92487ca 264
idinor 0:dcf3c92487ca 265 DBG("\r\nConnected.\r\n");
idinor 0:dcf3c92487ca 266
idinor 0:dcf3c92487ca 267 return GPRS_OK; //Time to enter a PPP Session !
idinor 0:dcf3c92487ca 268
idinor 0:dcf3c92487ca 269 }
idinor 0:dcf3c92487ca 270
idinor 0:dcf3c92487ca 271 GPRSErr GPRSModem::disconnect()
idinor 0:dcf3c92487ca 272 {
idinor 0:dcf3c92487ca 273 ATIf::flushBuffer();
idinor 0:dcf3c92487ca 274 ATIf::setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 275 ATIf::setTimeout(5000);
idinor 0:dcf3c92487ca 276 ATIf::setLineMode(true); //Line mode
idinor 0:dcf3c92487ca 277
idinor 0:dcf3c92487ca 278 if( !!ATIf::checkOK() ) //Should be present at the end of connection
idinor 0:dcf3c92487ca 279 return GPRS_MODEM;
idinor 0:dcf3c92487ca 280
idinor 0:dcf3c92487ca 281 GPRSErr err;
idinor 0:dcf3c92487ca 282 err = setGPRSDown();
idinor 0:dcf3c92487ca 283 if(err)
idinor 0:dcf3c92487ca 284 return err;
idinor 0:dcf3c92487ca 285
idinor 0:dcf3c92487ca 286 DBG("\r\nDisconnected.\r\n");
idinor 0:dcf3c92487ca 287
idinor 0:dcf3c92487ca 288 return GPRS_OK;
idinor 0:dcf3c92487ca 289 }
idinor 0:dcf3c92487ca 290
idinor 0:dcf3c92487ca 291 #endif
idinor 0:dcf3c92487ca 292