اطلاعیه

Collapse
No announcement yet.

استخراج شماره تلفن ازSMS دریافتی SIM900

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    استخراج شماره تلفن ازSMS دریافتی SIM900

    من جدیدا با SIM 900 به یه مشکل جدید برخورد کردم.قبلا این مشکل نبود.
    دستور"PRINT"AT+CMGR=1 برای خوندن اس ام اس خانه شماره یک به ما
    ژول SIM900می دم.هدف از خواندن اس ام اس استخراج شماره تلفن از متن اس ام اس است.
    در برگشت ماژول همون عبارتAT+CMGR=1 برمی گردونه.یعنی تو متغیر حاوی متن اس ام اس این عبارت قرار می گیره.
    و چون مقدار98+ تو متن عبارت بالا نیست بنابراین استخراج صورت نمی گیره. البته اینو هم بگم من در یک زیر برنامه می خوام این شماره رو استخراج کنم .در برنامه اصلی یه بار دستورAT+CMGR=1به ماژول ارسال و متن اس ام اس با موفقیت دریافت میشه.و براساس متن اس ام اس در یک دستو شرطی به زیر برنامه استخراج شماره فرستاده میشه که این بار مشکل بالاایجاد میشه.
    برای حل این مشکل عبارت AT+CMGF=1 هم در اول برنامه دادم ولی نشد.
    چرا اینجوری میشه؟اساتید راهنمایی کنند.
    ممنون
    کد برنامه:
    متغیر TMPشماره تلفن هستش که خالی بر میگرده.


    "Print "AT+CMGF=1
    Waitms 500
    "Print "AT+CMGR=1
    ""=SMS
    Do
    ()B = Inkey
    Select Case B
    :Case 0
    :Case 13
    If Sms <> "" Then Exit Do
    :Case 10
    If Sms <> "" Then Exit Do
    Case Else
    (Sms = Sms + Chr(b
    End Select
    Loop
    Waitms 300
    ("Shoro = Instr(sms , "+98
    ( "," , Payan = Instr(shoro , Sms
    Tool = 13
    (Tmp = Mid(sms , Shoro , Tool
    Waitms 200
    HOME
    LCD TMP

    Return

    جدیدترین ویرایش توسط Namvar14; ۰۰:۵۹ ۱۳۹۵/۰۷/۱۱.
    eshop-hodhod.ir

    #2
    پاسخ : استخراج شماره تلفن ازSMS دریافتی SIM900

    سلام
    برنامه زیر رو من با اتمل استادیو واسه پروژه ای نوشتم
    به خط مورد نظر اس میدی دستور #off یا #on رو بعدمتناسب با اون وضعیت خروجی تغییر وبه شماره ارسال کننده طی یک اس ام اس وضعیت خروجی گزارش میشه

    /*/*
    * Sim900.c
    *
    * Created: 6/16/2016 11:24:33 PM
    * Author :
    */

    #include <avr/io.h>
    #include "lcd.h"
    #include <util/delay.h>
    #include <stdio.h>
    #include <avr/interrupt.h>
    #include <string.h>
    //#include <util/setbaud.h>
    // define some macros
    #define BAUD 9600 // define baud
    #define BAUDRATE ((F_CPU)/(BAUD*16UL)-1) // set baud rate value for UBRR
    int zz = 0 ;

    char mobile_number_2_2[11] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
    void uart_init (void)

    {

    UBRRH = (BAUDRATE>>8);
    UBRRL = BAUDRATE;
    UCSRB|= (1<<TXEN)|(1<<RXEN);

    UCSRC|= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    // UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);/* Set frame format: 8data, 2stop bit */

    // USBS 0 : 1 stop bit | 1: 2stop bit
    //UCSZ0 UCSZ1 : 1 1 > 8 bit data
    }

    void uart_transmit (unsigned char data)
    {
    while (!( UCSRA & (1<<UDRE)));
    UDR = data;

    }
    // function to receive data
    unsigned char uart_recieve (void)
    {

    while(!((UCSRA) & (1<<RXC)));
    return UDR;

    }


    void send_sms(char *txt,char *mobile_number_pointer)
    {
    LCDClear();
    LCDWriteStringXY(0,0,"SMS sending");
    //char enter=13;
    //char double_quote=34;
    //char ctrlz=26;
    char buffer1[22];
    char buffer2[40];
    char buffer3[20] ;
    char buffer4[20];
    int x = 0 ;
    x++;
    sprintf(buffer3,"at%c",13);
    for ( int n = 0 ; n <= 2 ; n++)
    {
    _delay_ms(10);
    uart_transmit(buffer3[n]);
    }
    //char b1 = 0 ;
    //int j = 0 ;
    /*
    while(b1!=10)
    {
    b1 = uart_recieve();

    }
    */
    _delay_ms(1500);

    sprintf(buffer4,"AT+CMGF=%d%c",1,13);
    for ( int n = 0 ; n <= 9 ; n++)
    {
    _delay_ms(10);
    uart_transmit(buffer4[n]);
    }

    _delay_ms(500);
    sprintf(buffer1,"AT+CMGS=\"0%s\"",mobile_number_pointer);

    for ( int n = 0 ; n <= 20 ; n++)
    {
    _delay_ms(10);
    uart_transmit(buffer1[n]);
    }
    _delay_ms(500);
    uart_transmit(13);
    _delay_ms(500);
    sprintf(buffer2,"%s%c",txt,26);

    for ( int n = 0 ;n <= strlen(txt)-1 ; n++)
    {

    _delay_ms(10);
    uart_transmit(buffer2[n]);//*/
    }
    uart_transmit(26);
    uart_transmit(13);
    _delay_ms(1500);

    LCDClear();
    LCDWriteStringXY(0,0,"SMS Sent");
    _delay_ms(500);
    }


    ISR(INT0_vect)
    {
    //char kb = 0 ;
    char *mobile_number_pointer;
    mobile_number_pointer = mobile_number_2_2;
    // char buf_sms_index = 0 ;
    int temp = 0 ;
    int z = 0 ;
    UCSRB &= ~(1<<RXEN) ;
    UCSRB |= (1<<RXEN) ;
    for ( int n = 0 ; n <= 14; n++)
    {
    z++;
    temp=uart_recieve();
    }
    UCSRB &= ~(1<<RXEN) ;
    //buf_sms_index = uart_recieve();
    _delay_ms(200);
    // uart_transmit(temp);



    char bb1[16] ;
    sprintf(bb1,"%c",temp);
    LCDClear();
    LCDWriteStringXY(0,0,bb1)


    char bb2[20];
    sprintf(bb2,"AT+CMGR=%c%c",temp,13);
    for ( int n = 0 ; n <= 9 ; n++)
    {
    _delay_ms(10);
    uart_transmit(bb2[n]);
    }
    char daryaft[30];
    int index1=0;
    int index2 = 0 ;
    UCSRB &= ~(1<<RXEN) ;
    UCSRB |= (1<<RXEN) ;
    char f1 =0;
    char f2 =0;

    while (1) // khandane matne sms

    {
    f1 = uart_recieve();
    daryaft[index1] = f1;

    if (daryaft[index1]==79) f2 = 1 ; //k
    if ((f2 == 1) & ( daryaft[index1] == 75)) // o
    {
    LCDClear();
    LCDWriteStringXY(0,0,"OK! DETECTED!");
    LCDWriteStringXY(0,1,"Module Resposed");
    index2 = index1 ;
    f2 = 0 ;
    _delay_ms(1500);
    break;
    }
    index1++;
    }


    int counter2= 0 ;
    //char tel_f1 = 0 ;
    //char tel_f2 = 0 ;
    //char mobile_number[10];
    while (1) // khandane shomare ersal konande
    {

    if (daryaft[counter2] == 43) //+
    {


    //tel_f1 = 1 ;
    if (daryaft[counter2+1] == 57) //9
    {

    if (daryaft[counter2+2] == 56)//8
    {


    //+rasidim be +98
    int n = 0 ;
    while(1)
    {


    if (daryaft[counter2+3+n] == 34) break; // rasidan be " > "+98 9012310100 "

    //_delay_ms(150);
    *(mobile_number_pointer+n) = daryaft[counter2+2+1+n];
    // mobile_number_2_2[n] = daryaft[counter2+2+1+n];



    n++;

    }

    break;

    }
    }

    }
    counter2++;
    }



    LCDClear();
    LCDWriteStringXY(0,0,"From:");
    LCDWriteStringXY(0,1,mobile_number_pointer);



    _delay_ms(2500);




    UCSRB &= ~(1<<RXEN) ;
    char a1[16]= {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'} ;
    char index3 = 0 ;
    int counter = 0 ;
    index3 = index2 - 6 ;
    while (1)
    {
    //char tt = 0 ;
    //char ttt[15] ;

    if (daryaft[index3 - counter ] != 10 )
    {a1[counter] =daryaft[index3 - counter ] ;

    counter ++;}
    else
    {
    break;
    }


    }

    char *rev = strrev(a1) ;

    char ba[16];



    sprintf(ba,"%s",rev);

    ba[15] = '\0' ;

    LCDClear();
    LCDWriteStringXY(0,0,"Command:");
    LCDWriteStringXY(0,1,ba) ;
    _delay_ms(2000);
    DDRB |= 1<<1 ;

    char *upper = strupr(rev);
    if((strcmp(upper,"#ON") ==0) )
    {



    LCDWriteStringXY(0,1,"Correct!")

    PORTB |=1<<1;
    _delay_ms(1000);
    send_sms("Device is being on",mobile_number_2_2);


    }
    else if((strcmp(upper,"#OFF") ==0) )
    {
    PORTB &=~(1<<1) ;
    LCDWriteStringXY(0,1,"Correct!");
    _delay_ms(1000);
    send_sms("Device is being off",mobile_number_2_2);
    }
    else
    {


    LCDWriteStringXY(0,1,"Invalid Command");
    _delay_ms(1000);
    send_sms("Command is invalid",mobile_number_2_2);
    }




    char buffer_cmgd[20];
    sprintf(buffer_cmgd,"AT+CMGD=%d%c",1,13);
    for ( int n = 0 ; n <= 9 ; n++)
    {
    _delay_ms(10);
    uart_transmit(buffer_cmgd[n]);
    }

    LCDClear();
    LCDWriteStringXY(0,0,"Send Command!")
    }
    int main(void)
    {
    DDRC |=1<<5;


    GICR = 1<<INT0;

    MCUCR = 1<<ISC01 | 0<<ISC00;
    sei();




    LCDInit(LS_NONE);
    LCDClear();
    LCDWriteStringXY(0,0,"GSM SMS") ;
    LCDWriteStringXY(0,1,"CONTROLLER")
    uart_init();
    _delay_ms(1500);
    PORTC |=1<<5 ;


    uart_transmit(13);





    //UCSRB |= (1<<RXEN) ;

    char abcd[16] ;
    char buffer_cmgd[20];
    for (int n = 0 ; n <=19 ; n++)
    {
    buffer_cmgd[n]='\0';
    }
    for (int n = 1 ; n < 10 ; n++)
    {


    sprintf(abcd,"Delete SMS: %d",n) ;
    LCDClear();
    LCDWriteStringXY(0,0,"Preparing SIM");
    LCDWriteStringXY(0,1,abcd);
    sprintf(buffer_cmgd,"AT+CMGD=%d%c",n,13);
    for ( int n = 0 ; n <= 9 ; n++)
    {
    _delay_ms(10);
    uart_transmit(buffer_cmgd[n]);

    }
    _delay_ms(500);
    }
    LCDClear();
    LCDWriteStringXY(0,0,"READY to use!");
    LCDWriteStringXY(0,1,"Send Command!");



    }




    جدیدترین ویرایش توسط mehran901; ۰۷:۱۳ ۱۳۹۵/۰۷/۱۱.
    اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

    دیدگاه


      #3
      پاسخ : استخراج شماره تلفن ازSMS دریافتی SIM900

      با این ماژرول زیاد کارکردم.ولی چنین چیزی عجیبه .یه سری که متن و می خونم درسته و لی درادامه که می خوام بخونم ومشخصات اس ام اس رو داشته باشم نمیشه.و همین مشکل پیش میاد.
      اصلا گیج شدم .قطعا یه چیزی داره که من رعایت نکردم.ضمنا من ماژول رو باهایپرترمینال راه انداختم و تمامی دستورات مربوط به تنظیمات از هایپرترمینال انجام دادم.
      eshop-hodhod.ir

      دیدگاه


        #4
        پاسخ : استخراج شماره تلفن ازSMS دریافتی SIM900

        من فک کنم چون یک بارقبل اینکه شماره و دربیارم اس ام اس شماره یک سیم کارت خونده میشه و از حالت unrec (خوانده نشده)تبدیل به حالت rec(خوانده شده)میشه و بار دوم که میکرو دستور خوندن اس ام اس شماره یک رو به سیم کارت میده چون سیم کارت یک بار خونده شده درکل متن دریافتی ازsim900 یک تغییرایجاد شده .وهمون تغییر unrec به rec باعث این پدیده عجیب میشه.
        -قبلا تو این انجمن هر چی می خواستی خدایی مهندسان عزیزکم نمی ذاشتن. من رشته ام الکترونیک نیست بخاطر علاقه ام به الکترونیک تو همین انجمن و به کمک مهندسان عزیز برنامه نویسی و مبانی الکترونیک رو یاد گرفتم.و چون خودم دبیر کاوفناوری هستم این مطالب و برای تدریس به دانش اموزانم استفاده می کنم.که قائدتا خیلی مفید خواهند بود.ولی یه مدته که هرچی سوال می کنم کسی بهم جواب نمیده.مانند قبل مشاوره نمی گیرم.خیلی مشارکت تو این انجمن کم شده.
        جدیدترین ویرایش توسط Namvar14; ۰۰:۱۲ ۱۳۹۵/۰۷/۱۲.
        eshop-hodhod.ir

        دیدگاه


          #5
          پاسخ : استخراج شماره تلفن ازSMS دریافتی SIM900

          با سلام
          من کدهای خودم رو که خیلی ازش استفاده کردم تو پروژه های متفاوت چه avr و arm و به نحو احسن جواب داده تا حالا مشکلی نداشته رو اینجا میزارم

          void sim800x_read_sms(char *index,char *phone_Number,char *content)
          {
          int i=0;
          int j=0;
          new_sms_flag=0;
          sim800x_write_command("AT+CMGF=1");
          delay_ms(1000);
          sim800x_write_command("AT+CSCS=\"GSM\"");
          delay_ms(1000);
          sim800x_write_command("AT+CSMP=17,167,0,0");
          delay_ms(1000);
          Usart_Clear_Buf();
          Usart_Write_String("AT+CMGR=",0);
          Usart_Write_String(index,1);
          delay_ms(2000);
          if(rx_buffer[0]=='\0' )
          {
          return;
          }
          if(strcmp(rx_buffer,"OK")==0)
          {
          return;
          }
          if(strcmp(rx_buffer,"ERROR")==0)
          {
          return;
          }
          if(!strncmp(rx_buffer,"+CMGR",5))
          {
          while(rx_buffer[i]!=',')
          {
          i++;
          }
          i+=2;
          while(rx_buffer[i] != '"')
          {
          *(phone_Number+j) = rx_buffer[i];
          *(phone_Number+j+1) = '\0';
          i++;
          j++;
          }
          while(rx_buffer[i]!=':')
          {
          i++;
          }
          while(rx_buffer[i]!='"')
          {
          i++;
          }
          i++;
          j=0;
          while(rx_buffer[i] != '\0')
          {
          *(content+j) = rx_buffer[i];
          *(content+j+1) = '\0';
          i++;
          j++;
          }
          *(content+j-1) = '\0';
          *(content+j-2) = '\0';
          }
          }
          [SIZE=3][/SIZE]

          در این تابع اشاره گره اندیس حاوی مکان حافظه ای هست که قرار اس ام اس ازش خونده بشه و اشاره گر
          phone_Number به شماره همراه فرستنده اس ام اس اشاره خواهد کرد و اشاره گر content به محتوای اس ام اس اشاره خواهد در حقیقت وقتی تابع رو فراخوانی کردید متن اس ام اس در اشاره گر content ریخته میشه و شماره فرستنده اس ام اس در اشاره گره phone_Number ریخته خواهد شد.



          char index[]={0x01};
          char mob_nomber[20];
          char sms_content[256];
          sim800x_read_sms(index,mob_nomber,sms_content);
          جدیدترین ویرایش توسط pirozy; ۰۹:۱۴ ۱۳۹۵/۰۷/۱۲.

          دیدگاه

          لطفا صبر کنید...
          X