Hai ragione ho postato il codice della libreria per il protocollo mqtt, che usa la sim900
#include "SIM900.h"
#include "Streaming.h"
#define _GSM_CONNECTION_TOUT_ 5
#define _TCP_CONNECTION_TOUT_ 20
#define _GSM_DATA_TOUT_ 10
//#define RESETPIN 7
SIMCOM900 gsm;
SIMCOM900::SIMCOM900(){};
SIMCOM900::~SIMCOM900(){};
int SIMCOM900::read(char* result, int resultlength)
{
// Or maybe do it with AT+QIRD
int charget;
//_tf.setTimeout(3);
// Not well. This way we read whatever comes in one second. If a CLOSED
// comes, we have spent a lot of time
//charget=_tf.getString("",'\0',result, resultlength);
//charget=_tf.getString("","",result, resultlength);
/*if(strtok(result, "CLOSED")) // whatever chain the Q10 returns...
{
// TODO: use strtok to delete from the chain everything from CLOSED
if(getStatus()==TCPCONNECTEDCLIENT)
setStatus(ATTACHED);
else
setStatus(TCPSERVERWAIT);
} */
return charget;
}
int SIMCOM900::readCellData(int &mcc, int &mnc, long &lac, long &cellid)
{
if (getStatus()==IDLE)
return 0;
//_tf.setTimeout(_GSM_DATA_TOUT_);
//_cell.flush();
SimpleWriteln(F("AT+QENG=1,0"));
SimpleWriteln(F("AT+QENG?"));
if(gsm.WaitResp(5000, 50, "+QENG")!=RX_FINISHED_STR_NOT_RECV)
return 0;
//mcc=_tf.getValue(); // The first one is 0
mcc=_cell.read();
//mcc=_tf.getValue();
mcc=_cell.read();
//mnc=_tf.getValue();
mnc=_cell.read();
//lac=_tf.getValue();
lac=_cell.read();
//cellid=_tf.getValue();
cellid=_cell.read();
gsm.WaitResp(5000, 50, "+OK");
SimpleWriteln(F("AT+QENG=1,0"));
gsm.WaitResp(5000, 50, "+OK");
return 1;
}
boolean SIMCOM900::readSMS(char* msg, int msglength, char* number, int nlength)
{
long index;
char *p_char;
char *p_char1;
/*
if (getStatus()==IDLE)
return false;
*/
_tf.setTimeout(_GSM_DATA_TOUT_);
//_cell.flush();
SimpleWriteln(F("AT+CMGL=\"REC UNREAD\",1"));
//gsm.WaitResp(5000, 100, "OK");
//if(gsm.IsStringReceived("+CMGL"))
if(_tf.find("+CMGL: "))
{
Serial.println("TEST");
/*
//index
p_char = strchr((char *)(gsm.comm_buf),':');
p_char1 = p_char+2; //we are on the first char of string
p_char = strchr((char *)(p_char1), ',');
if (p_char != NULL) {
*p_char = 0;
}
//strcpy(msg, (char *)(p_char1));
// rec unread
p_char++;
p_char1 = strchr((char *)(p_char), ',');
if (p_char1 != NULL) {
*p_char1 = 0;
}
// number
p_char1++;
p_char1++;
p_char = strchr((char *)(p_char1), '\"');
if (p_char != NULL) {
*p_char = 0;
}
strcpy(number, (char *)(p_char1));
// UTC time
p_char = strchr((char *)(p_char), '\n');
p_char1 = strchr((char *)(p_char), '\n');
if (p_char1 != NULL) {
*p_char1 = 0;
}
strcpy(msg, (char *)(p_char));
*/
index=_tf.getValue();
//index=_cell.read();
#ifdef UNO
_tf.getString("\",\"", "\"", number, nlength);
#endif
#ifdef MEGA
_cell.getString("\",\"", "\"", number, nlength);
#endif
#ifdef UNO
_tf.getString("\n", "\nOK", msg, msglength);
#endif
#ifdef MEGA
_cell.getString("\n", "\nOK", msg, msglength);
#endif
SimpleWrite(F("AT+CMGD="));
SimpleWriteln(index);
// Serial.print("VAL= ");
// Serial.println(index);
gsm.WaitResp(5000, 50, "OK");
return true;
};
return false;
};
boolean SIMCOM900::readCall(char* number, int nlength)
{
int index;
if (getStatus()==IDLE)
return false;
//_tf.setTimeout(_GSM_DATA_TOUT_);
if(gsm.WaitResp(5000, 50, "+CLIP: \"")!=RX_FINISHED_STR_RECV)
//if(_tf.find("+CLIP: \""))
{
#ifdef UNO
_tf.getString("", "\"", number, nlength);
#endif
#ifdef MEGA
_cell.getString("", "\"", number, nlength);
#endif
SimpleWriteln("ATH");
delay(1000);
//_cell.flush();
return true;
};
return false;
};
boolean SIMCOM900::call(char* number, unsigned int milliseconds)
{
if (getStatus()==IDLE)
return false;
//_tf.setTimeout(_GSM_DATA_TOUT_);
SimpleWrite("ATD");
SimpleWrite(number);
SimpleWriteln(";");
delay(milliseconds);
SimpleWriteln("ATH");
return true;
}
int SIMCOM900::setPIN(char *pin)
{
//Status = READY or ATTACHED.
if((getStatus() != IDLE))
return 2;
//_tf.setTimeout(_GSM_DATA_TOUT_); //Timeout for expecting modem responses.
//_cell.flush();
//AT command to set PIN.
SimpleWrite(F("AT+CPIN="));
SimpleWriteln(pin);
//Expect "OK".
if(gsm.WaitResp(5000, 50, "OK")!=RX_FINISHED_STR_NOT_RECV)
return 0;
else
return 1;
}
int SIMCOM900::changeNSIPmode(char mode)
{
//_tf.setTimeout(_TCP_CONNECTION_TOUT_);
//if (getStatus()!=ATTACHED)
// return 0;
//_cell.flush();
SimpleWrite(F("AT+QIDNSIP="));
SimpleWriteln(mode);
if(gsm.WaitResp(5000, 50, "OK")!=RX_FINISHED_STR_NOT_RECV) return 0;
//if(!_tf.find("OK")) return 0;
return 1;
}
int SIMCOM900::getCCI(char *cci)
{
//Status must be READY
if((getStatus() != READY))
return 2;
//_tf.setTimeout(_GSM_DATA_TOUT_); //Timeout for expecting modem responses.
//_cell.flush();
//AT command to get CCID.
SimpleWriteln(F("AT+QCCID"));
//Read response from modem
#ifdef UNO
_tf.getString("AT+QCCID\r\r\r\n","\r\n",cci, 21);
#endif
#ifdef MEGA
_cell.getString("AT+QCCID\r\r\r\n","\r\n",cci, 21);
#endif
//Expect "OK".
if(gsm.WaitResp(5000, 50, "OK")!=RX_FINISHED_STR_NOT_RECV)
return 0;
else
return 1;
}
int SIMCOM900::getIMEI(char *imei)
{
//_tf.setTimeout(_GSM_DATA_TOUT_); //Timeout for expecting modem responses.
//_cell.flush();
//AT command to get IMEI.
SimpleWriteln(F("AT+GSN"));
//Read response from modem
#ifdef UNO
_tf.getString("\r\n","\r\n",imei, 16);
#endif
#ifdef MEGA
_cell.getString("\r\n","\r\n",imei, 16);
#endif
//Expect "OK".
if(gsm.WaitResp(5000, 50, "OK")!=RX_FINISHED_STR_NOT_RECV)
return 0;
else
return 1;
}
uint8_t SIMCOM900::read()
{
return _cell.read();
}
void SIMCOM900::SimpleRead()
{
char datain;
if(_cell.available()>0){
datain=_cell.read();
if(datain>0){
Serial.print(datain);
}
}
}
void SIMCOM900::SimpleWrite(char *comm)
{
_cell.print(comm);
}
void SIMCOM900::SimpleWrite(const char *comm)
{
_cell.print(comm);
}
void SIMCOM900::SimpleWrite(int comm)
{
_cell.print(comm);
}
void SIMCOM900::SimpleWrite(int comm1,uint8_t comm,uint8_t &comm2)
{
_cell.print(comm1,comm,comm2);
}
void SIM900::SimpleWrite(uint8_t *comm, uint8_t &comm1){
_cell.print(comm,comm1);
}
void SIM900::SimpleWrite(uint8_t *&comm, uint16_t &comm1){
_cell.print(comm,comm1);
}
void SIM900::SimpleWrite(uint8_t comm, uint8_t &comm1){
_cell.print(comm,comm1);
}
void SIMCOM900::SimpleWrite(const __FlashStringHelper *pgmstr)
{
_cell.print(pgmstr);
}
void SIMCOM900::SimpleWrite(uint8_t *comm,int length)
{
_cell.print(comm,length);
}
void SIMCOM900::SimpleWrite(uint8_t *comm,uint8_t *comm1,int length)
{
_cell.print(comm,com1,length);
}
void SIMCOM900::SimpleWriteln(char *comm)
{
_cell.println(comm);
}
void SIMCOM900::SimpleWriteln(const __FlashStringHelper *pgmstr)
{
_cell.println(pgmstr);
}
void SIMCOM900::SimpleWriteln(char const *comm)
{
_cell.println(comm);
}
void SIMCOM900::SimpleWriteln(int comm)
{
_cell.println(comm);
}
void SIMCOM900::WhileSimpleRead()
{
char datain;
while(_cell.available()>0){
datain=_cell.read();
if(datain>0){
Serial.print(datain);
}
}
}
//---------------------------------------------
/**********************************************************
Quello che mi interessa è implementare dei metodi per quell'errore che ho in fase di compilazione