forked from carrascoacd/ArduinoSIM800L
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGPRS.cpp
107 lines (92 loc) · 3.57 KB
/
GPRS.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
* GPRS.cpp
* GPRS module that implements the basic AT sequences to interact with GPRS
*
* Copyright 2021 Antonio Carrasco
*
* The MIT License (MIT)
*
* 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 "GPRS.h"
#include <string.h>
const char BEARER_PROFILE_GPRS[] PROGMEM = "AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n";
const char BEARER_PROFILE_APN[] PROGMEM = "AT+SAPBR=3,1,\"APN\",\"%s\"\r\n";
const char QUERY_BEARER[] PROGMEM = "AT+SAPBR=2,1\r\n";
const char OPEN_GPRS_CONTEXT[] PROGMEM = "AT+SAPBR=1,1\r\n";
const char CLOSE_GPRS_CONTEXT[] PROGMEM = "AT+SAPBR=0,1\r\n";
const char SIGNAL_QUALITY[] PROGMEM = "AT+CSQ\r\n";
const char READ_VOLTAGE[] PROGMEM = "AT+CBC\r\n";
const char REGISTRATION_STATUS[] PROGMEM = "AT+CREG?\r\n";
const char CONNECTED[] PROGMEM = "+CREG: 0,1";
const char ROAMING[] PROGMEM = "+CREG: 0,5";
const char BEARER_OPEN[] PROGMEM = "+SAPBR: 1,1";
const char AT_OK[] PROGMEM = "OK";
const char AT_OK_[] = "OK";
Result openGPRSContext(SIM800 *sim800, const char *apn)
{
Result result = SUCCESS;
uint8_t attempts = 0;
uint8_t MAX_ATTEMPTS = 10;
sim800->sendATTest();
while ((sim800->sendCmdAndWaitForResp_P(REGISTRATION_STATUS, CONNECTED, 12000) != TRUE &&
sim800->sendCmdAndWaitForResp_P(REGISTRATION_STATUS, ROAMING, 12000) != TRUE) &&
attempts < MAX_ATTEMPTS)
{
sim800->sendCmdAndWaitForResp_P(READ_VOLTAGE, AT_OK, 2000);
sim800->sendCmdAndWaitForResp_P(SIGNAL_QUALITY, AT_OK, 2000);
attempts++;
delay(1000 * attempts);
if (attempts == MAX_ATTEMPTS)
{
sim800->preInit();
// Return in order to let the client to decide what to do instead of
// retrying automatically forever
return ERROR_INITIALIZATION;
}
}
if (sim800->sendCmdAndWaitForResp_P(BEARER_PROFILE_GPRS, AT_OK, 14000) == FALSE)
result = ERROR_BEARER_PROFILE_GPRS;
char httpApn[64];
char tmp[24];
strcpy_P(tmp, apn);
sprintf_P(httpApn, BEARER_PROFILE_APN, tmp);
if (sim800->sendCmdAndWaitForResp(httpApn, AT_OK_, 10000) == FALSE)
result = ERROR_BEARER_PROFILE_APN;
while (sim800->sendCmdAndWaitForResp_P(QUERY_BEARER, BEARER_OPEN, 10000) == FALSE && attempts < MAX_ATTEMPTS)
{
attempts++;
if (sim800->sendCmdAndWaitForResp_P(OPEN_GPRS_CONTEXT, AT_OK, 10000) == FALSE)
{
result = ERROR_OPEN_GPRS_CONTEXT;
}
else
{
result = SUCCESS;
}
}
return result;
}
Result closeGPRSContext(SIM800 *sim800)
{
Result result = SUCCESS;
if (sim800->sendCmdAndWaitForResp_P(CLOSE_GPRS_CONTEXT, AT_OK, 4000) == FALSE)
result = ERROR_CLOSE_GPRS_CONTEXT;
return result;
}