envoi/reception SMS avec SIM808

Tu m'étonnes j'ai changé déjà une fois de module donc bon là c'est bon :slight_smile:

Manque plus qu'à essayer de compiler les trois programmes : envoie/reception SMS et reçevoir les GPS DATA

oui - ça semble être sur la bonne voie

Je reviendrai si j'ai besoin d'aide mais en tout cas merci à toi t'es top ! :slight_smile:

avec plaisir

au fait je viens de regarder le lien Amazon que vous avez mis, c'est une alimentation à 1A seulement...

Oui mais ce n'est pas très grave non ?, je ne trouvais pas d'autres alimentations correspondant à mes exigences le tout en ayant un ampérage plus élevé.

EDIT:
Le transfo ne chauffera pas ou très peu car à chaque utilisation je ne l'utilise pas assez longtemps pour donc le fait que son ampérage soit légèrement inférieur ou nettement inférieur ne sera pas un gros soucis.

Du moins je l'espère.

Il ne s'agit pas de chauffer mais de suivre la demande...

il se peut que la carte ait besoin de tirer plus d'un ampère suivant ce que vous faites... si vous regardez la doc du module, ils disent dans la table que le SIM808 peut monter en pic à 2A

SIM808.png

D'accord.. je vois c'est embêtant.

J'ai tester à l'instant mon code pour récupérer les coordonnées GPS qui est le dernier programme à tester et je n'ai rien reçu.

Il se peut que c'est parce que l'antenne GPS est en intérieur et donc ne capte pas.

J'ai eu:
AT
AT+CFUN=1
AT+CPIN?
AT+CGNSPWR=1
AT+CGNSTST=1
Open the GPS power success

Et à la suite aucunes trames GPS.

J'essaierai demain en extérieur et si ça ne marche toujours pas je devrai malheuresement penser à une nouvelle alimentation.

Je pensais que la carte n'avait pas de pic aussi haut, j'ai manqué d'attention sur ce sujet.

De plus je n'avais pas trouvé hier d'alimentation délivrant 2A donc je m'étais rabattu sur une alimentation fournissant 1A.

Je vous tiendrai au courant en espérant que l'alimentation que j'ai suffise.

Sinon j'ai moyen de trouver une alimentation en 2A chez un amis donc j'ai un plan B au cas ou le pic à 2A se fait lors de mon utilisation.

OK le pic c’est vraiment si bcp d’activité avec un réseau de mauvaise qualité - Si vous avez pu déjà faire des choses c’est bon signe - le GPS en même temps que le GSM va tirer un peu plus de jus cependant

Pour le GPS avez vous mis une antenne? Il vaut mieux effectivement être très proche d’une fenetre ou dehors - pas dans la cave pour tester :)i

J'ai l'antenne fournie, le câble avec un petit carré métallique qui doit être l'antenne GPS :slight_smile:

J'ai essayé ma foi dans ma cuisine fenêtre ouverte mais comme il pleuvait énormément j'ai évité de trop exposer le matériel donc je verrais demain quand il fera meilleur.

Je vous tiendrais au courant.

Bonjour

Que de bonnes nouvelles en cette belle matiné !

J'ai réussi à faire fonctionner mon programme pour la reception de coordonnées GPS et ça marche.
Je me suis positionné sur mon balcon avec un café et j'ai reçu la longitude, la latitude sans problème.

La suite maintenant est de reçevoir ces données par SMS quand j'envoi un SMS précis à ma SIM808.

Je reviendrai en cas de besoin :slight_smile:

Super bravo!

+1 karma pour la persévérance :slight_smile:

Dites moi là j'essaie de mettre en commun mon code pour envoyer un SMS et celui de la reception d'un SMS.

Je pars du principe que j'utilise d'abord le code (reception d'un SMS) pour ensuite utiliser le code (envoi d'un SMS). J'aimerai du coup récupérer le message lu par le code 1 et le donner au code 2 comme message.

En résumé j'aimerai envoyer un message et reçevoir comme réponse le même message pour commencer.

En théorie est-ce possible ?

Oui bien sûr - en faisant juste un copier coller de leur code et de ce que j'avais écrit au dessus, ça pourrait ressembler à cela:

#include <DFRobot_sim808.h>

char PHONE_NUMBER[] = "+336********"; // N° de portable à changer

const byte tailleMaxSMS = 60;

DFRobot_SIM808 sim808(&Serial);

void setup() {
  Serial.begin(9600);
  while (!sim808.init()) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("\nSim808 init success");
  Serial.println("Start to send message ...");

}

