Sms 通过Arduino发送/接收短信

Sms 通过Arduino发送/接收短信,sms,embedded,arduino,gsm,gprs,Sms,Embedded,Arduino,Gsm,Gprs,我有一个GBoard,其中包含一个SIM900 GSM/GPRS模块、一个XBEE屏蔽和一个SD卡插槽 我希望Arduino在SIM900模块上发送和接收SMS。具体来说,我想读短信的大部分,并采取一些行动的基础上,短信的内容,然后删除它从SIM卡 如何实现这一点?您好,我建议您按照从GBoard Usefull链接链接到的库中的示例操作。您好,我建议您按照从GBoard Usefull链接链接到的库中的示例操作。以下是我通过SMS打开/关闭LED的方法。您可能需要为您的设置调整代码 #inc

我有一个GBoard,其中包含一个SIM900 GSM/GPRS模块、一个XBEE屏蔽和一个SD卡插槽

我希望Arduino在SIM900模块上发送和接收SMS。具体来说,我想读短信的大部分,并采取一些行动的基础上,短信的内容,然后删除它从SIM卡


如何实现这一点?

您好,我建议您按照从GBoard Usefull链接链接到的库中的示例操作。

您好,我建议您按照从GBoard Usefull链接链接到的库中的示例操作。

以下是我通过SMS打开/关闭LED的方法。您可能需要为您的设置调整代码

#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 SmsStorePos = String("");
String msg = String("");
String snTmp = String("");
String snFull = 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 = 5;

