Skip to content

Commit

Permalink
Extract GPRS functins and fix some commands
Browse files Browse the repository at this point in the history
  • Loading branch information
carrascoacd committed Dec 8, 2019
1 parent 0aca589 commit 79a2a46
Show file tree
Hide file tree
Showing 9 changed files with 179 additions and 176 deletions.
126 changes: 25 additions & 101 deletions Ftp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
*/

#include "Ftp.h"
#include <string.h>

const char AT_FTPCID[] PROGMEM = "AT+FTPCID=1\r\n";
const char AT_FTPSERV[] PROGMEM = "AT+FTPSERV=\"%s\"\r\n";
Expand All @@ -46,135 +45,68 @@ const char REGISTRATION_STATUS[] PROGMEM = "AT+CREG?\r\n";
const char SLEEP_MODE_2[] PROGMEM = "AT+CSCLK=2\r\n";

const char OK[] PROGMEM = "OK";
const char OK_[] = "OK";
const char AT_FTPPUT1_RESP[] PROGMEM = "1,1";
const char AT_FTPPUT2_RESP[] PROGMEM = "+FTPPUT: 2";
const char AT_FTPPUT20_RESP[] PROGMEM = "1,0";
const char CONNECTED[] PROGMEM = "+CREG: 0,1";
const char ROAMING[] PROGMEM = "+CREG: 0,5";
const char BEARER_OPEN[] PROGMEM = "+SAPBR: 1,1";

Result FTP::configureBearer(const char *apn)
{
Result result = SUCCESS;
char buffer[64];
char resp1[12];
char resp2[12];
unsigned int attempts = 0;
unsigned int MAX_ATTEMPTS = 10;

sendATTest();

strcpy_P(buffer, REGISTRATION_STATUS);
strcpy_P(resp1, CONNECTED);
strcpy_P(resp2, ROAMING);
while ((sendCmdAndWaitForResp(buffer, resp1, 2000) != TRUE &&
sendCmdAndWaitForResp(buffer, resp2, 2000) != TRUE) &&
attempts < MAX_ATTEMPTS)
{
attempts++;
delay(1000 * attempts);
if (attempts == MAX_ATTEMPTS)
{
attempts = 0;
preInit();
}
}
attempts = 0;

strcpy_P(buffer, BEARER_PROFILE_GPRS);
strcpy_P(resp1, OK);
if (sendCmdAndWaitForResp(buffer, resp1, 2000) == FALSE)
result = ERROR_BEARER_PROFILE_GPRS;

sprintf_P(buffer, BEARER_PROFILE_APN, apn);
strcpy_P(resp1, OK);
if (sendCmdAndWaitForResp(buffer, resp1, 2000) == FALSE)
result = ERROR_BEARER_PROFILE_APN;

strcpy_P(buffer, QUERY_BEARER);
strcpy_P(resp1, BEARER_OPEN);
while (sendCmdAndWaitForResp(buffer, resp1, 2000) == FALSE && attempts < MAX_ATTEMPTS)
{
attempts++;
if (attempts == MAX_ATTEMPTS)
{
result = ERROR_OPEN_GPRS_CONTEXT;
}
}

attempts = 0;

strcpy_P(buffer, OPEN_GPRS_CONTEXT);
strcpy_P(resp1, OK);
while (sendCmdAndWaitForResp(buffer, resp1, 2000) == FALSE && attempts < MAX_ATTEMPTS)
{
attempts++;
if (attempts == MAX_ATTEMPTS)
{
result = ERROR_QUERY_GPRS_CONTEXT;
}
}
#include "GPRS.h"

return result;
}

