Lib SIM5320 avec SMS

Dependents:   0-sim5320e-L432KC-relais-0

Committer:
schnf30
Date:
Wed May 18 08:09:18 2022 +0000
Revision:
1:8eff8b2b35e8
SIm5320 et SMS avec exemple

Who changed what in which revision?

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