gprs.c
上传用户:rjlighting
上传日期:2022-05-27
资源大小:2k
文件大小:4k
源码类别:

手机短信编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <termios.h>
  8. #include <errno.h>
  9. #include <string.h>
  10. #define  GPRSTTY   "/dev/ttyS1"
  11. #define  BUFSIZE    500
  12. #define  ATREADTIMES 5
  13. #define  ATTRYTIMES  5
  14. void setTermios(struct termios * pNewtio, short uBaudRate)
  15. {
  16.   bzero(pNewtio, sizeof(struct termios)); /* clear struct for new portsettings */
  17.   pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;
  18.   pNewtio->c_iflag = IGNPAR;
  19.   pNewtio->c_oflag = 0;
  20.   pNewtio->c_lflag = 0; //non ICANON
  21.   /*
  22.   initialize all control characters
  23.   we don't need them here
  24.   */
  25.   pNewtio->c_cc[VINTR]    = 0;   /* Ctrl-c */
  26.   pNewtio->c_cc[VQUIT]    = 0;   /* Ctrl- */
  27.   pNewtio->c_cc[VERASE]   = 0;    /* del */
  28.   pNewtio->c_cc[VKILL]    = 0;   /* @ */
  29.   pNewtio->c_cc[VEOF]     = 4;   /* Ctrl-d */
  30.   pNewtio->c_cc[VTIME]    = 5;   /* inter-character timer, timeout
  31. VTIME*0.1 */
  32.   pNewtio->c_cc[VMIN]     = 0;   /* blocking read until VMIN character
  33. arrives */
  34.   pNewtio->c_cc[VSWTC]    = 0;   /* '' */
  35.   pNewtio->c_cc[VSTART]   = 0;    /* Ctrl-q */
  36.   pNewtio->c_cc[VSTOP]    = 0;   /* Ctrl-s */
  37.   pNewtio->c_cc[VSUSP]    = 0;   /* Ctrl-z */
  38.   pNewtio->c_cc[VEOL]     = 0;   /* '' */
  39.   pNewtio->c_cc[VREPRINT] = 0;     /* Ctrl-r */
  40.   pNewtio->c_cc[VDISCARD] = 0;     /* Ctrl-u */
  41.   pNewtio->c_cc[VWERASE] = 0;     /* Ctrl-w */
  42.   pNewtio->c_cc[VLNEXT] = 0; /* Ctrl-v */
  43.   pNewtio->c_cc[VEOL2]  = 0; /* '' */
  44. }
  45. int sendSMS(const char * strAlarmMobile, const char * strAlarmMessage) 
  46. {
  47. int fd,nTotal,i;
  48. struct termios oldtio,newtio;
  49. char strATResult[BUFSIZE];
  50. char strAT[BUFSIZE];
  51. struct timeval tv;
  52. //1、打开 GPRS Modem 连接的串口,进行相关设置,如波特率等,保存原有串口设置;
  53. if ( (fd = open(GPRSTTY,O_RDWR | O_NOCTTY ))<0){
  54.     printf("Can't Open Serial Port!GPRSTTYn");
  55.     return -1;
  56. }
  57. else{
  58.     tcgetattr(fd,&oldtio); /* save current serial port settings */
  59.     setTermios(&newtio,B9600);
  60.     tcflush(fd, TCIFLUSH);
  61.     tcsetattr(fd,TCSANOW,&newtio);
  62.     
  63.     sprintf(strAT,"at+cmgf=1%c%c",0x0d,0x0a);
  64.     nTotal=0;
  65.     while (ATComUntilStr(fd,strAT,"OK",strATResult,
  66.             ATREADTIMES)!= 0) {
  67.         if ((nTotal++)<ATTRYTIMES)
  68.             continue;
  69.         else
  70.             goto sendSMSEND;
  71.     }
  72.    /* sprintf(strAT,"at+csca="%s"%c%c",strSMSServer,0x0d,0x0a);
  73.     nTotal=0;
  74.     while (ATComUntilStr(fd,strAT,"OK",
  75.         strATResult,ATREADTIMES)!= 0) {
  76.         if ((nTotal++)<ATTRYTIMES)
  77.             continue;
  78.         else
  79.             goto sendSMSEND;
  80.     
  81.     }*/
  82.     //send message
  83.     i=0;
  84.     while (1){
  85.         sprintf(strAT,"at+cmgs="%s"%c%c",strAlarmMobile,0x0d,0x0a);
  86.                 nTotal=0;
  87.                 while (ATComUntilStr(fd,strAT,">",strATResult,ATREADTIMES)!= 0){
  88.                     if ((nTotal++)<ATTRYTIMES)
  89.                         continue;
  90.                     else
  91.                         goto sendSMSEND;
  92.                 }
  93.                 sprintf(strAT,"%s%c",strAlarmMessage,0x1a);
  94.                 if (ATComUntilStr(fd,strAT,"OK" ,strATResult,ATREADTIMES*3)!= 0){
  95.                     if ((i++)<ATTRYTIMES)
  96.                         continue;
  97.                     else
  98.                         goto sendSMSEND;
  99.                 }
  100.                 else
  101.                     break;
  102.             }
  103.             
  104. sendSMSEND:
  105.             //3、恢复原有的串口设置。
  106.             tcsetattr(fd,TCSANOW,&oldtio);
  107.             close(fd);
  108.             return 0;
  109.         }
  110.     }
  111.   
  112.   int ATComUntilStr(int fd, const char * strATCommand, const char * strPrompt,
  113.   char * strResult, int nATReadTimes)
  114.   {
  115.       int nRes,ch,nTotal;
  116.       char strAT[BUFSIZE];
  117.       write(fd,strATCommand,strlen(strATCommand));
  118.       nTotal=0;
  119.       nRes=0;
  120.       ch=0;
  121.       while (1)
  122.       {
  123.           nRes = read(fd,strAT,BUFSIZE-nTotal);
  124.       if (nRes>0){
  125.           strAT[nRes]=0;
  126.           memcpy(strResult+nTotal,strAT,nRes);
  127.           nTotal+=nRes;
  128.           ch=0;
  129.        }
  130.        else {
  131.           if (ch++==nATReadTimes)
  132.               break;
  133.       }
  134.        
  135.   }
  136.   strResult[nTotal]=0;
  137.   //check if OK
  138.   if (strstr(strResult,strPrompt)!=NULL)
  139.       return 0;
  140.   else
  141.       return -1;
  142. }
  143.  int main(int argc, char* argv[])
  144. {
  145.     char* telno="136********"; //自己填号码
  146.    char* sm="alarm!!";
  147.     int ret;
  148.     ret=sendSMS(telno,sm);
  149. return ret;    
  150.  }