void setup()
{
  mySerial.begin(19200);               // the GPRS baud rate   
  mySerial.print("\r");
  delay(1000);
  Serial.begin(19200);                 // the GPRS baud rate
  Serial.println("Started!");

  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 ){
  sms.toLowerCase();
  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;
  } else {
    mySerial.print("AT+CMGF=1\r");    //Because we want to send the SMS in text mode
    delay(1000);
    mySerial.print("AT+CMGS=\"");
    mySerial.print(snFull);
    mySerial.print("\"\r");
    delay(1000);
    mySerial.print("Unknown Command: ");
    mySerial.print(sms);
    mySerial.print("\r");
    delay(1000);
    mySerial.write(0x1A);  //Equivalent to sending Ctrl+Z     
    return;
  }
}
// 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( "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( "," );
     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 ){
    // get number of sender
    int snPos = msg.indexOf("+1");
    Serial.print("SMS From: ");
    snTmp = msg.substring(snPos+1);
    snFull = "";
    for (int i = 0; i < 11; i++){
      snFull += snTmp[i];    
    }
    Serial.println(snFull);

    // 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 );
    delSMS();
  }

  ClearGprsMsg();
  // EN: Always clear the flag
  // FR: Toujours mettre le flag à 0
  SmsContentFlag = 0; 
}
void delSMS() {
  mySerial.print("AT+CMGD=");
  mySerial.println(SmsStorePos);
}  
#包括
软件序列mySerial(7,8);
//EN:GPRS屏蔽信息的字符串缓冲区
//FR:Mémoire卫生棉de-type string PULL les MESSANGES du shield GPRS
字符串SmsStorePos=字符串(“”);
字符串msg=字符串(“”);
字符串snTmp=字符串(“”);
字符串snFull=字符串(“”);
//EN:当下一条GPRS shield信息包含SMS信息时,设置为1
//FR:Est misá1 quand le prochain message du shield GPRS contiendra le contenu du SMS
int SmsContentFlag=0;
//EN:根据接收到的信息打开和关闭LED的Pin
//FR:Pin de la领导了一个诱惑者/信息基金会
int-ledPin=5;
无效设置()
{
mySerial.begin(19200);//GPRS波特率
mySerial.print(“\r”);
延迟(1000);
Serial.begin(19200);//GPRS波特率
Serial.println(“开始!”);
引脚模式(LED引脚,输出);
数字写入(ledPin,低电平);
}
void循环()
{
半连续字节;
if(Serial.available())
{
mySerial.print((未签名字符)Serial.read());
}  
else if(mySerial.available())
{
半连续字节;
SerialInByte=(无符号字符)mySerial.read();
//EN:继电器至Arduino IDE监视器
//弗雷尔:阿尔杜伊诺足球俱乐部的转播员
串行打印(串行字节);
// -------------------------------------------------------------------
//EN:节目还可以收听GPRS屏蔽信息。
//FR:Le Programécouteégalement les messages issus du GPRS Shield。
// -------------------------------------------------------------------
//EN:如果消息以结尾,则处理消息
//FR:SILE信息
如果(SerialInByte==13){
//EN:将字符存储到消息缓冲区中
//FR:Stockéle caractère dans le buffer de message
ProcessGprsMsg();
}
如果(SerialInByte==10){
//EN:跳过换行
//FR:Ignorer les线路馈线
}
否则{
//EN:将当前字符存储在消息字符串缓冲区中
//FR:stocker le caractère dans la mémoire卫生棉条réservéau信息
msg+=字符串(串行字节);
}
}   
}
//EN:根据短信内容采取行动。
//请注意,短信内容是多条GPRS屏蔽信息处理的结果。
//FR:在短消息基础上执行联合国行动。
//请注意,短消息的内容是GPRS中的多条消息的传输结果。
无效处理sms(字符串sms){
sms.toLowerCase();
串行打印(“ProcessSms for[”);
串行打印(sms);
Serial.println(“]);
如果(sms.indexOf(“on”)>=0){
数字写入(ledPin,高电平);
Serial.println(“LED亮起”);
返回;
}
如果(sms.indexOf(“关闭”)>=0){
数字写入(ledPin,低电平);
Serial.println(“LED熄灭”);
返回;
}否则{
mySerial.print(“AT+CMGF=1\r”);//因为我们希望以文本模式发送SMS
延迟(1000);
mySerial.print(“AT+CMGS=\”);
mySerial.print(snFull);
mySerial.print(“\”\r”);
延迟(1000);
print(“未知命令:”);
mySerial.print(sms);
mySerial.print(“\r”);
延迟(1000);
mySerial.write(0x1A);//相当于发送Ctrl+Z
返回;
}
}
//EN:短信的请求文本模式
//FR:Demande d'User le mode文本输入提示信息
void GprsTextModeSMS(){
mySerial.println(“AT+CMGF=1”);
}
无效GprsReadSmsStore(字符串SmsStorePos){
//串行打印(“用于storePos的GprsReadSmsStore”);
//Serial.println(SmsStorePos);
mySerial.print(“AT+CMGR=”);
mySerial.println(SmsStorePos);
}
//EN:清除GPRS屏蔽消息缓冲区
//FR:GPRS屏蔽信息用棉塞抹去内容。
void cleargprsmg(){
msg=“”;
}
//EN:解读GPRS屏蔽信息并采取适当行动
//FR:翻译GPRS屏蔽和快速通信的信息
void ProcessGprsMsg(){
Serial.println(“”);
串行打印(“GPRS信息:[”);
串行打印(msg);
Serial.println(“]);
如果(msg.indexOf(“呼叫准备就绪”)>=0){
Serial.println(“***GPRS Shield已在移动网络***”上注册);
GprsTextModeSMS();
}
//EN:收到短信时收到未经请求的信息
//FR:非sollicitéquand联合国短信到达
如果(msg.indexOf(“+CMTI”)>=0){
Serial.println(“***短信接收***”);
//EN:在完整信息中查找昏迷(+CMTI:“SM”,6)
//在样本中,SMS存储在位置6
//FR:Rechercher la position de la virgule dans le message complett(+CMTI:“SM”,6)
//以丹麦为例,这是第6位
int iPos=msg.indexOf(“,”);
SmsStorePos=消息子串(IPO+1);
串行打印(“SMS存储在”);
Serial.println(SmsStorePos);
//要求阅读短信商店
//FR:Demande de de Declause du stockage SMS
GprsReadSmsStore(SmsStorePos);
}
//EN:通过UART读取的SMS存储(GprsReadSmsStore请求的结果)
//FR:l'UART库存短信讲座(résultat de la requete GprsReadSmsStore)
如果(msg.indexOf(“+CMGR:”)>=0){
//通用电气