GPRS Shield Прием sms

Тема в разделе "Arduino & Shields", создана пользователем Makhonin, 3 июл 2012.

  1. Makhonin

    Makhonin Гик

    У меня есть сей шилд (http://amperka.ru/collection/Platy/product/gprs-shield).
    Откопал вот такой код:
    Код (Text):

    /* GSM Shield example
     
    created 2011
    by Boris Landoni
     
    This example code is in the public domain.
     
     
    http://www.open-electronics.org
    http://www.futurashop.it
    */
     
    #include <GSM_Shield.h>
     
    //**************************************************************************
    char number[]="+7телефон";  //Destination number
    char text[]="hello world";  //SMS to send
    byte type_sms=SMS_UNREAD;      //Type of SMS
    byte del_sms=0;                //0: No deleting sms - 1: Deleting SMS
    //**************************************************************************
     
    GSM gsm;
    char sms_rx[122]; //Received text SMS
    //int inByte=0;    //Number of byte received on serial port
    char number_incoming[20];
    int call;
    int error;
     
     
    void setup()
    {
      Serial.begin(9600);
      Serial.println("system startup");
      gsm.TurnOn(9600);          //module power on
      gsm.InitParam(PARAM_SET_1);//configure the module
      gsm.Echo(0);              //enable AT echo
     
    }
     
     
    void loop()
    {
      char inSerial[5];
      int i=0;
      delay(2000);
     
        Check_Call(); //Check if there is an incoming call
        Check_SMS();  //Check if there is SMS
        //Check data serial com
     
        if (Serial.available() > 0)
        {      
          while (Serial.available() > 0) {
            inSerial[i]=(Serial.read()); //read data
            i++;
          }
          inSerial[i]='\0';
          Check_Protocol(inSerial);
        }
     
    }
     
    void Check_Protocol(String inStr)
    {
          Serial.print("Command: ");
          Serial.println(inStr);
     
      Serial.println("Check_Protocol");
     
        switch (inStr[0])
          {
          case 'a' :  //Answer  
              if (gsm.CallStatus()==CALL_INCOM_VOICE){
                gsm.PickUp();
                Serial.println("Answer");
              }
              else
              {
                Serial.println("No incoming call");
              }
            break;
     
     
          case 'c': // C  //Call
            if (inStr.length()<2)  //To call variable 'number'    comand  c
            {
              Serial.print("Calling ");
              Serial.println(number);  
              gsm.Call(number);
            }
            if (inStr.length()==2)  //To call number in phone book position  comand  cx where x is the SIM position
            {
                error=gsm.GetPhoneNumber(inStr[1],number);
                if (error!=0)
                {
                  Serial.print("Calling ");
                  Serial.println(number);
                  gsm.Call(number);
                }
                else
                {
                  Serial.print("No number in pos ");
                  Serial.println(inStr[1]);
                }
            }
            break;
         
          case 'h': //H //HangUp if there is an incoming call
            if (gsm.CallStatus()!=CALL_NONE)  
            {
              Serial.println("Hang");
              gsm.HangUp();        
            }
            else
            {
              Serial.println("No incoming call");
            }
            break;
       
       
          case 's': //S //Send SMS
            Serial.print("Send SMS to ");
            Serial.println(number);
            error=gsm.SendSMS(number,text);
            if (error==0)  //Check status
            {
                Serial.println("SMS ERROR \n");
            }
            else
            {
                Serial.println("SMS OK \n");      
            }
            break;
             
          case 'p':  //Read-Write Phone Book
            if (inStr.length()==3)
            {
         
              switch (inStr[1])
              {
                case 'd':  //Delete number in specified position  pd2
                  error=gsm.DelPhoneNumber(inStr[2]);
                  if (error!=0)
                  {
                    Serial.print("Phone number position ");
                    Serial.print(inStr[2]);
                    Serial.println(" deleted");
                  }
                  break;
             
             
             
                case 'g':  //Read from Phone Book position      pg2
                  error=gsm.GetPhoneNumber(inStr[2],number);
                  if (error!=0)  //Find number in specified position
                  {
                    Serial.print("Phone Book position ");
                    Serial.print(inStr[2]);
                    Serial.print(": ");
                    Serial.println(number);
                  }
                  else  //Not find number in specified position
                  {
                    Serial.print("No Phone number in position ");
                    Serial.println(inStr[2]);
                  }
                  break;
                case 'w':  //Write from Phone Book Position    pw2
                  error=gsm.WritePhoneNumber(inStr[2],number);
                  if (error!=0)
                  {
                    Serial.print("Number ");
               
                    Serial.print(number);
                    Serial.print(" writed in Phone Book position ");
                    Serial.println(inStr[2]);
                  }
                  else Serial.println("Writing error");
                  break;
             
             
             
              }
         
            }
            break;
       
          }
     
        delay(1500);
     
        return;
    }
     
     
    void Check_Call()  //Check status call if this is available
    {
        call=gsm.CallStatus();
        switch (call)
        {
          case CALL_NONE:
            Serial.println("no call");
            break;
          case CALL_INCOM_VOICE:
            gsm.CallStatusWithAuth(number_incoming,0,0);  
            Serial.print("incoming voice call from ");
            Serial.println(number_incoming);
            break;
          case CALL_ACTIVE_VOICE:
            Serial.println("active voice call");
            break;
          case CALL_NO_RESPONSE:
            Serial.println("no response");
            break;
        }
        return;
    }
     
     
    void Check_SMS()  //Check if there is an sms 'type_sms'
    {
        char pos_sms_rx;  //Received SMS position
        pos_sms_rx=gsm.IsSMSPresent(type_sms);
        if (pos_sms_rx!=0)
        {
          //Read text/number/position of sms
          gsm.GetSMS(pos_sms_rx,number_incoming,sms_rx,120);
          Serial.print("Received SMS from ");
          Serial.print(number_incoming);
          Serial.print("(sim position: ");
          Serial.print(word(pos_sms_rx));
          Serial.println(")");
          Serial.println(sms_rx);
          if (del_sms==1)  //If 'del_sms' is 1, i delete sms
          {
            error=gsm.DeleteSMS(pos_sms_rx);
            if (error==1)Serial.println("SMS deleted");
            else Serial.println("SMS not deleted");
          }
        }
        return;
    }
     
    Чувствует входящий звонок, снимает трубку и отправляет sms. С этим все норм. Не никак не понимает входящие sms. Они вообще не доходят. Как только я переставляю сим-карту в обычный телефон, то все смски сразу же приходят. В чем может быть проблема?
     
  2. Sajum

    Sajum Нуб

    Тут всё хитрее.
    Есть команда AT+CNMI, которую надо передавать шилду при инициализации.
    Она ключ ко всему. С помощью нее можно задать, будет ли GPRS Shield сохранять смс на симке или нет, будет ли выдавать GPRS Shield смс сам при приходе (причем различаются смс с телефона и смс с сайта ОПСОСа) или же надо будет считывать с помощью AT+CMGL.
    Вы используете библиотеку GSM, но как в ней работает отслеживание новых смс?
    Тут есть 2 варианта:
    - шилд сам извещает о приходе смс и библиотека GSM получает смс в цикле
    while (Serial.available() > 0) inSerial=(Serial.read()) .....
    - либо библиотека анализирует смс на симке, например с помощью AT+CMGL и после их обработки удаляет с симки смс.
    Я день убил, но разобрался. Хочу написать библиотеку, но пока времени мало.

    Пы.Сы.: Не могу загрузить здесь pdf-ку с описанием AT-команд на русском языке
     
  3. Sajum

    Sajum Нуб

    Вот как-нить пощупать эту библиотеку GSM
     
  4. Sajum

    Sajum Нуб

    sparex нравится это.
  5. Makhonin

    Makhonin Гик

    Вот библиотека GSM. Она компилится только под arduino 0023 ((((
    У вас есть какой-нибудь пример кода для приема смс? По сути, мне только это и надо
     

    Вложения:

    • GSM_Shield.zip
      Размер файла:
      56,5 КБ
      Просмотров:
      292
  6. Sajum

    Sajum Нуб

    Сейчас нет пока оформленного примера. Я пока только оттестировал AT-команды. Постараюсь втечение недели сделать (самому интересно).
     
  7. prometheus

    prometheus Нерд

    Гляньте тут. Там есть функция для приема и чтения смсок.
     
  8. Makhonin

    Makhonin Гик

    Обязательно попробую код с утра. О результатах отпишусь
     
  9. Makhonin

    Makhonin Гик

    Все равно sms не обрабатываются( Хотя, может быть, я что-то не так делаю.
     
  10. Makhonin

    Makhonin Гик

    Есть какие-нибудь успехи?
     
  11. Chris

    Chris Нерд

    А вообще на AT и на
    at+cops? что отдает?