@@ -31,45 +31,168 @@ class GSMConnectionManager : public ConnectionManager {
3131 GSM gsmAccess;
3232 GPRS gprs;
3333private:
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+
3446 const char *pin, *apn, *login, *pass;
35- unsigned long lastNetworkCheck, lastNetworkStep;
47+ unsigned long lastConnectionTickTime, lastNetworkStep;
48+ int connectionTickTimeInterval;
3649};
3750
3851static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000 ;
3952
4053GSMConnectionManager::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) {
4260}
4361
4462unsigned long GSMConnectionManager::getTime () {
4563 return gsmAccess.getTime ();
4664}
4765
4866void 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);
5773 } else {
58- Serial.println (" GPRS not connected" );
74+ *msgBuffer = 0 ;
75+ sprintf (msgBuffer, " SIM not present" );
76+ debugMessage (msgBuffer, 2 );
5977 while (1 );
6078 }
6179}
6280
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 ;
66100 }
101+ connectionTickTimeInterval = newInterval;
102+ lastConnectionTickTime = millis ();
103+ }
67104
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;
74197 }
75198}
0 commit comments