void loop() {
  char gprsBuffer[64];
  char messageRecu[tailleMaxSMS];
  char reponse[tailleMaxSMS + 1] ;
  char * s;
  boolean SMSRecu = false;

  if (sim808.readable()) {
    sim808_read_buffer(gprsBuffer, 32, DEFAULT_TIMEOUT);
    s = strstr(gprsBuffer, "+CMTI: \"SM\""); // on recherche dans la réception [+CMTI: "SM"]

    if (s != NULL) { //SMS: $+CMTI: "SM",24$
      int messageIndex = atoi(s + 12);
      sim808.readSMS(messageIndex, messageRecu, tailleMaxSMS);
      SMSRecu = true;
    }
    sim808_clean_buffer(gprsBuffer, 32);
  }


  // ce code pourrait être directement intégré au dessus sans le booléen SMSRecu, je le sépare juste pour lisibilité ou si le SMS ne doit pas être envoyé tout de suite
  if (SMSRecu) {
    Serial.print(F("SMS Recu: ")); Serial.println(messageRecu);
    Serial.print(F("je renvoie un SMS a ")); Serial.println(PHONE_NUMBER);

    // On fabrique le message que l'on veut renvoyer "RECU: <ici le message reçu>"
    size_t memoireOccupee;
    strncpy(reponse, "RECU: ", tailleMaxSMS); // http://www.cplusplus.com/reference/cstring/strncpy/
    memoireOccupee = strlen(reponse); // http://www.cplusplus.com/reference/cstring/strlen/?kw=strlen (pour être générique, je sais bien que "RECU: " fait 6 caractères)
    strncat(reponse, messageRecu, tailleMaxSMS-memoireOccupee); // http://www.cplusplus.com/reference/cstring/strncat/?kw=strncat
    reponse[tailleMaxSMS] = '\0'; // pour être sûr que le MESSAGE est bien formé

    // on l'envoie
    sim808.sendSMS(PHONE_NUMBER, reponse);
  }

}

Tapé ici au kilomètre, j'ai pas testé du tout si ça compile donc je vous laisse affiner cela mais en gros j'ai pris leur code qui écoute l'arrivée d'un SMS et si oui je copie le SMS reçu dans une c-string (un tableau de caractère) qui s'appelle messageRecu et je mets un booléen à vrai. Une fois le ménage fait dans la reception éventuelle d'un SMS, je teste ce booléen et si j'avais bien reçu un SMS alors je construis une réponse dans une c-string (un tableau de caractère) qui s'appelle reponse et je l'envoie

puis on recommence la boucle

Bon en ayant lu et relu, je n'ai pas compris cette partie car je ne connais pas l'utilité de certaines lignes :

