Lib SIM5320 avec SMS
Dependents: 0-sim5320e-L432KC-relais-0
sim800l.cpp@0:d63231e47571, 2022-05-01 (annotated)
- Committer:
- schnf30
- Date:
- Sun May 01 06:28:05 2022 +0000
- Revision:
- 0:d63231e47571
New 1-5-2022
Who changed what in which revision?
User | Revision | Line number | New 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 | } |