uses pushing box to write to google spreadsheets

Dependencies:   GSM_PUSHING_BOX_STATE_MACHINE MBed_Adafruit-GPS-Library SDFileSystem mbed

Fork of DCS by DCS_TEAM

GPRS/GPRS.cpp

Committer:
DeWayneDennis
Date:
2015-10-21
Revision:
20:84661ac75715
Parent:
19:404594768414

File content as of revision 20:84661ac75715:

/*
  GPRS.cpp
  2014 Copyright (c) Seeed Technology Inc.  All right reserved.

  Author:lawliet zou(lawliet.zou@gmail.com)
  2014-2-24

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "mbed.h"
#include "GPRS.h"

GPRS* GPRS::inst;
char* numbers[100];
FILE *fpNum;
int number_index = 0;
char phone_number[12];

GPRS::GPRS(PinName tx, PinName rx, int baudRate, const char* apn, const char* userName, const char* passWord) : Modem(tx,rx,baudRate)
{
    inst = this;
    _apn = apn;
    _userName = userName;
    _passWord = passWord;
    socketID = -1;
}

bool GPRS::preInit()
{
    //send AT command a couple of times
    for(int i = 0; i < 2; i++) {
        sendCmd("AT\r\n");
    }
    return checkSIMStatus();
}
// added by Noah Milam
void GPRS::start_server()
{     
     sendCmdResp("AT+CGATT?\r\n");
     
     sendCmdResp("AT+CIPSERVER=1,1234\r\n");
     listen_server();
}
void GPRS::listen_server()
{
    gprs_response();
}
    
void GPRS::send_SMS(char* number, char* data)
{
    printf("sending text message to: %s\r\n", number);
    sendCmdAndWaitForResp("AT+CMGF=1\r\n","OK",DEFAULT_TIMEOUT,CMD);
    wait(2);
     //printf("\032\n");
    char cmd[64];
    snprintf(cmd,sizeof(cmd),"AT+CMGS=\"+%s\"\r\n",number);
    printf(">>>>%s",cmd);
    sendCmdAndWaitForResp(cmd,">",DEFAULT_TIMEOUT,CMD);
    printf("sent at cmgf\n");
    wait(2);
    //printf("032");
    sendCmd(data); // sends the address 
    sendCmd("\x1a");  // this is like pressing control - z to end the send command
    wait(10);  // giving the send enough time to do its thing
    printf("should have been received");
}

char* GPRS::read_SMS()
{
 wait(1);
    sendCmd("AT+CMGF=1\r\n"); // sms mode
    wait(2);
    sendCmd("AT+CMGD=1\r\n"); // delete the frist message so incoming message is spot 1
    wait(1);
    wait_for_sms();
    wait(10);  
    sendCmd("AT+CMGR=1\r\n");
    storeResp();
    return get_server_IP();
}

// end of what Noah Milam added
bool GPRS::checkSIMStatus(void)
{
    printf("Checking SIM Status...\r\n");
    char gprsBuffer[32];
    int count = 0;
    
    while(count < 3) {
        cleanBuffer(gprsBuffer,32);
        sendCmd("AT+CPIN?\r\n");
        readBuffer(gprsBuffer,32,DEFAULT_TIMEOUT);
        if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) {
            break;
        }
        printf("SIM Not Ready..Try Again\r\n--%s--\r\n", gprsBuffer);
        count++;
        wait(1);
    }
    if(count == 3) {
        return false;
    }
    printf("SIM Status GOOD!\r\n");
    return true;
}

bool GPRS::join()
{
    char cmd[64];
    char ipAddr[32];
    char resp[96];
    
    printf(">>>>AT+CREG\r\n");
    sendCmd("AT+CREG?\r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"+CREG:")) {
    }
    else{
        return false;    
    }
    //close any existing connections
    printf(">>>>AT+CIPSHUT\r\n");
    sendCmd("AT+CIPSHUT\r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"OK")) {
    }
    else{
        return false;    
    }
    //Select multi connection (it can be a server or client)
    printf(">>>>AT+CIPMUX=0\r\n");
    sendCmd("AT+CIPMUX=0 \r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"CIPMUX")) {
    }
    else{
        return false;    
    }
    //get signal strength
    printf(">>>>AT+CSQ\r\n");
    sendCmd("AT+CSQ\r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"+CSQ:")) {
    }
    else{
        return false;    
    }
    //check if device is attached
    printf(">>>>AT+CGATT?\r\n");
    sendCmd("AT+CGATT?\r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"+CGATT:")) {
    }
    else{
        return false;    
    }
    //attach the device
    printf(">>>>AT+CGATT=1\r\n");
    sendCmd("AT+CGATT=1\r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"OK")) {
    }
    else{
        printf("Response: %s\r\n", resp);
        return false;    
    }
    
    //set APN
    snprintf(cmd,sizeof(cmd),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord);
    printf(">>>>%s",cmd);
    //sendCmdAndWaitForRes  p(cmd, "OK", DEFAULT_TIMEOUT,CMD);
    sendCmd(cmd);
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"OK")) {
    }
    else{
        return false;    
    }
    //Brings up wireless connection
    printf(">>>>AT+CIICR\r\n");
    sendCmd("AT+CIICR\r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"OK")) {
    }
    else{
        return false;    
    }
    printf(">>>>AT+CIPHEAD\r\n");
    sendCmd("AT+CIPHEAD=1\r\n");
    cleanBuffer(resp,96);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"OK")) {
    }
    else{
        return false;    
    }
    //Get local IP address
    printf(">>>>AT+CIFSR\r\n");
    sendCmd("AT+CIFSR\r\n");
    readBuffer(ipAddr,32,2);
    printf(">>>>AT+CIFSR returns: %s\r\n", ipAddr);
    if(NULL != strstr(ipAddr,"AT+CIFSR")) {
        _ip = str_to_ip(ipAddr+12);
        if(_ip != 0) {
            //possibly send ip address to server for future TCP connections
            return true;
        }
    }
    return false;
}

bool GPRS::setProtocol(int socket, Protocol p)
{
    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
        return false;
    }
    //ToDo: setProtocol
    return true;
}

bool GPRS::connect(int socket, Protocol ptl,const char * host, int port, int timeout)
{
    char cmd[64];
    char resp[96];
    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
        return false;
    }
    if(ptl == TCP) {
        sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",\"%d\"\r\n", host, port);
    } else if(ptl == UDP) {
        sprintf(cmd, "AT+CIPSTART=%d,\"UDP\",\"%s\",%d\r\n",socket, host, port);
    } else {
        return false;
    }
    
    sendCmd(cmd);
    readBuffer(resp,96,DEFAULT_TIMEOUT);
    if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK
        printf("Response: %s\r\n", resp);
        return true;
    }
    return false;//ERROR
}

bool GPRS::gethostbyname(const char* host, uint32_t* ip)
{
    uint32_t addr = str_to_ip(host);
    char buf[17];
    snprintf(buf, sizeof(buf), "%d.%d.%d.%d", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff);
    if (strcmp(buf, host) == 0) {
        *ip = addr;
        return true;
    }
    return false;
}

bool GPRS::disconnect()
{
    sendCmd("AT+CIPSHUT\r\n");
    return true;
}

bool GPRS::is_connected(int socket)
{
    
    char cmd[16];
    char resp[96];
    while(1){
        snprintf(cmd,16,"AT+CIPSTATUS=%d\r\n",socket);
        sendCmd(cmd);
        readBuffer(resp,sizeof(resp),DEFAULT_TIMEOUT);
        if(NULL != strstr(resp,"CONNECTED")) {
            return true;
        } else {
            return false;
        }
    }
}

void GPRS::reset()
{
}

bool GPRS::close(int socket)
{
    char cmd[16];
    char resp[16];

    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
        return false;
    }
    // if not connected, return
    if (is_connected(socket) == false) {
        return true;
    }
    snprintf(cmd, sizeof(cmd),"AT+CIPCLOSE=%d\r\n",socket);
    snprintf(resp,sizeof(resp),"%d, CLOSE OK",socket);
    if(0 != sendCmdAndWaitForResp(cmd, resp, DEFAULT_TIMEOUT,CMD)) {
        return false;
    }
    return true;
}

bool GPRS::readable(void)
{
    return readable();
}

int GPRS::wait_readable(int socket, int wait_time)
{
    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
        return -1;
    }
    char resp[16];
    snprintf(resp,sizeof(resp),"\r\n\r\n+RECEIVE,%d",socket);//"+RECEIVE:<socketID>,<length>"
    int len = strlen(resp);

    if(false == respCmp(resp,len,wait_time)) {
        return -1;
    }
    char c = readByte();//','
    char dataLen[4];
    int i = 0;
    c = readByte();
    while((c >= '0') && (c <= '9')) {
        dataLen[i++] = c;
        c = readByte();
    }
    c = readByte();//'\n'
    len = atoi(dataLen);
    return len;
}

int GPRS::wait_writeable(int socket, int req_size)
{
    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
        return -1;
    }
    return req_size>256?256:req_size+1;
}

int GPRS::send(int socket, const char * str, int len)
{
    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
        return -1;
    }
    char cmd[32];
    wait(1);
    if(len > 0){
        printf("Sending data: %s\r\n", str);
        snprintf(cmd,sizeof(cmd),"AT+CIPSEND\r\n");
        if(0 != sendCmdAndWaitForResp(cmd,">",2,CMD)) {
            printf("Couldn't send data!!\r\n");
            return false;
        }
        sendCmd(str);
        serialModem.putc((char)0x1a);
    }
    return len;
}

int GPRS::recv(int socket, char* buf, int len)
{
    if (socket < 0 || socket > MAX_SOCK_NUM-1) {
        return -1;
    }
    cleanBuffer(buf,len);
    readBuffer(buf,len,DEFAULT_TIMEOUT/2);
    return len;
    //return strlen(buf);
}

int GPRS::new_socket()
{
    socketID = 0; //we only support one socket.
    return socketID; 
}

uint16_t GPRS::new_port()
{
    uint16_t port = rand();
    port |= 49152;
    return port;
}

uint32_t GPRS::str_to_ip(const char* str)
{
    uint32_t ip = 0;
    char* p = (char*)str;
    for(int i = 0; i < 4; i++) {
        ip |= atoi(p);
        p = strchr(p, '.');
        if (p == NULL) {
            break;
        }
        ip <<= 8;
        p++;
    }
    return ip;
}