SmsCommand

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche

Description

Le but de ce petit projet est de commander une sortie d'Arduino en fonction d'un ordre reçu via SMS sur le GSM/GPRS Shield.

Ce projet utilise un interpréteur de commande rudimentaire pour dialoguer avec le SIM900 et dont le fonctionnement est décrit dans la page [SerialCommand].

Vous vous n'avez pas encore lu l'article SerialCommand, je vous invite vivement à le faire, cela éliminera d'emblée une partie de la complexité du code ci-dessous.

Ce programme de démonstration fait également un usage intensif de messages de déboggages qui sont envoyés sur le port série. Vous pouvez également envoyer vos propres commandes AT directement sur le SIM900.

Vous devez configurer le Moniteur Serie d'Arduino IDE sur 19200 baud et Carriage Return.

Le montage

Un LED est raccordée sur la PIN 13 par l'intermédiaire d'une résistance de 330 Ohm.

SimpleLedPin13.png

Augmenter le buffer de réception

Librairie NewSoftSerial (ou SoftwareSerial pour Arduino >= 1.0) utilise un buffer (mémoire tampon) de 64 octets/bytes pour la réception des messages envoyés par le GPRS shield.

Lorsque vous voulez pouvoir consulter des messages SMS en mode texte, cette taille de buffer est insuffisant.

Le résultat le plus frappant, c'est que les commandes AT+CMGR ne retournerons pas le contenu du SMS ou se limiterons uniquement aux quelques premiers caractères.

Il faut donc modifier la librairie NewSoftSerial/SoftwareSerial pour augmenter la taille du buffer. Rassurez-vous, cela se fait assez simplement.

Environnement Arduino < 1.0

Pour augmenter la taille du buffer:

  1. Chercher le fichier NewSoftSerial.h dans vos librairies Arduino
  2. Localiser la ligne _NewSS_MAX_RX_BUFF
  3. Augmenter la taille du buffer à 128 (au lieu de 64)
  4. Recompiler votre sketch.

Environnement Arduino >= 1.0

Pour augmenter la taille du buffer (mémoire tampon):

  1. Chercher le fichier SoftwareSerial.h dans vos librairies Arduino
  2. Localiser la ligne _SS_MAX_RX_BUFF
  3. Augmenter la taille du buffer à 128 (au lieu de 64)
  4. Recompiler votre sketch.

Modus Operandi

Note préliminaire

Le programme de démonstration présenté ici est similaire au programme SerialRelay présent dans le documentation générale du GPRS shield.

GSM-Shield-09-SerialRelay-fr.jpg
  • Toutes les commandes que vous entrez dans le moniteur série d'Arduino sont envoyés à l'UART du GPRS Shield.
  • Tous les messages issus de l'UART du shield GPRS:
    • Sont envoyés vers le moniteur série d'Arduino.
    • Sont également analysés par le programme Arduino pour mettre en place un système de réponse automatique (ce qui permet d'entrer un code PIN automatiquement ou réagir à la réception d'un SMS).
  • Comme l'UART du GPRS shield est configuré en mode ECHO (il renvoi le texte des commandes reçues), toutes les commandes envoyées par le programme au shield GPRS seront reproduits en sortie par le shield GPRS. En conséquence, les commandes envoyées étant retournées par le GPRS shield, ces commandes envoyées seront aussi analysée par le programme en tant que message en provenance du shield GPRS. Cette information prendra probablement du sens lorsque vous consulterez le résultat du programme que nous avons reproduit ci dessous.

Note:

  • Le programme ci-dessous fait un usage intensif de message de débogage vers le moniteur série d'Arduino.
  • Le but de ces messages est, bien entendu, de vous aider à comprendre le fonctionnement interne du logiciel.

Utilisation du logiciel

