@@ -31,45 +31,168 @@ class GSMConnectionManager : public ConnectionManager {
31
31
GSM gsmAccess;
32
32
GPRS gprs;
33
33
private:
34
+
35
+ void changeConnectionState (NetworkConnectionState _newState);
36
+
37
+ const int CHECK_INTERVAL_IDLE = 100 ;
38
+ const int CHECK_INTERVAL_INIT = 100 ;
39
+ const int CHECK_INTERVAL_CONNECTING = 500 ;
40
+ const int CHECK_INTERVAL_GETTIME = 1000 ;
41
+ const int CHECK_INTERVAL_CONNECTED = 10000 ;
42
+ const int CHECK_INTERVAL_RETRYING = 5000 ;
43
+ const int CHECK_INTERVAL_DISCONNECTED = 1000 ;
44
+ const int CHECK_INTERVAL_ERROR = 500 ;
45
+
34
46
const char *pin, *apn, *login, *pass;
35
- unsigned long lastNetworkCheck, lastNetworkStep;
47
+ unsigned long lastConnectionTickTime, lastNetworkStep;
48
+ int connectionTickTimeInterval;
36
49
};
37
50
38
51
static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000 ;
39
52
40
53
GSMConnectionManager::GSMConnectionManager (const char *pin, const char *apn, const char *login, const char *pass) :
41
- pin(pin), apn(apn), login(login), pass(pass), lastNetworkCheck(millis()) {
54
+ pin(pin),
55
+ apn(apn),
56
+ login(login),
57
+ pass(pass),
58
+ lastConnectionTickTime(millis()),
59
+ connectionTickTimeInterval(CHECK_INTERVAL_IDLE) {
42
60
}
43
61
44
62
unsigned long GSMConnectionManager::getTime () {
45
63
return gsmAccess.getTime ();
46
64
}
47
65
48
66
void GSMConnectionManager::init () {
49
- if (gsmAccess.begin (pin) == GSM_READY && gprs.attachGPRS (apn, login, pass) == GPRS_READY) {
50
- Serial.println (" GPRS connected" );
51
- int pingResult = gprs.ping (" google.com" );
52
- if (pingResult >= 0 ) {
53
- Serial.print (" SUCCESS! RTT = " );
54
- Serial.print (pingResult);
55
- Serial.println (" ms" );
56
- }
67
+ char msgBuffer[120 ];
68
+ if (gsmAccess.begin (pin) == GSM_READY) {
69
+ *msgBuffer = 0 ;
70
+ sprintf (msgBuffer, " SIM card ok" );
71
+ debugMessage (msgBuffer, 2 );
72
+ gsmAccess.setTimeout (CHECK_INTERVAL_RETRYING);
57
73
} else {
58
- Serial.println (" GPRS not connected" );
74
+ *msgBuffer = 0 ;
75
+ sprintf (msgBuffer, " SIM not present" );
76
+ debugMessage (msgBuffer, 2 );
59
77
while (1 );
60
78
}
61
79
}
62
80
63
- void GSMConnectionManager::check () {
64
- if (millis () - lastNetworkCheck < NETWORK_CONNECTION_INTERVAL) {
65
- return ;
81
+ void GSMConnectionManager::changeConnectionState (NetworkConnectionState _newState) {
82
+ netConnectionState = _newState;
83
+ int newInterval = CHECK_INTERVAL_IDLE;
84
+ switch (_newState) {
85
+ case CONNECTION_STATE_INIT:
86
+ newInterval = CHECK_INTERVAL_INIT;
87
+ break ;
88
+ case CONNECTION_STATE_CONNECTING:
89
+ newInterval = CHECK_INTERVAL_CONNECTING;
90
+ break ;
91
+ case CONNECTION_STATE_GETTIME:
92
+ newInterval = CHECK_INTERVAL_GETTIME;
93
+ break ;
94
+ case CONNECTION_STATE_CONNECTED:
95
+ newInterval = CHECK_INTERVAL_CONNECTED;
96
+ break ;
97
+ case CONNECTION_STATE_DISCONNECTED:
98
+ newInterval = CHECK_INTERVAL_DISCONNECTED;
99
+ break ;
66
100
}
101
+ connectionTickTimeInterval = newInterval;
102
+ lastConnectionTickTime = millis ();
103
+ }
67
104
68
- Serial.print (" <<Network Status: " );
69
- if (gprs.attachGPRS (apn, login, pass) == GPRS_READY) {
70
- Serial.println (" CONNECTED" );
71
- lastNetworkCheck = millis ();
72
- } else {
73
- Serial.println (" NOT CONNECTED" );
105
+ void GSMConnectionManager::check () {
106
+ char msgBuffer[120 ];
107
+ unsigned long now = millis ();
108
+ int networkStatus = 0 ;
109
+ if (now - lastConnectionTickTime > connectionTickTimeInterval) {
110
+ switch (netConnectionState) {
111
+ case CONNECTION_STATE_IDLE:
112
+ init ();
113
+ changeConnectionState (CONNECTION_STATE_INIT);
114
+ break ;
115
+ case CONNECTION_STATE_INIT:
116
+ // blocking call with 4th parameter == true
117
+ networkStatus = gprs.attachGPRS (apn, login, pass, true );
118
+ *msgBuffer = 0 ;
119
+ sprintf (msgBuffer, " GPRS.attachGPRS(): %d" , networkStatus);
120
+ debugMessage (msgBuffer, 2 );
121
+ if (networkStatus == ERROR) {
122
+ debugMessage (" GPRS attach failed\n Make sure the antenna is connected" , 0 );
123
+ changeConnectionState (CONNECTION_STATE_INIT);
124
+ lastConnectionTickTime = now;
125
+ return ;
126
+ }
127
+ changeConnectionState (CONNECTION_STATE_CONNECTING);
128
+ break ;
129
+ case CONNECTION_STATE_CONNECTING:
130
+ *msgBuffer = 0 ;
131
+ sprintf (msgBuffer, " Trying to ping external world" );
132
+ debugMessage (msgBuffer, 2 );
133
+
134
+ networkStatus = gprs.ping (" google.com" );
135
+ *msgBuffer = 0 ;
136
+ sprintf (msgBuffer, " GSM.ping(): %d" , networkStatus);
137
+ debugMessage (msgBuffer, 2 );
138
+ if (networkStatus < 0 ) {
139
+ *msgBuffer = 0 ;
140
+ sprintf (msgBuffer, " Ping failed" );
141
+ debugMessage (msgBuffer, 0 );
142
+
143
+ *msgBuffer = 0 ;
144
+ sprintf (msgBuffer, " Retrying in \" %d\" milliseconds" , connectionTickTimeInterval);
145
+ debugMessage (msgBuffer, 2 );
146
+ changeConnectionState (CONNECTION_STATE_INIT);
147
+ return ;
148
+ } else {
149
+ *msgBuffer = 0 ;
150
+ sprintf (msgBuffer, " Connected!" );
151
+ debugMessage (msgBuffer, 2 );
152
+ changeConnectionState (CONNECTION_STATE_GETTIME);
153
+ return ;
154
+ }
155
+ break ;
156
+ case CONNECTION_STATE_GETTIME:
157
+ debugMessage (" Acquiring Time from Network" , 3 );
158
+ unsigned long networkTime;
159
+ networkTime = getTime ();
160
+ *msgBuffer = 0 ;
161
+ sprintf (msgBuffer, " Network Time: %u" , networkTime);
162
+ debugMessage (msgBuffer, 3 );
163
+ if (networkTime > lastValidTimestamp){
164
+ lastValidTimestamp = networkTime;
165
+ changeConnectionState (CONNECTION_STATE_CONNECTED);
166
+ }
167
+ break ;
168
+ case CONNECTION_STATE_CONNECTED:
169
+ // keep testing connection
170
+ networkStatus = gsmAccess.isAccessAlive ();
171
+ *msgBuffer = 0 ;
172
+ sprintf (msgBuffer, " GPRS.isAccessAlive(): %d" , networkStatus);
173
+ debugMessage (msgBuffer, 2 );
174
+ if (networkStatus != 1 ) {
175
+ changeConnectionState (CONNECTION_STATE_DISCONNECTED);
176
+ return ;
177
+ }
178
+ *msgBuffer = 0 ;
179
+ sprintf (msgBuffer, " Still connected" );
180
+ debugMessage (msgBuffer, 2 );
181
+ break ;
182
+ case CONNECTION_STATE_DISCONNECTED:
183
+ gprs.detachGPRS ();
184
+
185
+ *msgBuffer = 0 ;
186
+ sprintf (msgBuffer, " DISC | GPRS.status(): %d" , gprs.status ());
187
+ debugMessage (msgBuffer, 1 );
188
+ *msgBuffer = 0 ;
189
+ sprintf (msgBuffer, " Connection lost." );
190
+ debugMessage (msgBuffer, 0 );
191
+ debugMessage (" Attempting reconnection" , 1 );
192
+ changeConnectionState (CONNECTION_STATE_CONNECTING);
193
+ // wifiClient.stop();
194
+ break ;
195
+ }
196
+ lastConnectionTickTime = now;
74
197
}
75
198
}
0 commit comments