Lib SIM5320 avec SMS

Dependents:   0-sim5320e-L432KC-relais-0

Committer:
schnf30
Date:
Sun May 01 06:28:05 2022 +0000
Revision:
0:d63231e47571
New 1-5-2022

Who changed what in which revision?

UserRevisionLine numberNew contents of line
schnf30 0:d63231e47571 1
schnf30 0:d63231e47571 2 #include "mbed.h"
schnf30 0:d63231e47571 3 #include "sim800l.h"
schnf30 0:d63231e47571 4 /*
schnf30 0:d63231e47571 5 char _DataTmp[maxdata + 1]; // tableau de donnees pour stocker pendant reception
schnf30 0:d63231e47571 6 char _Data[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
schnf30 0:d63231e47571 7 char _DataSms[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
schnf30 0:d63231e47571 8 char _Phrase[maxdata + 1]; // pour convertir en phrase avant envoi
schnf30 0:d63231e47571 9 */
schnf30 0:d63231e47571 10 Sim800l::Sim800l(PinName tx, PinName rx, PinName resetpin,int baudrate):serial(tx,rx), reset (resetpin)
schnf30 0:d63231e47571 11 {
schnf30 0:d63231e47571 12 reset.write(0); //reset
schnf30 0:d63231e47571 13 /* _DataTmp = new char[maxdata + 1]; // tableau de donnees pour stocker pendant reception
schnf30 0:d63231e47571 14 _Data = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
schnf30 0:d63231e47571 15 _DataSms = new char[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues
schnf30 0:d63231e47571 16 _Phrase = new char[maxdata + 1]; // pour convertir en phrase avant envoi
schnf30 0:d63231e47571 17 */
schnf30 0:d63231e47571 18 _DataTmp[0] = 0;
schnf30 0:d63231e47571 19 _Data[0] = 0;
schnf30 0:d63231e47571 20 _DataPtr = 0;
schnf30 0:d63231e47571 21 _DataReady = false;
schnf30 0:d63231e47571 22 _SmsReady = false;
schnf30 0:d63231e47571 23 _IndexSms = 0;
schnf30 0:d63231e47571 24 serial.baud(baudrate); // configure data baud
schnf30 0:d63231e47571 25 }
schnf30 0:d63231e47571 26 // retourne incdex du sms recu
schnf30 0:d63231e47571 27 int Sim800l::IndexSmsRecu(void)
schnf30 0:d63231e47571 28 {
schnf30 0:d63231e47571 29 return _IndexSms;
schnf30 0:d63231e47571 30 }
schnf30 0:d63231e47571 31 // return true si une phrase a ete recue
schnf30 0:d63231e47571 32 bool Sim800l::dataready(void)
schnf30 0:d63231e47571 33 {
schnf30 0:d63231e47571 34 return _DataReady;
schnf30 0:d63231e47571 35 }
schnf30 0:d63231e47571 36 // return phrase recu
schnf30 0:d63231e47571 37 char * Sim800l::read(void)
schnf30 0:d63231e47571 38 {
schnf30 0:d63231e47571 39 _DataReady = false;
schnf30 0:d63231e47571 40 return _Data;
schnf30 0:d63231e47571 41 }
schnf30 0:d63231e47571 42 // recoit les caractere serie et les stocke en tache de fond
schnf30 0:d63231e47571 43 void Sim800l::receive()
schnf30 0:d63231e47571 44 {
schnf30 0:d63231e47571 45 char inChar;
schnf30 0:d63231e47571 46 if (serial.readable()) {
schnf30 0:d63231e47571 47 inChar = serial.getc();
schnf30 0:d63231e47571 48 pc.putc(inChar); // pour echo
schnf30 0:d63231e47571 49 switch (inChar) {
schnf30 0:d63231e47571 50 case '\n' :
schnf30 0:d63231e47571 51 if (_DataPtr > 1) {
schnf30 0:d63231e47571 52 // pc.printf("-%s/\r\n",_DataTmp);
schnf30 0:d63231e47571 53 if (strncmp(_DataTmp,"+CMTI:",6)==NULL) { // recoit sms +CMTI: "SM",3
schnf30 0:d63231e47571 54 if (sscanf(_DataTmp,"+CMTI: \"SM\",%d",&_IndexSms)==1) _SmsReady = true;
schnf30 0:d63231e47571 55 } else { // cmde
schnf30 0:d63231e47571 56 strcpy(_Data,_DataTmp);
schnf30 0:d63231e47571 57 _DataReady = true;
schnf30 0:d63231e47571 58 }
schnf30 0:d63231e47571 59 }
schnf30 0:d63231e47571 60 _DataTmp[0] = 0;
schnf30 0:d63231e47571 61 _DataPtr = 0;
schnf30 0:d63231e47571 62 break;
schnf30 0:d63231e47571 63 case 0 :
schnf30 0:d63231e47571 64 break;
schnf30 0:d63231e47571 65 case '\r' :
schnf30 0:d63231e47571 66 break;
schnf30 0:d63231e47571 67 case ' ' :
schnf30 0:d63231e47571 68 if (_DataPtr==1) {
schnf30 0:d63231e47571 69 if ( _DataTmp[0]=='>') {
schnf30 0:d63231e47571 70 strcpy(_Data,_DataTmp);
schnf30 0:d63231e47571 71 _DataReady = true;
schnf30 0:d63231e47571 72 _DataTmp[0] = 0;
schnf30 0:d63231e47571 73 _DataPtr = 0;
schnf30 0:d63231e47571 74 break;
schnf30 0:d63231e47571 75 }
schnf30 0:d63231e47571 76 }
schnf30 0:d63231e47571 77 default :
schnf30 0:d63231e47571 78 _DataTmp[_DataPtr] = inChar;
schnf30 0:d63231e47571 79 _DataPtr = _DataPtr + 1;
schnf30 0:d63231e47571 80 _DataTmp[_DataPtr] = 0;
schnf30 0:d63231e47571 81 }
schnf30 0:d63231e47571 82 if (_DataPtr >= maxdata) { // si phrase trop longue vide phrase
schnf30 0:d63231e47571 83 _DataTmp[0] = 0;
schnf30 0:d63231e47571 84 _DataPtr = 0;
schnf30 0:d63231e47571 85 }
schnf30 0:d63231e47571 86 }
schnf30 0:d63231e47571 87 }
schnf30 0:d63231e47571 88 // fonction appele en fin timerout
schnf30 0:d63231e47571 89 void Sim800l::Ftimeout()
schnf30 0:d63231e47571 90 {
schnf30 0:d63231e47571 91 FinTimeOut = true;
schnf30 0:d63231e47571 92 }
schnf30 0:d63231e47571 93 // defini time out et le lance
schnf30 0:d63231e47571 94 void Sim800l::SetTimeout(float delay)
schnf30 0:d63231e47571 95 {
schnf30 0:d63231e47571 96 FinTimeOut = false;
schnf30 0:d63231e47571 97 _timeout.attach(callback(this,&Sim800l::Ftimeout),delay);
schnf30 0:d63231e47571 98 // timeout.attach(callback(this, &Sonar::trigger_toggle), 10.0e-6);
schnf30 0:d63231e47571 99 }
schnf30 0:d63231e47571 100 // attente reponse dans *reponse jusqua timeout
schnf30 0:d63231e47571 101 bool Sim800l::waitreponse(const char *reponse,float timeout)
schnf30 0:d63231e47571 102 {
schnf30 0:d63231e47571 103 SetTimeout(timeout);
schnf30 0:d63231e47571 104 while (FinTimeOut==false) { // attente Ok
schnf30 0:d63231e47571 105 if (dataready()) {
schnf30 0:d63231e47571 106 if (strcmp(read(),reponse)==0) return true;
schnf30 0:d63231e47571 107 }
schnf30 0:d63231e47571 108 }
schnf30 0:d63231e47571 109 return false; // timeout ecoule donc erreur
schnf30 0:d63231e47571 110 }
schnf30 0:d63231e47571 111 // envoi commande et attend reponse
schnf30 0:d63231e47571 112 bool Sim800l::writecmdandwaitreponse(const char *data, const char *reponse,float timeout)
schnf30 0:d63231e47571 113 {
schnf30 0:d63231e47571 114 serial.printf("%s",data);
schnf30 0:d63231e47571 115 return waitreponse(reponse,timeout);
schnf30 0:d63231e47571 116 }
schnf30 0:d63231e47571 117 // initialise SIM800L en mode SMS Texte
schnf30 0:d63231e47571 118 // configure baud
schnf30 0:d63231e47571 119 // Renvoi
schnf30 0:d63231e47571 120 // - true tout s'est bien passé
schnf30 0:d63231e47571 121 // - false erreur
schnf30 0:d63231e47571 122 // cmdecho = true --> copie donne de reponse sim800l vers pc
schnf30 0:d63231e47571 123 bool Sim800l::init()
schnf30 0:d63231e47571 124 {
schnf30 0:d63231e47571 125 bool resultat = true;
schnf30 0:d63231e47571 126 _DataTmp[0] = 0;
schnf30 0:d63231e47571 127 _Data[0] = 0;
schnf30 0:d63231e47571 128 _DataPtr = 0;
schnf30 0:d63231e47571 129 _DataReady = false;
schnf30 0:d63231e47571 130 _SmsReady = false;
schnf30 0:d63231e47571 131 _IndexSms = 0;
schnf30 0:d63231e47571 132 reset.write(0); //reset
schnf30 0:d63231e47571 133 thread_sleep_for(200);
schnf30 0:d63231e47571 134 reset.write(1);
schnf30 0:d63231e47571 135 serial.attach(callback(this, &Sim800l::receive), RawSerial::RxIrq); // affecte interruption sur Rx
schnf30 0:d63231e47571 136 thread_sleep_for(1000);
schnf30 0:d63231e47571 137 int i=0;
schnf30 0:d63231e47571 138 while (!writecmdandwaitreponse("AT\n","OK",timeoutdefaut)) { // on attend 10 x pas plus
schnf30 0:d63231e47571 139 if (i++>10) return false;
schnf30 0:d63231e47571 140 }
schnf30 0:d63231e47571 141 if (!waitreponse("Call Ready",timewaitCallready)) return false;
schnf30 0:d63231e47571 142 if (!waitreponse("SMS Ready",timewaitSmsready)) return false;
schnf30 0:d63231e47571 143 return writecmdandwaitreponse("AT+CMGF=1\n","OK",timeoutdefaut); // Passe sms mode texte
schnf30 0:d63231e47571 144 }
schnf30 0:d63231e47571 145 bool Sim800l::smsclearall(void)
schnf30 0:d63231e47571 146 {
schnf30 0:d63231e47571 147 return writecmdandwaitreponse("AT+CMGDA=\"DEL ALL\"\n","OK",timewaitSmsallclear); // efface sms
schnf30 0:d63231e47571 148
schnf30 0:d63231e47571 149 }
schnf30 0:d63231e47571 150 bool Sim800l::smsready(void)
schnf30 0:d63231e47571 151 {
schnf30 0:d63231e47571 152 bool _SmsReadytemp = _SmsReady;
schnf30 0:d63231e47571 153 _SmsReady = false;
schnf30 0:d63231e47571 154 return _SmsReadytemp;
schnf30 0:d63231e47571 155 }
schnf30 0:d63231e47571 156 bool Sim800l::sendsms(const char *phonenumber,const char *data)
schnf30 0:d63231e47571 157 {
schnf30 0:d63231e47571 158 if (!writecmdandwaitreponse("AT+CMGF=1\n","OK",timeoutdefaut)) return false; // Passe sms mode texte
schnf30 0:d63231e47571 159 sprintf(_Phrase,"AT+CMGS=\"%s\"\n",phonenumber);
schnf30 0:d63231e47571 160 if (!writecmdandwaitreponse(_Phrase,">",timeoutsendsms)) return false; // ouvre sms
schnf30 0:d63231e47571 161 sprintf(_Phrase,"%s%c\n",data,26);
schnf30 0:d63231e47571 162 return writecmdandwaitreponse(_Phrase,"OK",timeoutsendsms); // envoi message
schnf30 0:d63231e47571 163 }
schnf30 0:d63231e47571 164 // attente r eponse dans *reponse
schnf30 0:d63231e47571 165 bool Sim800l::waitsmsreponse(const char *reponse,float timeout)
schnf30 0:d63231e47571 166 {
schnf30 0:d63231e47571 167 char DataSmsOk = 0;
schnf30 0:d63231e47571 168 _DataSms[0] = 0;
schnf30 0:d63231e47571 169 SetTimeout(timeout);
schnf30 0:d63231e47571 170 while (FinTimeOut==false) { // attente Ok
schnf30 0:d63231e47571 171 if (dataready()) {
schnf30 0:d63231e47571 172 // pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms);
schnf30 0:d63231e47571 173 if (strcmp(read(),reponse)==0) return true;
schnf30 0:d63231e47571 174 if (strncmp(_Data,"+CMGR:",6)==NULL) DataSmsOk = 1;
schnf30 0:d63231e47571 175 else if (DataSmsOk!=0) {
schnf30 0:d63231e47571 176 if (DataSmsOk > 1) strcat(_DataSms,",");
schnf30 0:d63231e47571 177 strcat(_DataSms,_Data);
schnf30 0:d63231e47571 178 DataSmsOk = 2;
schnf30 0:d63231e47571 179 }
schnf30 0:d63231e47571 180 // pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms);
schnf30 0:d63231e47571 181 }
schnf30 0:d63231e47571 182 }
schnf30 0:d63231e47571 183 return false; // timeout ecoule donc erreur
schnf30 0:d63231e47571 184 }
schnf30 0:d63231e47571 185 char *Sim800l::readtextesms()
schnf30 0:d63231e47571 186 {
schnf30 0:d63231e47571 187 return _DataSms;
schnf30 0:d63231e47571 188 }
schnf30 0:d63231e47571 189 bool Sim800l::readsms(int index)
schnf30 0:d63231e47571 190 {
schnf30 0:d63231e47571 191 serial.printf("AT+CMGR=%d,0\n",index);
schnf30 0:d63231e47571 192 return waitsmsreponse("OK",timeoutreadsms);
schnf30 0:d63231e47571 193 }