Voici comment utilisé le programme présenté:

  1. Charger le projet sur la carte Arduino
  2. démarrer le moniteur série
  3. démarrer le GPRS Shield en appuyant sur le bouton on/off
    1. Le programme attend le mot clé "Ready" OU "+CPIN: SIM PIN" qui indique qu'un code PIN est attendu.
    2. Si un code Pin est attendu, ce dernier est automatiquement envoyé (voir contenu de la variable SIM_PIN_CODE)
    3. Lorsque le GPRS shield est enregistré sur le réseau, le message "Call Ready" est envoyé par le module SIM900.
  4. A l'enregistrement sur le réseau mobile:
    1. Le message "Call Ready" est capturé par le logiciel qui affiche alors le message "*** GPRS Shield registered on Mobile Network ***"
    2. Le programme configure le GPRS shield en Mode Texte pour les SMS (voir commande "AT+CMGF=1")
  5. Utilisez un autre mobile et envoyez le message "on" par SMS vers le no de téléphone du shield GPRS
  6. Le Shield reçoit une alerte SMS (message "+CMTI").
    1. Le programme affiche le texte "*** SMS Received ***"
    2. Le programme extrait la position de stockage du SMS dans le module SIM900 depuis le message "+CMTI"
    3. Le programme consulte le contenu du message à l'aide de la commande "AT+CMGR=xx" (xx est le numéro de stockage du SMS dans le module SIM900)
    4. Il récupère ensuite le texte du message.
    5. Il interprète le contenu du message (par l'intermédiaire de la fonction ProcessSms).

Code Source - Arduino < 1.0

Le programme est malheureusement un peu long mais il fonctionne parfaitement.

Vous pouvez le télécharger en cliquant sur SmsCommand_V0.pde.

// EN: 
//   SmsCommand - Active Pin 13 On/OFF depending on the received SMS message (on/off).
//                This soft also send the PIN code to SIM card when appropriate.
//   Based on Serial Relay. Arduino will still patch a  serial link between the 
//             computer and the GPRS Shield at 19200 bps 8-N-1.
//
//   *** Configure Serial Monitor to Carriage Return, 19200 bauds ***
//
//   *** VERY IMPORTANT!!!                                  ***
//   *** FOR READING SMS, DO NOT FORGET TO CHANGE           ***
//   *** THE BUFFER SIZE OF NewSoftSerial to 128 bytes      ***
//   ***   see line _NewSS_MAX_RX_BUFF in NewSoftSerial.h   ***
//
// FR: 
//   SmsCommand - Active la pin 13 allumer/éteindre en fonction du message (on/off) 
//             reçu par SMS. Ce logiciel envoie également le code PIN si la carte SIM
//             en demande un.
//   Basé Serial Relay. Arduino maintient également une liaison série entre l'ordinateur  
//             et le shield GPRS a 19200 bps 8-N-1.
//
//   *** Configurer le Moniteur Serie sur Carriage Return, 19200 bauds ***
//
//   *** TRES IMPORTANT!!!  
//   *** POUR LA LECTURE DES SMS, NE PAS OUBLIER DE MODIFIER              ***                
//   ***  LA TAILLE DU BUFFER DE RECEPTION DE NewSoftSerial SUR 128 bytes ***
//   ***   voir la ligne _NewSS_MAX_RX_BUFF dans NewSoftSerial.h          ***
//  
//  Pour plus d'information voir 
//      http://mchobby.be/wiki/index.php?title=GeekOnFire_GSM/GPRS_Shield
//
//  Licence - Share-Alike - CC-BY-SA
//
//  Toutes toute référence, mention ou extrait de ce contenu doit être explicitement 
//  accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » 
//  et ce quelque soit le média utilisé.  
//
//  BONNE AMUSEMENT :-)
//
#include <NewSoftSerial.h>
 
NewSoftSerial mySerial(7, 8);

// EN: String buffer for the GPRS shield message
// FR: Mémoire tampon de type string pour les messages du shield GPRS 
String msg = String("");
// EN: Set to 1 when the next GPRS shield message will contains the SMS message
// FR: Est mis à 1 quand le prochain message du shield GPRS contiendra le contenu du SMS
int SmsContentFlag = 0;

// EN: Pin of the LED to turn ON and OFF depending on the received message
// FR: Pin de la LED a allumer/éteindre en fonction du message reçu
int ledPin = 13;

// EN: Code PIN of the SIM card (if applied)
// FR: Code PIN de la carte SIM (si applicable)
String SIM_PIN_CODE = String( "XXXX" );
 
void setup()
{
  mySerial.begin(19200);               // the GPRS baud rate   
  Serial.begin(19200);                 // the GPRS baud rate

  // Initialize la PIN
  pinMode( ledPin, OUTPUT ); 
  digitalWrite( ledPin, LOW ); 
}
 
void loop()
{
    char SerialInByte;
     
    if(Serial.available())
    {
       mySerial.print((unsigned char)Serial.read());
     }  
    else  if(mySerial.available())
    {
        char SerialInByte;
        SerialInByte = (unsigned char)mySerial.read();
        
        // EN: Relay to Arduino IDE Monitor
        // FR: Relayer l'information vers le moniteur Serie Arduino
        Serial.print( SerialInByte );
        
        // -------------------------------------------------------------------
        // EN: Program also listen to the GPRS shield message.
        // FR: Le programme écoute également les messages issus du GPRS Shield.
        // -------------------------------------------------------------------
        
        // EN: If the message ends with <CR> then process the message
        // FR: Si le message se termine par un <CR> alors traiter le message 
        if( SerialInByte == 13 ){
          // EN: Store the char into the message buffer
          // FR: Stocké le caractère dans le buffer de message
          ProcessGprsMsg();
         }
         if( SerialInByte == 10 ){
            // EN: Skip Line feed
            // FR: Ignorer les Line Feed 
         }
         else {
           // EN: store the current character in the message string buffer
           // FR: stocker le caractère dans la mémoire tampon réservé au message
           msg += String(SerialInByte);
         }
     }   
}

// EN: Make action based on the content of the SMS. 
//     Notice than SMS content is the result of the processing of several GPRS shield messages.
// FR: Execute une action sur base du contenu d'un SMS.
//     Notez que le contenu du SMS est le résultat du traitement de plusieurs messages du shield GPRS.
void ProcessSms( String sms ){
  Serial.print( "ProcessSms for [" );
  Serial.print( sms );
  Serial.println( "]" );
  
  if( sms.indexOf("on") >= 0 ){
    digitalWrite( ledPin, HIGH );
    Serial.println( "LED IS ON" );
    return;
  }
  if( sms.indexOf("off") >= 0 ){
    digitalWrite( ledPin, LOW );
    Serial.println( "LED IS OFF" );
    return;
  }
}

// EN: Send the SIM PIN Code to the GPRS shield
// FR: Envoyer le code PIN de la carte SIM au shield GRPS
void GprsSendPinCode(){
  if( SIM_PIN_CODE.indexOf("XXXX")>=0 ){
    Serial.println( "*** OUPS! you did not have provided a PIN CODE for your SIM CARD. ***" );
    Serial.println( "*** Please, define the SIM_PIN_CODE variable . ***" );
    return;
  }
  mySerial.print("AT+CPIN=");
  mySerial.println( SIM_PIN_CODE );
}

// EN: Request Text Mode for SMS messaging
// FR: Demande d'utiliser le mode Text pour la gestion des messages
void GprsTextModeSMS(){
  mySerial.println( "AT+CMGF=1" );
}

void GprsReadSmsStore( String SmsStorePos ){
  // Serial.print( "GprsReadSmsStore for storePos " );
  // Serial.println( SmsStorePos ); 
  mySerial.print( "AT+CMGR=" );
  mySerial.println( SmsStorePos );
}

// EN: Clear the GPRS shield message buffer
// FR: efface le contenu de la mémoire tampon des messages du GPRS shield.
void ClearGprsMsg(){
  msg = "";
}

// EN: interpret the GPRS shield message and act appropiately
// FR: interprete le message du GPRS shield et agit en conséquence
void ProcessGprsMsg() {
  Serial.println("");
  Serial.print( "GPRS Message: [" );
  Serial.print( msg );
  Serial.println( "]" );
  
  if( msg.indexOf( "+CPIN: SIM PIN" ) >= 0 ){
     Serial.println( "*** NEED FOR SIM PIN CODE ***" );
     Serial.println( "PIN CODE *** WILL BE SEND NOW" );
     GprsSendPinCode();
  }

  if( msg.indexOf( "Call Ready" ) >= 0 ){
     Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
     GprsTextModeSMS();
  }
  
  // EN: unsolicited message received when getting a SMS message
  // FR: Message non sollicité quand un SMS arrive
  if( msg.indexOf( "+CMTI" ) >= 0 ){
     Serial.println( "*** SMS Received ***" );
     // EN: Look for the coma in the full message (+CMTI: "SM",6)
     //     In the sample, the SMS is stored at position 6
     // FR: Rechercher la position de la virgule dans le message complet (+CMTI: "SM",6) 
     //     Dans l'exemple, le SMS est stocké à la position 6
     int iPos = msg.indexOf( "," );
     String SmsStorePos = msg.substring( iPos+1 );
     Serial.print( "SMS stored at " );
     Serial.println( SmsStorePos );
     
     // EN: Ask to read the SMS store
     // FR: Demande de lecture du stockage SMS
     GprsReadSmsStore( SmsStorePos );
  }
  
  // EN: SMS store readed through UART (result of GprsReadSmsStore request)  
  // FR: Lecture du stockage SMS via l'UART (résultat de la requete GprsReadSmsStore)
  if( msg.indexOf( "+CMGR:" ) >= 0 ){
    // EN: Next message will contains the BODY of SMS
    // FR: Le prochain message contiendra le contenu du SMS
    SmsContentFlag = 1;
    // EN: Following lines are essentiel to not clear the flag!
    // FR: Les ligne suivantes sont essentielle pour ne pas effacer le flag!
    ClearGprsMsg();
    return;
  }
  
  // EN: +CMGR message just before indicate that the following GRPS Shield message 
  //     (this message) will contains the SMS body
  // FR: le message +CMGR précédent indiquait que le message suivant du Shield GPRS 
  //     (ce message) contient le corps du SMS 
  if( SmsContentFlag == 1 ){
    Serial.println( "*** SMS MESSAGE CONTENT ***" );
    Serial.println( msg );
    Serial.println( "*** END OF SMS MESSAGE ***" );
    ProcessSms( msg );
  }
  
  ClearGprsMsg();
  // EN: Always clear the flag
  // FR: Toujours mettre le flag à 0
  SmsContentFlag = 0; 
}

Code Source - Arduino >= 1.0

Cette version du code est adaptée pour fonctionner avec Arduino 1.0.

Vous pouvez le télécharger en cliquant sur SmsCommand_Ard10.ino.

// EN: 
//   *** PATCHED for Arduino 1.0 ***
//   SmsCommand - Active Pin 13 On/OFF depending on the received SMS message (on/off).
//                This soft also send the PIN code to SIM card when appropriate.
//   Based Serial Relay. Arduino will still patch a  serial link between the 
//             computer and the GPRS Shield at 19200 bps 8-N-1.
//
//   *** Configure Serial Monitor to Carriage Return, 19200 bauds ***
//
//   *** VERY IMPORTANT!!!                                  ***
//   *** FOR READING SMS, DO NOT FORGET TO CHANGE           ***
//   *** THE BUFFER SIZE OF NewSoftSerial to 128 bytes      ***
//   ***   see line _NewSS_MAX_RX_BUFF in NewSoftSerial.h   ***
//
// FR:
//   *** Version adaptée for Arduino 1.0 (ou supérieur) ***
//
//   SmsCommand - Active la pin 13 allumer/éteindre en fonction du message (on/off) 
//             reçu par SMS. Ce logiciel envoie également le code PIN si la carte SIM
//             en demande un.
//   Basé Serial Relay. Arduino maintient également une liaison série entre l'ordinateur  
//             et le shield GPRS a 19200 bps 8-N-1.
//
//   *** Configurer le Moniteur Serie sur Carriage Return, 19200 bauds ***
//
//   *** TRES IMPORTANT!!!  
//   *** POUR LA LECTURE DES SMS, NE PAS OUBLIER DE MODIFIER              ***                
//   ***  LA TAILLE DU BUFFER DE RECEPTION DE NewSoftSerial SUR 128 bytes ***
//   ***   voir la ligne _NewSS_MAX_RX_BUFF dans NewSoftSerial.h          ***
//  
//  Pour plus d'information voir 
//      http://mchobby.be/wiki/index.php?title=GeekOnFire_GSM/GPRS_Shield
//
//  Licence - Share-Alike - CC-BY
//
//  Toutes toute référence, mention ou extrait de ce contenu doit être explicitement 
//  accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » 
//  et ce quelque soit le média utilisé.  
//
//  BONNE AMUSEMENT :-)
//
#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(7, 8);

// EN: String buffer for the GPRS shield message
// FR: Mémoire tampon de type string pour les messages du shield GPRS 
String msg = String("");
// EN: Set to 1 when the next GPRS shield message will contains the SMS message
// FR: Est mis à 1 quand le prochain message du shield GPRS contiendra le contenu du SMS
int SmsContentFlag = 0;

// EN: Pin of the LED to turn ON and OFF depending on the received message
// FR: Pin de la LED a allumer/éteindre en fonction du message reçu
int ledPin = 13;

// EN: Code PIN of the SIM card (if applied)
// FR: Code PIN de la carte SIM (si applicable)
String SIM_PIN_CODE = String( "XXXX" );
 
void setup()
{
  mySerial.begin(19200);               // the GPRS baud rate   
  Serial.begin(19200);                 // the GPRS baud rate

  // Initialize la PIN
  pinMode( ledPin, OUTPUT ); 
  digitalWrite( ledPin, LOW ); 
}
 
void loop()
{
    char SerialInByte;
     
    if(Serial.available())
    {
       mySerial.print((unsigned char)Serial.read());
     }  
    else  if(mySerial.available())
    {
        char SerialInByte;
        SerialInByte = (unsigned char)mySerial.read();
        
        // EN: Relay to Arduino IDE Monitor
        // FR: Relayer l'information vers le moniteur Serie Arduino
        Serial.print( SerialInByte );
        
        // -------------------------------------------------------------------
        // EN: Program also listen to the GPRS shield message.
        // FR: Le programme écoute également les messages issus du GPRS Shield.
        // -------------------------------------------------------------------
        
        // EN: If the message ends with <CR> then process the message
        // FR: Si le message se termine par un <CR> alors traiter le message 
        if( SerialInByte == 13 ){
          // EN: Store the char into the message buffer
          // FR: Stocké le caractère dans le buffer de message
          ProcessGprsMsg();
         }
         if( SerialInByte == 10 ){
            // EN: Skip Line feed
            // FR: Ignorer les Line Feed 
         }
         else {
           // EN: store the current character in the message string buffer
           // FR: stocker le caractère dans la mémoire tampon réservé au message
           msg += String(SerialInByte);
         }
     }   
}

// EN: Make action based on the content of the SMS. 
//     Notice than SMS content is the result of the processing of several GPRS shield messages.
// FR: Execute une action sur base du contenu d'un SMS.
//     Notez que le contenu du SMS est le résultat du traitement de plusieurs messages du shield GPRS.
void ProcessSms( String sms ){
  Serial.print( "ProcessSms for [" );
  Serial.print( sms );
  Serial.println( "]" );
  
  if( sms.indexOf("on") >= 0 ){
    digitalWrite( ledPin, HIGH );
    Serial.println( "LED IS ON" );
    return;
  }
  if( sms.indexOf("off") >= 0 ){
    digitalWrite( ledPin, LOW );
    Serial.println( "LED IS OFF" );
    return;
  }
}

// EN: Send the SIM PIN Code to the GPRS shield
// FR: Envoyer le code PIN de la carte SIM au shield GRPS
void GprsSendPinCode(){
  if( SIM_PIN_CODE.indexOf("XXXX")>=0 ){
    Serial.println( "*** OUPS! you did not have provided a PIN CODE for your SIM CARD. ***" );
    Serial.println( "*** Please, define the SIM_PIN_CODE variable . ***" );
    return;
  }
  mySerial.print("AT+CPIN=");
  mySerial.println( SIM_PIN_CODE );
}

// EN: Request Text Mode for SMS messaging
// FR: Demande d'utiliser le mode Text pour la gestion des messages
void GprsTextModeSMS(){
  mySerial.println( "AT+CMGF=1" );
}

void GprsReadSmsStore( String SmsStorePos ){
  // Serial.print( "GprsReadSmsStore for storePos " );
  // Serial.println( SmsStorePos ); 
  mySerial.print( "AT+CMGR=" );
  mySerial.println( SmsStorePos );
}

// EN: Clear the GPRS shield message buffer
// FR: efface le contenu de la mémoire tampon des messages du GPRS shield.
void ClearGprsMsg(){
  msg = "";
}

// EN: interpret the GPRS shield message and act appropiately
// FR: interprete le message du GPRS shield et agit en conséquence
void ProcessGprsMsg() {
  Serial.println("");
  Serial.print( "GPRS Message: [" );
  Serial.print( msg );
  Serial.println( "]" );
  
  if( msg.indexOf( "+CPIN: SIM PIN" ) >= 0 ){
     Serial.println( "*** NEED FOR SIM PIN CODE ***" );
     Serial.println( "PIN CODE *** WILL BE SEND NOW" );
     GprsSendPinCode();
  }

  if( msg.indexOf( "Call Ready" ) >= 0 ){
     Serial.println( "*** GPRS Shield registered on Mobile Network ***" );
     GprsTextModeSMS();
  }
  
  // EN: unsolicited message received when getting a SMS message
  // FR: Message non sollicité quand un SMS arrive
  if( msg.indexOf( "+CMTI" ) >= 0 ){
     Serial.println( "*** SMS Received ***" );
     // EN: Look for the coma in the full message (+CMTI: "SM",6)
     //     In the sample, the SMS is stored at position 6
     // FR: Rechercher la position de la virgule dans le message complet (+CMTI: "SM",6) 
     //     Dans l'exemple, le SMS est stocké à la position 6
     int iPos = msg.indexOf( "," );
     String SmsStorePos = msg.substring( iPos+1 );
     Serial.print( "SMS stored at " );
     Serial.println( SmsStorePos );
     
     // EN: Ask to read the SMS store
     // FR: Demande de lecture du stockage SMS
     GprsReadSmsStore( SmsStorePos );
  }
  
  // EN: SMS store readed through UART (result of GprsReadSmsStore request)  
  // FR: Lecture du stockage SMS via l'UART (résultat de la requete GprsReadSmsStore)
  if( msg.indexOf( "+CMGR:" ) >= 0 ){
    // EN: Next message will contains the BODY of SMS
    // FR: Le prochain message contiendra le contenu du SMS
    SmsContentFlag = 1;
    // EN: Following lines are essentiel to not clear the flag!
    // FR: Les ligne suivantes sont essentielle pour ne pas effacer le flag!
    ClearGprsMsg();
    return;
  }
  
  // EN: +CMGR message just before indicate that the following GRPS Shield message 
  //     (this message) will contains the SMS body
  // FR: le message +CMGR précédent indiquait que le message suivant du Shield GPRS 
  //     (ce message) contient le corps du SMS 
  if( SmsContentFlag == 1 ){
    Serial.println( "*** SMS MESSAGE CONTENT ***" );
    Serial.println( msg );
    Serial.println( "*** END OF SMS MESSAGE ***" );
    ProcessSms( msg );
  }
  
  ClearGprsMsg();
  // EN: Always clear the flag
  // FR: Toujours mettre le flag à 0
  SmsContentFlag = 0; 
}

Résultat sur le Moniteur Série

Voici le résultat obtenu sur le moniteur d'Arduino IDE pour les deux commandes "on" puis "off" envoyé par SMS.

 
ÿÿÿÿÿÿÿÿ
GPRS Message: [ÿÿÿÿÿÿÿÿ A]

RDY
GPRS Message: [RDY]

GPRS Message: []

+CFUN: 1
GPRS Message: [+CFUN: 1]

GPRS Message: []

+CPIN: SIM PIN
GPRS Message: [+CPIN: SIM PIN]
*** NEED FOR SIM PIN CODE ***
PIN CODE *** WILL BE SEND NOW

AT+CPIN=--secret--
GPRS Message: [AT+CPIN=--secret--]

GPRS Message: []
OK

GPRS Message: [OK]

GPRS Message: []

Call Ready
GPRS Message: [Call Ready]
*** GPRS Shield registered on Mobile Network ***

AT+CMGF=1
GPRS Message: [AT+CMGF=1]

GPRS Message: []

OK
GPRS Message: [OK]

GPRS Message: []

+CMTI: "SM",20
GPRS Message: [+CMTI: "SM",20]
*** SMS Received ***
SMS stored at 20

AT+CMGR=20
GPRS Message: [AT+CMGR=20]

GPRS Message: []

+CMGR: "REC UNREAD","+3249--secret--","","12/04/08,14:00:15+08"
GPRS Message: [+CMGR: "REC UNREAD","+3249--secret--","","12/04/08,14:00:15+08"]

on
GPRS Message: [on]
*** SMS MESSAGE CONTENT ***
on
*** END OF SMS MESSAGE ***
ProcessSms for [on]
LED IS ON

GPRS Message: [ ]

OK
GPRS Message: [OK]

GPRS Message: []

+CMTI: "SM",21
GPRS Message: [+CMTI: "SM",21]
*** SMS Received ***
SMS stored at 21
AT+CMGR=21
GPRS Message: [AT+CMGR=21]

GPRS Message: []

+CMGR: "REC UNREAD","+3249--secret--","","12/04/08,14:00:39+08"
GPRS Message: [+CMGR: "REC UNREAD","+3249--secret--","","12/04/08,14:00:39+08"]

off

GPRS Message: [off]
*** SMS MESSAGE CONTENT ***
off
*** END OF SMS MESSAGE ***
ProcessSms for [off]
LED IS OFF

GPRS Message: []

OK
GPRS Message: [OK]

Résultat en image

Puisque rien ne vaut une bonne petite vidéo...

{{#Widget:Iframe |url=http://www.youtube.com/embed/lmoz-XrSfEw |width=420 |height=315 |border=0 }}

La vidéo est disponible ici


Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.