Result FTP::putBegin(const char *fileName,
Result FTP::putBegin(const char *apn,
const char *fileName,
const char *server,
const char *usr,
const char *pass,
const char *path)
{
Result result = SUCCESS;
Result result = openGPRSContext(*this, apn);

char buffer[64];
char resp[12];
char tmp[24];

delay(10000);
strcpy_P(buffer, AT_FTPCID);
strcpy_P(resp, OK);
if (sendCmdAndWaitForResp(buffer, resp, 2000) == FALSE)
if (sendCmdAndWaitForResp_P(AT_FTPCID, OK, 2000) == FALSE)
{
return ERROR_FTPCID;
}

sprintf_P(buffer, AT_FTPSERV, server);
strcpy_P(resp, OK);
if (sendCmdAndWaitForResp(buffer, resp, 2000) == FALSE)
strcpy_P(tmp, server);
sprintf_P(buffer, AT_FTPSERV, tmp);
if (sendCmdAndWaitForResp(buffer, OK, 2000) == FALSE)
{
return ERROR_FTPSERV;
}

sprintf_P(buffer, AT_FTPUN, usr);
strcpy_P(resp, OK);
if (sendCmdAndWaitForResp(buffer, resp, 2000) == FALSE)
strcpy_P(tmp, usr);
sprintf_P(buffer, AT_FTPUN, tmp);
if (sendCmdAndWaitForResp(buffer, OK_, 2000) == FALSE)
{
return ERROR_FTPUN;
}

sprintf_P(buffer, AT_FTPPW, pass);
strcpy_P(resp, OK);
if (sendCmdAndWaitForResp(buffer, resp, 2000) == FALSE)
strcpy_P(tmp, pass);
sprintf_P(buffer, AT_FTPPW, tmp);
if (sendCmdAndWaitForResp(buffer, OK_, 2000) == FALSE)
{
return ERROR_FTPPW;
}

sprintf_P(buffer, AT_FTPPUTNAME, fileName);
strcpy_P(resp, OK);
if (sendCmdAndWaitForResp(buffer, resp, 2000) == FALSE)
if (sendCmdAndWaitForResp(buffer, OK_, 2000) == FALSE)
{
return ERROR_FTPPUTNAME;
}

sprintf_P(buffer, AT_FTPPUTPATH, path);
strcpy_P(resp, OK);
if (sendCmdAndWaitForResp(buffer, resp, 2000) == FALSE)
if (sendCmdAndWaitForResp(buffer, OK_, 2000) == FALSE)
{
return ERROR_FTPPUTPATH;
}

strcpy_P(buffer, AT_FTPPUT1);
strcpy_P(resp, AT_FTPPUT1_RESP);
if (sendCmdAndWaitForResp(buffer, resp, 10000) == FALSE)
if (sendCmdAndWaitForResp_P(AT_FTPPUT1, AT_FTPPUT1_RESP, 10000) == FALSE)
{
return ERROR_FTPPUT1;
}
Expand All @@ -186,8 +118,8 @@ Result FTP::putWrite(const char *data, unsigned int size)
{
Result result = SUCCESS;

unsigned int attempts = 0;
unsigned int MAX_ATTEMPTS = 10;
uint8_t attempts = 0;
uint8_t MAX_ATTEMPTS = 10;

while (putWriteStart(size) != SUCCESS || putWriteEnd(data, size) != SUCCESS)
{
Expand Down Expand Up @@ -221,12 +153,10 @@ Result FTP::putWriteStart(unsigned int size)
Result FTP::putWriteEnd(const char *data, unsigned int size)
{
Result result = SUCCESS;

char buffer[32];
char resp[32];
char resp[8];

write(data, size);

strcpy_P(resp, AT_FTPPUT1_RESP);
if (waitForResp(resp, 2000) == FALSE)
{
Expand All @@ -238,15 +168,9 @@ Result FTP::putWriteEnd(const char *data, unsigned int size)

Result FTP::putEnd()
{
Result result = SUCCESS;
serialSIM800.flush();

char buffer[32];
char resp[12];
Result result = closeGPRSContext(*this);

strcpy_P(buffer, AT_FTPPUT20);
strcpy_P(resp, AT_FTPPUT20_RESP);
if (sendCmdAndWaitForResp(AT_FTPPUT20, AT_FTPPUT20_RESP, 2000) == FALSE)
if (sendCmdAndWaitForResp_P(AT_FTPPUT20, AT_FTPPUT20_RESP, 2000) == FALSE)
{
return ERROR_FTPPUT20;
}
Expand Down
5 changes: 3 additions & 2 deletions Ftp.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,9 @@ class FTP : public SIM800
unsigned int txPin,
unsigned int rstPin,
bool debug = TRUE) : SIM800(baudRate, rxPin, txPin, rstPin, debug){};
Result configureBearer(const char *apn);
Result putBegin(const char *fileName,

Result putBegin(const char *apn,
const char *fileName,
const char *server,
const char *usr,
const char *pass,
Expand Down
104 changes: 104 additions & 0 deletions GPRS.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/*
* GPRS.cpp
* GPRS module that implements the basic AT sequences to interact with GPRS
*
* Copyright 2019 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 OK[] PROGMEM = "OK";
const char OK_ PROGMEM = "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, 2000) != TRUE &&
sim800.sendCmdAndWaitForResp_P(REGISTRATION_STATUS, ROAMING, 2000) != TRUE) &&
attempts < MAX_ATTEMPTS)
{
sim800.sendCmdAndWaitForResp_P(READ_VOLTAGE, OK, 1000);
sim800.sendCmdAndWaitForResp_P(SIGNAL_QUALITY, OK, 1000);
attempts++;
delay(1000 * attempts);
if (attempts == MAX_ATTEMPTS)
{
attempts = 0;
sim800.preInit();
}
}

if (sim800.sendCmdAndWaitForResp_P(BEARER_PROFILE_GPRS, OK, 2000) == 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, OK_, 2000) == FALSE)
result = ERROR_BEARER_PROFILE_APN;

while (sim800.sendCmdAndWaitForResp_P(QUERY_BEARER, BEARER_OPEN, 2000) == FALSE && attempts < MAX_ATTEMPTS)
{
attempts++;
if (sim800.sendCmdAndWaitForResp_P(OPEN_GPRS_CONTEXT, OK, 2000) == 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, OK, 2000) == FALSE)
result = ERROR_CLOSE_GPRS_CONTEXT;

return result;
}
37 changes: 37 additions & 0 deletions GPRS.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* GPRS.h
* GPRS module that implements the basic AT sequences to interact with GPRS
*
* Copyright 2019 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.
*/

#ifndef __GPRS_H__
#define __GPRS_H__

#include "Result.h"
#include "Sim800.h"

Result openGPRSContext(SIM800& sim800, const char *apn);
Result closeGPRSContext(SIM800& sim800);

#endif
1 change: 0 additions & 1 deletion Geo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@

#include "Geo.h"
#include "Parser.h"
#include <string.h>

#define READ_GPS "AT+CIPGSMLOC=1,1\r\n"

Expand Down
Loading

0 comments on commit 79a2a46

Please sign in to comment.