Sim800L loib obj sms
Revision 0:5c39ec4eaaa1, committed 2022-04-23
- Comitter:
- schnf30
- Date:
- Sat Apr 23 08:01:40 2022 +0000
- Child:
- 1:2e6fa015734c
- Commit message:
- VERSION POUR F746ZG
Changed in this revision
sim800l.cpp | Show annotated file Show diff for this revision Revisions of this file |
sim800l.h | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sim800l.cpp Sat Apr 23 08:01:40 2022 +0000 @@ -0,0 +1,186 @@ + +#include "mbed.h" +#include "sim800l.h" +char _DataTmp[maxdata + 1]; // tableau de donnees pour stocker pendant reception +char _Data[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues +char _DataSms[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues +char _Phrase[maxdata + 1]; // pour convertir en phrase avant envoi +Sim800l::Sim800l(PinName tx, PinName rx, PinName resetpin,int baudrate):serial(tx,rx), reset (resetpin) +{ + reset.write(0); //reset + _DataTmp[0] = 0; + _Data[0] = 0; + _DataPtr = 0; + _DataReady = false; + _SmsReady = false; + _IndexSms = 0; + serial.baud(baudrate); // configure data baud +} +// retourne incdex du sms recu +int Sim800l::IndexSmsRecu(void) +{ + return _IndexSms; +} +// return true si une phrase a ete recue +bool Sim800l::dataready(void) +{ + return _DataReady; +} +// return phrase recu +char * Sim800l::read(void) +{ + _DataReady = false; + return _Data; +} +// recoit les caractere serie et les stocke en tache de fond +void Sim800l::receive() +{ + char inChar; + if (serial.readable()) { + inChar = serial.getc(); +// pc.putc(inChar); // pour echo + switch (inChar) { + case '\n' : + if (_DataPtr > 1) { +// pc.printf("-%s/\r\n",_DataTmp); + if (strncmp(_DataTmp,"+CMTI:",6)==NULL) { // recoit sms +CMTI: "SM",3 + if (sscanf(_DataTmp,"+CMTI: \"SM\",%d",&_IndexSms)==1) _SmsReady = true; + } else { // cmde + strcpy(_Data,_DataTmp); + _DataReady = true; + } + } + _DataTmp[0] = 0; + _DataPtr = 0; + break; + case 0 : + break; + case '\r' : + break; + case ' ' : + if (_DataPtr==1) { + if ( _DataTmp[0]=='>') { + strcpy(_Data,_DataTmp); + _DataReady = true; + _DataTmp[0] = 0; + _DataPtr = 0; + break; + } + } + default : + _DataTmp[_DataPtr] = inChar; + _DataPtr = _DataPtr + 1; + _DataTmp[_DataPtr] = 0; + } + if (_DataPtr >= maxdata) { // si phrase trop longue vide phrase + _DataTmp[0] = 0; + _DataPtr = 0; + } + } +} +// fonction appele en fin timerout +void Sim800l::Ftimeout() +{ + FinTimeOut = true; +} +// defini time out et le lance +void Sim800l::SetTimeout(float delay) +{ + FinTimeOut = false; + _timeout.attach(callback(this,&Sim800l::Ftimeout),delay); +// timeout.attach(callback(this, &Sonar::trigger_toggle), 10.0e-6); +} +// attente reponse dans *reponse jusqua timeout +bool Sim800l::waitreponse(const char *reponse,float timeout) +{ + SetTimeout(timeout); + while (FinTimeOut==false) { // attente Ok + if (dataready()) { + if (strcmp(read(),reponse)==0) return true; + } + } + return false; // timeout ecoule donc erreur +} +// envoi commande et attend reponse +bool Sim800l::writecmdandwaitreponse(const char *data, const char *reponse,float timeout) +{ + serial.printf("%s",data); + return waitreponse(reponse,timeout); +} +// initialise SIM800L en mode SMS Texte +// configure baud +// Renvoi +// - true tout s'est bien passé +// - false erreur +// cmdecho = true --> copie donne de reponse sim800l vers pc +bool Sim800l::init() +{ + bool resultat = true; + _DataTmp[0] = 0; + _Data[0] = 0; + _DataPtr = 0; + _DataReady = false; + _SmsReady = false; + _IndexSms = 0; + reset.write(0); //reset + thread_sleep_for(200); + reset.write(1); + serial.attach(callback(this, &Sim800l::receive), RawSerial::RxIrq); // affecte interruption sur Rx + thread_sleep_for(1000); + int i=0; + while (!writecmdandwaitreponse("AT\r\n","OK",timeoutdefaut)) { // on attend 10 x pas plus + if (i++>10) return false; + } + if (!waitreponse("Call Ready",timewaitCallready)) return false; + if (!waitreponse("SMS Ready",timewaitSmsready)) return false; + return writecmdandwaitreponse("AT+CMGF=1\r\n","OK",timeoutdefaut); // Passe sms mode texte +} +bool Sim800l::smsclearall(void) +{ + return writecmdandwaitreponse("AT+CMGDA=\"DEL ALL\"\r\n","OK",timewaitSmsallclear); // efface sms + +} +bool Sim800l::smsready(void) +{ + bool _SmsReadytemp = _SmsReady; + _SmsReady = false; + return _SmsReadytemp; +} +bool Sim800l::sendsms(const char *phonenumber,const char *data) +{ + if (!writecmdandwaitreponse("AT+CMGF=1\r\n","OK",timeoutdefaut)) return false; // Passe sms mode texte + sprintf(_Phrase,"AT+CMGS=\"%s\"\r\n",phonenumber); + if (!writecmdandwaitreponse(_Phrase,">",timeoutsendsms)) return false; // ouvre sms + sprintf(_Phrase,"%s%c\r\n",data,26); + return writecmdandwaitreponse(_Phrase,"OK",timeoutsendsms); // envoi message +} +// attente r eponse dans *reponse +bool Sim800l::waitsmsreponse(const char *reponse,float timeout) +{ + char DataSmsOk = 0; + _DataSms[0] = 0; + SetTimeout(timeout); + while (FinTimeOut==false) { // attente Ok + if (dataready()) { +// pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms); + if (strcmp(read(),reponse)==0) return true; + if (strncmp(_Data,"+CMGR:",6)==NULL) DataSmsOk = 1; + else if (DataSmsOk!=0) { + if (DataSmsOk > 1) strcat(_DataSms,","); + strcat(_DataSms,_Data); + DataSmsOk = 2; + } +// pc.printf("-%s --> %d:%s/\r\n",_Data,DataSmsOk,_DataSms); + } + } + return false; // timeout ecoule donc erreur +} +char *Sim800l::readtextesms() +{ + return _DataSms; +} +bool Sim800l::readsms(int index) +{ + serial.printf("AT+CMGR=%d,0\r\n",index); + return waitsmsreponse("OK",timeoutreadsms); +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sim800l.h Sat Apr 23 08:01:40 2022 +0000 @@ -0,0 +1,62 @@ +#ifndef _sim800l_ +#define _sim800l_ +#include "mbed.h" + +#define maxdata 1000 +#define timeoutdefaut 1 +#define timeoutsendsms 60 +#define timeoutreadsms 5 +#define timewaitCallready 10 +#define timewaitSmsready 60 +#define timewaitSmsallclear 25 +#define timewaitCCID 2 + +extern RawSerial pc; + +class Sim800l +{ +public: + /* + * Constructor + * + * @param tx mbed pin to use for tx line of Serial interface + * @param rx mbed pin to use for rx line of Serial interface + * @param reset reset pin of the wifi module () + */ + Sim800l(PinName tx, PinName rx, PinName resetpin, int baudrate=9600); + bool init(); + bool smsready(void); + bool sendsms(const char *phonenumber,const char *data); + bool readsms(int index); + bool smsclearall(void); + int IndexSmsRecu(void); + char *readtextesms(); + +protected: + RawSerial serial; + DigitalOut reset; +/* + char _DataTmp[maxdata + 1]; // tableau de donnees pour stocker pendant reception + char _Data[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues + char _DataSms[maxdata + 1]; // tableau de donnees lorsque toutes les donnees sont recues + char _Phrase[maxdata + 1]; // pour convertir en phrase avant envoi +*/ + volatile int _DataPtr = 0; // position de stockage de la prochaine donnee a recevoir + volatile bool _DataReady = false; + volatile bool _SmsReady = false; + volatile int _IndexSms; + Timeout _timeout; // permet deviter blocage en attente + volatile bool FinTimeOut; + bool dataready(void); + char * read(void); + void receive(); + void Ftimeout(); + void SetTimeout(float delay); +// attente r eponse dans *reponse + bool waitreponse(const char *reponse,float timeout); +// envoi commande et attend reponse + bool writecmdandwaitreponse(const char *data, const char *reponse,float timeout); +// attente r eponse dans *reponse + bool waitsmsreponse(const char *reponse,float timeout); +}; +#endif \ No newline at end of file