Lib SIM5320 avec SMS
Dependents: 0-sim5320e-L432KC-relais-0
sim5320e.cpp@1:8eff8b2b35e8, 2022-05-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |