当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 接收短信消息
接收短信消息
时间:2016-12-14作者:华清远见

可以通过短息的方式控制我们的设备。

#include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
        #include <fcntl.h>
        #include <string.h>
        #include <sys/types.h>
     nbsp;   #include <sys/stat.h>
        #include <termios.h>
        #include <unistd.h>

         #define DEV_GPRS "/dev/ttyUSB0"

         void gsm_serial_init(int fd);
        int receive_message(int dev_fd);
                                        //***********************************************************************
        struct Message{
                char size[4];
                char which;
                char size_tal[16];
                char info[128];
        }gprs_msg[] = {
                {"16", 0, "AT+CMGS=37\r", "5F53524D6E7F5EA68D858FC78BBE5B9A4E0A9650FF01"},//当前湿度超过设定上限!
                {"0e", 1, "AT+CMGS=29\r", "6709964C751F4EBA95EF5165FF01"}, //有陌生人闯入!
                {"1a",2,"AT+CMGS=41\r","5F53524D514971675F3A5EA68D858FC78BBE5B9A4E0A9650FF01"},//当前光照超过设定上限!
                {"16", 3, "AT+CMGS=37\r", "5F53524D6E295EA68D858FC78BBE5B9A4E0A9650FF01"}//当前温度超过设定上限!
        };
        
        /******************************主函数*************************************/

         int main()
        {
                int fd;
                if((fd = open(DEV_GPRS,O_RDWR | O_NOCTTY | O_NDELAY)) < 0)//可读写方式打开,不受干扰,无延迟;
                {
                                 printf("Fail to open DEV_GSM !\n");
                                 return -1;
                }
                receive_message(fd);
                close(fd);
                return 0;
        }
        
                                        //*******************************************************************
        void gsm_serial_init(int fd)
        {
                struct termios options;
                tcgetattr(fd, &options);
                options.c_cflag |= (CLOCAL | CREAD);
                options.c_cflag &= ~CSIZE;
                options.c_cflag &= ~CRTSCTS;
                options.c_cflag |= CS8;
                options.c_cflag &= ~CSTOPB;
                options.c_iflag |= IGNPAR;
                options.c_oflag = 0;
                options.c_lflag = 0;

                 cfsetispeed(&options, B9600);
                cfsetospeed(&options, B9600);
                tcsetattr(fd,TCSANOW, &options);
                printf("init gprs over...\n");
                return ;
        }
                                        //*******************************************************************
        int receive_message(int dev_fd)
        {
                int message_all_number;//短信总数
                int message_content;//短信内容
                int nread;
                int nwrite;
                char send_buff[128];
                char recv_buff[128];
                gsm_serial_init(dev_fd);

                 //AT
                memset(send_buff, 0, sizeof(send_buff));
                strcpy(send_buff, "AT\r");
                nwrite = write(dev_fd, send_buff, strlen(send_buff));
                printf("Step1: %s\n", send_buff);

                 //waiting for AT's ACK
                memset(recv_buff, 0, sizeof(recv_buff));
                sleep(1);
                nread = read(dev_fd, recv_buff, sizeof(recv_buff));
                printf("return1: %s\n", recv_buff);
                /*******************************************************/
                //AT+CNMI=2,1,0,0
                memset(send_buff, 0, sizeof(send_buff));
                strcpy(send_buff, "AT+CNMI=2,1,0,0\r");
                nwrite = write(dev_fd, send_buff, strlen(send_buff));
                printf("Step2: %s\n", send_buff);
        
                //waiting for AT+CNMI's ACK
                memset(recv_buff, 0, sizeof(recv_buff));
                sleep(1);
                nread = read(dev_fd, recv_buff, sizeof(recv_buff));
                printf("return2: %s\n", recv_buff);
                memset(recv_buff, 0, sizeof(recv_buff));
                /******************************************************/
                /******************************************************/
                while(1)
                {
                         nread = read(dev_fd, recv_buff, sizeof(recv_buff));
                         if(recv_buff != 0)
                          {
                                  if(strstr(recv_buff,"+") != NULL)
                                  {
                                          printf("the message is coming\n");
        
                                          //AT+CMGR=1
                                          memset(send_buff, 0, sizeof(send_buff));
                                          strcpy(send_buff, "AT+CMGR=1\r");
                               &nnbsp;          nwrite = write(dev_fd, send_buff, strlen(send_buff));
                                         sleep(1);
                                         memset(send_buff, 0, sizeof(send_buff));
        
                                        // //AT+CMGL
                                        // memset(send_buff, 0, sizeof(send_buff));
                                        // strcpy(send_buff, "AT+CMGL\r");
                                        // nwrite = write(dev_fd, send_buff, strlen(send_buff));
                                        // printf("write order: %s\n", send_buff);
                                        // sleep(1);
                                        // memset(send_buff, 0, sizeof(send_buff));
        
   nbsp;                                       //waiting for AT+CMGR=1's ACK
                                          memset(recv_buff, 0, sizeof(recv_buff));
                                          sleep(10);
                                          nread = read(dev_fd, recv_buff, sizeof(recv_buff));
                                          if(strstr(recv_buff,"+CMGL:") != NULL){ //字符串比较判断接受的字符里面是否有+CMGL
                                          printf("the message content is 1_1: %s\n", recv_buff);
                                  }
        
                                  printf("the message content is: %s\n", recv_buff);
                                  memset(recv_buff, 0, sizeof(recv_buff));
                                  break;
      nbsp;                    }
                  }
        }
        
        return 0;
        }

我们可以通过strstr()函数实现字符串内容的比较,通过短息内容的判断,可以实现控制我们的远程设备的功能。

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)