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