void loop() {
  char gprsBuffer[64]; #1
  char messageRecu[tailleMaxSMS];
  char reponse[tailleMaxSMS + 1] ;#2
  char * s; #3
  boolean SMSRecu = false;

J'ai aussi beaucoup de mal avec la suite mais je verrai après.

J'ai compris qu'on admet une taille précise de caractères pour le message, mais que sont les lignes 1,2,3.
Je ne comprend pas leur fonction

quand vous allez recevoir un SMS sur votre carte, un message qui ressemble à cela

[color=blue]SMS: $+CMTI: "SM",[color=red]24[/color]$[/color]

sera écrit sur la ligne série et la bibliothèque fournie est capable de l'intercepter

le code dit: si le module 808 est accessible

if (sim808.readable()) {

alors j'attends pendant un certain temps pour récupérer une ligne de dialogue en provenance du module

   sim808_read_buffer(gprsBuffer, 32, DEFAULT_TIMEOUT);

pour cela j'ai besoin d'utiliser la fonction sim808_read_buffer qui demande un petit buffer pour stocker les caractères reçus éventuellement donc on déclare auparavant

 char gprsBuffer[64];

pour cette mémoire.

Une fois que l'on revient de cet appel, il faut regarder dans le buffer si on a le mot magique qui indique que l'on a reçu un SMS (lisez les commandes AT, vous verrez ce qu'il se passe sur le port série en cas d'appel (il affiche RING) ou de SMS (on a le +CMTI:...) ).

Donc pour notre SMS on reçoit un truc qui ressemble à cela [color=blue]SMS: $+CMTI: "SM",[color=red]24[/color]$[/color] ou le 24 est la case mémoire de votre SIM où le SMS est stocké.

Donc on teste si on a dans le buffer une partie représentative de ce "mot magique" et faisant

s = strstr(gprsBuffer, "+CMTI: \"SM\"");

la fonction [url=http://www.cplusplus.com/reference/cstring/strstr/?kw=strstr]strstr()[/url] recherche un chaîne de caractère dans une autre et si elle la trouve alors elle retourne un pointeur sur le premier caractère de la chaîne trouvée, sinon elle retourne NULL.

Donc ici on teste si dans le gprsBuffer on a +CMTI: "SM" (il y a des \" dans le code parce qu'on ne peut pas mettre de guillemets directement dans la chaîne sinon le compilateur se mélange les pinceaux et ne sait plus où est la vraie fin de la chaîne) et on met le résultat de cet appel de fonction dans une variable de type pointeur de caractère. C'est pour cela que j'avais besoin de la variable

char * s;

qui va soit être NULL si on n'a pas trouvé le "mot magique" soit être un pointeur au milieu de la chaîne gprsBuffer sur le + de +CMTI: "SM".

Donc maintenant si s est non NULL alors c'est qu'on a reçu un SMS et il va falloir aller l'extraire de la SIM. On commence donc par tester s

   if (s != NULL) {

et quand s n'est pas NULL il faut trouver dans quelle case mémoire de la carte SIM le SMS est rangé. On a cette information aussi dans le message reçu, c'est la partie en rouge. Pour cela donc il faut convertir une chaîne ASCII qui représente un entier en nombre entier.

Si je regarde bien[color=blue]SMS: $+CMTI: "SM",[color=red]24[/color]$[/color] on sait que s pointe sur le + donc si je vais 12 caractères plus loin je vais tomber sur le début de mon chiffre à convertir.

La fonction C qui convertit une chaîne de caractère en nombre entier est [url=http://www.cplusplus.com/reference/cstdlib/atoi/]atoi[/url]() et donc on écrit int messageIndex = atoi(s + 12);pour aller extraire un entier qui commence à la position mémoire s+12. dans mon exemple ci dessus ça mettrait dans messageIndex la valeur 24

Une fois que l'on a la case sur la carte SIM où est rangé notre message il ne reste plus qu'a appeler une fonction de la librairie qui va extraire le contenu du SMS et donc on fait sim808.readSMS(messageIndex, messageRecu, tailleMaxSMS);Le SMS doit bien être stocké quelque part, donc c'est pour cela que j'avais besoin d'un buffer   char messageRecu[tailleMaxSMS];

voilà au retour de cette fonction la cstring messageRecu contient notre message et le booléen que j'avais alloué et initialisé à faux   boolean SMSRecu = false; doit donc passer à vrai en faisant       SMSRecu = true;

voilà :slight_smile:

ensuite on teste si ce booléen est vrai et si oui on construit un message de réponse - donc c'est pour cela que j'avais besoin d'un autre petit buffer mémoire   char reponse[tailleMaxSMS + 1] ; et je vous laisse lire la doc des fonctions strncpy() et strncat() (cf le lien dans le code) puis j'utilise la fonction d'envoi de SMS de la librairie.

c'est la fin de la loop(), les variable locales (tous les petits buffers) sont dé-alloués, et on recommence: on attend un message du SIM808, si on en reçoit un on regarde si c'est le mot magique qui dit qu'on a reçu un SMS, si oui on va trouver la bonne case et on extrait puis on renvoie le message...

ça aide? (curieux de savoir si ça fonctionne :slight_smile: )

Je répond vite fait car je lis depuis 1h votre post qui m'aide énormément et qui me fait comprendre que jamais je n'aurai réussi car je n'ai pas cherché assez loin et qu'il me manquait des connaissances ^^

Oui ça marche chapeau !

Je finis de lire et de comprendre et je vous poserais les questions necessaires ensuite. Merci en tout cas

PatrickJonhson:
Oui ça marche chapeau !

cool :slight_smile:

Alors, tout d'abord merci c'est exactement ce que je souhaite faire.

Je n'avais pas connaissance de cette information: SMS: $$+CMTI: "SM",24$$
Le fait que l'on ait une réponse de ce genre pourtant j'avais bien sous les yeux le pdf des Command-AT

Ensuite les questions :

s = strstr(gprsBuffer, "+CMTI: \"SM\"");
On cherche si on a bien la présence d'un SMS du coup ?

Peut être une question con, mais NULL correspond à quoi, une valeur?, une constante? ou simplement 0?

Soit être un pointeur au milieu de la chaîne gprsBuffer sur le + de +CMTI: "SM" :
Je n'ai saisis le sens de cette phrase, pourquoi s pointe le + ?

il faut trouver dans quelle case mémoire de la carte SIM le SMS est rangé
Avez-vous un schéma des cases mémoire d'une carte SIM j'ai du mal à m'aperçevoir de ce que s'est ?

sim808_clean_buffer(gprsBuffer, 32);

A quoi sert cette ligne ?

char reponse[tailleMaxSMS + 1] ;
Je ne comprend pas le +1

Pour ce qui est de la suite je vais me réferer à ce que vous avez gentillement donné

Mais avez-vous (car je ne trouve pas, peut être que je cherche mal) un document où les fonctions de la librairies sont expliquées ?