/**************************************************** wysyla sms, wywolanie: sendsms nr_tel tresc_sms *****************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include int checkok(); int checkprompt(); /* zmienne */ int fd2; time_t czas1; time_t czas2; struct tm *loctime; #define TRUE 1 speed_t predkosc; char buf[200]; char buf1[200]; char nr_sms[20][20]; int n,m,i,j,jest; unsigned char znak, znak1; FILE *fp; time_t czas; char data[55]; struct tm *loctime; struct termios opcje; struct flock fl; /* S T A R T */ main (argc, argv) int argc; char *argv[]; { // otworz log fp=fopen("/var/log/sms.log", "a"); time (&czas); loctime = localtime (&czas); strftime (data, 50, "%Y-%m-%d %H:%M: ", loctime); fprintf(fp, "%s %s ", data, argv[1]); fflush(0); fprintf(fp, "%s ", argv[2]); fflush(0); // Otworz port szeregowy fl.l_type = F_WRLCK; /* F_RDLCK, F_WRLCK, F_UNLCK */ fl.l_whence = SEEK_SET; /* SEEK_SET, SEEK_CUR, SEEK_END */ fl.l_start = 0; /* Offset from l_whence */ fl.l_len = 0; /* length, 0 = to EOF */ fl.l_pid = getpid(); /* our PID */ if ((fd2 = open ("/dev/ttyUSB0", O_NOCTTY | O_RDWR | O_NONBLOCK | O_NDELAY)) != -1) { fcntl(fd2,F_SETLKW,&fl); // set lock, czekaj, jesli ktos inny to zrobil tcgetattr (fd2, &opcje); predkosc = B4800; cfsetspeed (&opcje, predkosc); opcje.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); opcje.c_cflag &= ~PARENB; opcje.c_cflag &= ~PARODD; opcje.c_cflag &= ~CSTOPB; opcje.c_cflag &= ~CSIZE; opcje.c_cflag |= CS8; opcje.c_cflag &= ~CRTSCTS; opcje.c_iflag &= ~IXON; opcje.c_iflag &= ~IXOFF; opcje.c_iflag &= ~INLCR; opcje.c_iflag &= ~ICRNL; opcje.c_oflag &= ~ONLCR; opcje.c_oflag &= ~OCRNL; tcsetattr (fd2, TCSANOW, &opcje); write (fd2, "AT&f\r", 5); checkok(); write (fd2, "ATq0\r", 5); checkok(); write (fd2, "ATe1\r", 5); checkok(); write (fd2, "AT+CMGF=1\r", 10); checkok(); write (fd2, "AT+CMGS=", 8); sprintf(buf, "\"%s\"\r", argv[1]); write (fd2, buf , strlen(buf)); checkprompt(); j=0; for (i=0; i< strlen(argv[2]); i++) { znak=argv[2][i]; if (znak < 0x80) {buf[j]=znak; j++;} else { i++; znak1=argv[2][i]; if (znak == 0xc3) switch (znak1) { case (0x93): { znak='O';buf[j]=znak; j++;; break; }// O ogonek case (0xb3): { znak='o';buf[j]=znak; j++;; break; }// o ogonek } if (znak == 0xc4) switch (znak1) { case (0x84): { znak='A';buf[j]=znak; j++;; break; }// A ogonek case (0x86): { znak='C';buf[j]=znak; j++;; break; }// C ogonek case (0x98): { znak='E';buf[j]=znak; j++;; break; }// E ogonek case (0x85): { znak='a';buf[j]=znak; j++;; break; }// a ogonek case (0x87): { znak='c';buf[j]=znak; j++;; break; }// c ogonek case (0x99): { znak='e';buf[j]=znak; j++;; break; }// e ogonek } if (znak == 0xc5) switch (znak1) { case (0x81): { znak='L';buf[j]=znak; j++;; break; }// L ogonek case (0x83): { znak='N';buf[j]=znak; j++;; break; }// N ogonek case (0x9a): { znak='S';buf[j]=znak; j++;; break; }// S ogonek case (0xb9): { znak='Z';buf[j]=znak; j++;; break; }// Z kreska case (0xbb): { znak='Z';buf[j]=znak; j++;; break; }// Z kropka case (0x82): { znak='l';buf[j]=znak; j++;; break; }// l ogonek case (0x84): { znak='n';buf[j]=znak; j++;; break; }// n ogonek case (0x9b): { znak='s';buf[j]=znak; j++;; break; }// s ogonek case (0xba): { znak='z';buf[j]=znak; j++;; break; }// z kreska case (0xbc): { znak='z';buf[j]=znak; j++;; break; }// z kropka } if (znak > 0x7f) {buf[j] = ' '; i--; j++;} // nieprawidlowy krzaczek } } buf[j]=0x00; write (fd2, buf , strlen(buf)); write (fd2, "\x1a", 1); checkresp(); close(fd2); } //od open fd fclose(fp); } //od main checkok() { time (&czas1); time (&czas2); m=0; jest=0; buf1[m]='0'; while (czas2 - czas1 < 3) // 3 sekundy na odpowiedz, potem timeout { if ((read (fd2, &buf1[m], 1)) != -1) { if (buf1[m] == 0x0a) { m++; buf1[m]=0x0; if ( strstr(buf1, "OK") != NULL) { jest=1; break; } m=-1; } m++; } time (&czas2); } if (jest == 0) exit(1); } checkprompt() { time (&czas1); time (&czas2); jest=0; m=0; buf1[m]='0'; while (czas2 - czas1 < 3) // 3 sekundy na odpowiedz, potem timeout { if ((read (fd2, &buf1[m], 1)) != -1) { if (buf1[m] == 0x3e) { jest=1; break; } m++; } time (&czas2); } if (jest == 0) exit(1); } checkresp() { time (&czas1); time (&czas2); m=0; jest=0; fprintf(fp, "| Status: "); buf1[m]='0'; while (czas2 - czas1 < 3) // 3 sekundy na odpowiedz, potem timeout { if ((read (fd2, &buf1[m], 1)) != -1) { if (buf1[m] == 0x0a) { m++; buf1[m]=0x0; if(strlen(buf1)>2) break; m=-1; } m++; } time (&czas2); } time (&czas1); time (&czas2); m=0; jest=0; buf1[m]=0x00; while (czas2 - czas1 < 10) // 10 sekund na odpowiedz, potem timeout { if ((read (fd2, &buf1[m], 1)) != -1) { if (buf1[m] == 0x0a) { buf1[m-1]=0x20; buf1[m]=0x20; buf1[m+1]=0x00; if(strlen(buf1)>2) { jest=1; fprintf(fp, " %s", buf1); fflush(0); break; } m=-1; } m++; } time (&czas2); } time (&czas1); time (&czas2); m=0; jest=0; buf1[m]='0'; while (czas2 - czas1 < 10) // 10 sekund na odpowiedz, potem timeout { if ((read (fd2, &buf1[m], 1)) != -1) { if (buf1[m] == 0x0a) { buf1[m-1]=0x20; buf1[m]=0x20; buf1[m+1]=0x00; if(strlen(buf1)>2) { jest=1; fprintf(fp, " %s\n", buf1); fflush(0); break; } m=-1; } m++; } time (&czas2); } if (jest == 0) fprintf(fp, "\n"); fflush(0); }