⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modeminit.c

📁 GSM猫管理程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifdef B57600    case 57600:  baudrate=B57600; break;#endif#ifdef B115200    case 115200: baudrate=B115200; break;#endif#ifdef B230400    case 230400: baudrate=B230400; break;#endif    default: writelogfile(LOG_ERR,modemname,"Baudrate not supported, using 9600"); baudrate=B9600;      }  cfsetispeed(&newtio,baudrate);  cfsetospeed(&newtio,baudrate);  tcsetattr(modem,TCSANOW,&newtio);}int initmodem(int device, int modem, char* modemname, int send_delay, int error_sleeptime, char* pin, char* initstring1, char* initstring2,              char* smsc, int *check_network, int pinsleeptime, int pre_init){  char command[100];  char answer[500];  int retries=0;  int success=0;  char *p;  char *pre_initstring = "ATE0+CMEE=1\r";  // 3.1beta7: terminating is only checked in case of errors.  writelogfile(LOG_INFO,modemname,"Checking if modem is ready");  retries=0;  do  {    retries++;    put_command(modem,modemname,send_delay,"AT\r",answer,sizeof(answer),50,"(OK)|(ERROR)");    if (!strstr(answer, "OK") && !strstr(answer, "ERROR"))    {      if (terminate)        return 7;      // if Modem does not answer, try to send a PDU termination character      put_command(modem,modemname,send_delay,"\x1A\r",answer,sizeof(answer),50,"(OK)|(ERROR)");      if (terminate)        return 7;    }  }  while ((retries<=10) && (! strstr(answer,"OK")));  if (! strstr(answer,"OK"))  {    writelogfile0(LOG_ERR,modemname, tb_sprintf("Modem is not ready to answer commands"));    alarm_handler0(LOG_ERR,modemname, tb);    return 1;  }  if (pre_init > 0)  {    writelogfile(LOG_INFO,modemname,"Pre-initializing modem");    put_command(modem,modemname,send_delay,pre_initstring,answer,sizeof(answer),100,"(OK)|(ERROR)");    if (!strstr(answer,"OK"))      writelogfile(LOG_ERR,modemname,"Modem did not accept the pre-init string");  }  if (pin[0])  {    char *cpin_expect = "(READY)|( PIN)|( PUK)|(ERROR)"; // Previously: "(\\+CPIN:.*OK)|(ERROR)"    writelogfile(LOG_INFO,modemname,"Checking if modem needs PIN");    put_command(modem,modemname,send_delay,"AT+CPIN?\r",answer,sizeof(answer),50, cpin_expect);    if (strstr(answer,"+CPIN: SIM PIN") && !strstr(answer, "PIN2"))    {      writelogfile(LOG_NOTICE,modemname,"Modem needs PIN, entering PIN...");      sprintf(command,"AT+CPIN=\"%s\"\r",pin);      put_command(modem,modemname,send_delay,command,answer,sizeof(answer),300,"(OK)|(ERROR)");      if (strstr(answer, "ERROR"))      {        p = get_gsm_error(answer);        writelogfile(LOG_NOTICE,modemname, "PIN entering: modem answered %s%s%s", cut_ctrl(answer), (*p)? ", " : "", p);      }      // After a PIN is entered, some modems need some time before next commands are processed.      if (pinsleeptime > 0)        t_sleep(pinsleeptime);      put_command(modem,modemname,send_delay,"AT+CPIN?\r",answer,sizeof(answer),50, cpin_expect);      if (strstr(answer,"+CPIN: SIM PIN") && !strstr(answer, "PIN2"))      {        writelogfile0(LOG_ERR,modemname, tb_sprintf("Modem did not accept this PIN"));        alarm_handler0(LOG_ERR,modemname, tb);        abnormal_termination(0);      }      if (strstr(answer,"+CPIN: READY"))        writelogfile(LOG_INFO,modemname,"PIN Ready");    }    if (strstr(answer,"+CPIN: SIM PUK"))    {      writelogfile0(LOG_CRIT,modemname, tb_sprintf("Your SIM is locked. Unlock it manually"));      alarm_handler0(LOG_CRIT,modemname, tb);      abnormal_termination(0);    }    if (!strstr(answer, "+CPIN: READY"))    {      p = get_gsm_error(answer);      writelogfile0(LOG_CRIT,modemname, tb_sprintf("PIN handling: expected READY, modem answered %s%s%s", cut_ctrl(answer), (*p)? ", " : "", p));      alarm_handler0(LOG_CRIT,modemname, tb);      abnormal_termination(0);    }  }  if (*initstring1 || *initstring2)    writelogfile(LOG_INFO,modemname,"Initializing modem");  if (initstring1[0])  {    retries=0;    do    {      retries++;      put_command(modem,modemname,send_delay,initstring1,answer,sizeof(answer),100,"(OK)|(ERROR)");      if (strstr(answer, "ERROR"))        if (retries < 2)          if (t_sleep(error_sleeptime))            return 7;    }    while (retries < 2 && !strstr(answer,"OK"));    if (strstr(answer,"OK")==0)    {      writelogfile0(LOG_ERR,modemname, tb_sprintf("Modem did not accept the init string"));      alarm_handler0(LOG_ERR,modemname, tb);      return 3;    }  }  if (initstring2[0])  {    retries=0;    do    {      retries++;      put_command(modem,modemname,send_delay,initstring2,answer,sizeof(answer),100,"(OK)|(ERROR)");      if (strstr(answer, "ERROR"))        if (retries < 2)          if (t_sleep(error_sleeptime))            return 7;    }    while (retries < 2 && !strstr(answer,"OK"));    if (strstr(answer,"OK")==0)    {      writelogfile0(LOG_ERR,modemname, tb_sprintf("Modem did not accept the second init string"));      alarm_handler0(LOG_ERR,modemname, tb);      return 3;    }  }  if (*check_network)  {    writelogfile(LOG_INFO,modemname,"Checking if Modem is registered to the network");    success=0;    retries=0;    do    {      retries++;      put_command(modem,modemname,send_delay,"AT+CREG?\r",answer,sizeof(answer),100,"(\\+CREG:.*OK)|(ERROR)");      if (strstr(answer,"1"))      {        writelogfile(LOG_INFO,modemname,"Modem is registered to the network");        success=1;      }      else if (strstr(answer,"5"))      {      	// added by Thomas Stoeckel      	writelogfile(LOG_INFO,modemname,"Modem is registered to a roaming partner network");	success=1;      }      else if (strstr(answer,"ERROR"))      {        writelogfile(LOG_INFO,modemname,"Ignoring that modem does not support +CREG command.");	success=1;        *check_network = 0;      }      else if (strstr(answer,"+CREG:"))      {        writelogfile(LOG_NOTICE,modemname,"Modem is not registered, waiting %i sec. before retrying",error_sleeptime);        if (t_sleep(error_sleeptime))          return 7;	success=0;      }      else      {        writelogfile0(LOG_ERR,modemname, tb_sprintf("Error: Unexpected answer from Modem after +CREG?, waiting %i sec. before retrying", error_sleeptime));	alarm_handler0(LOG_ERR,modemname, tb);	if (t_sleep(error_sleeptime))          return 7;	success=0;      }    }    while ((success==0)&&(retries<10));    if (success==0)    {      writelogfile0(LOG_ERR,modemname, tb_sprintf("Error: Modem is not registered to the network"));      alarm_handler0(LOG_ERR,modemname, tb);      return 4;    }  }  writelogfile(LOG_INFO,modemname,"Selecting PDU mode");  strcpy(command,"AT+CMGF=0\r");  retries=0;  do  {    retries++;    put_command(modem,modemname,send_delay,command,answer,sizeof(answer),50,"(OK)|(ERROR)");    if (strstr(answer, "ERROR"))      if (retries < 2)        if (t_sleep(error_sleeptime))          return 7;  }  while (retries < 2 && !strstr(answer,"OK"));  if (strstr(answer,"ERROR"))  {    writelogfile0(LOG_ERR,modemname, tb_sprintf("Error: Modem did not accept mode selection"));    alarm_handler0(LOG_ERR,modemname, tb);    return 5;  }  if (smsc[0])  {    writelogfile(LOG_INFO,modemname,"Changing SMSC");    sprintf(command,"AT+CSCA=\"+%s\"\r",smsc);    retries=0;    do    {      retries++;      put_command(modem,modemname,send_delay,command,answer,sizeof(answer),50,"(OK)|(ERROR)");      if (strstr(answer, "ERROR"))        if (retries < 2)          if (t_sleep(error_sleeptime))            return 7;    }    while (retries < 2 && !strstr(answer,"OK"));    if (strstr(answer,"ERROR"))    {      writelogfile0(LOG_ERR,modemname, tb_sprintf("Error: Modem did not accept SMSC"));      alarm_handler0(LOG_ERR,modemname, tb);      return 6;    }  }  // 3.1beta7, 3.0.9: International Mobile Subscriber Identity is asked once.  if (devices[device].identity[0] == 0)  {    //writelogfile(LOG_INFO,modemname,"Querying IMSI");    sprintf(command,"AT+CIMI\r");    put_command(modem,modemname,send_delay,command, devices[device].identity, sizeof(devices[device].identity), 50,"(OK)|(ERROR)");    // 3.1beta7: If CIMI is not supported, try CGSN    // TODO: is IMSI title still good?    if (strstr(devices[device].identity, "ERROR"))    {      sprintf(command,"AT+CGSN\r");      put_command(modem,modemname,send_delay,command, devices[device].identity, sizeof(devices[device].identity), 50,"(OK)|(ERROR)");    }    if (!strstr(devices[device].identity, "ERROR"))    {      if ((p = strstr(devices[device].identity, "OK")))        *p = 0;      cut_ctrl(devices[device].identity);      cutspaces(devices[device].identity);      //strcpy(devices[device].identity_header, "IMSI");      //writelogfile(LOG_INFO,modemname,"%s: %s", devices[device].identity_header, devices[device].identity);      writelogfile(LOG_INFO,modemname,"IMSI: %s", devices[device].identity);    }    else      writelogfile(LOG_INFO,modemname,"IMSI/CGSN not supported");  }  return 0;}int openmodem(char* device,char* modemname){  int modem;  modem = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK);  if (modem <0)  {    writelogfile0(LOG_ERR,modemname, tb_sprintf("Cannot open serial port %s, error: %s", device, strerror(errno)));    alarm_handler0(LOG_ERR,modemname, tb);    return -1;  }  if (strstr(smsd_version, "beta"))    writelogfile(LOG_INFO, modemname, "Serial port %s opened as %i", device, modem);  return modem;}int t_sleep(int seconds){  int i;  for (i = 0; i < seconds; i++)  {    if (terminate == 1)      return 1;    sleep(1);  }  return 0;}int talk_with_modem(int device){  int result = 0;  int modem = -1;  int n;  char tmp[256];  struct termios newtset, oldtset;  char newdevice[PATH_MAX];  int stdinflags;  int set_nonblock = 0;  int idle;  stdinflags = fcntl(STDIN_FILENO, F_GETFL);   if (!(stdinflags & O_NONBLOCK))   {    if (fcntl(STDIN_FILENO, F_SETFL, stdinflags | O_NONBLOCK) == -1)       printf("Failed to set STDIN nonblock.\n");    else      set_nonblock = 1;  }  tcgetattr(STDIN_FILENO, &oldtset);  newtset = oldtset;  newtset.c_lflag &= ~(ECHO | ICANON);  newtset.c_iflag &= ~ICRNL;  newtset.c_cc[VMIN] = 1;  newtset.c_cc[VTIME] = 0;  tcsetattr(STDIN_FILENO, TCSAFLUSH, &newtset);  printf("Communicating with %s. (Press Ctrl-C to abort.)\n", process_title);  writelogfile(LOG_CRIT, process_title, "Communicating with terminal.");  printf("Default device is %s\n", devices[device].device);  printf("Press Enter to start or type an another device name.\n");  *newdevice = 0;  while (!terminate)  {    idle = 0;    if ((n = read(STDIN_FILENO, tmp, (modem != -1)? sizeof(tmp) -1 : 1)) > 0)    {      if (modem != -1)      {        tmp[n] = 0;        write_to_modem(modem, devices[device].name, devices[device].send_delay, tmp, 5, 0, 1);      }      else      {        if (*tmp == 13)        {          printf("\n");          fflush(stdout);          if (*newdevice)            strcpy(devices[device].device, newdevice);          printf("Opening device %s\n", devices[device].device);          modem = openmodem(devices[device].device, devices[device].name);          if (modem == -1)          {            printf("Cannot open device %s, cause: %s.\n", devices[device].device, strerror(errno));            *newdevice = 0;            continue;          }          setmodemparams(modem, devices[device].name, devices[device].rtscts, devices[device].baudrate);          printf("Ready.\n");          result = 1;        }        else if (*tmp)        {          printf("%c", *tmp);          fflush(stdout);          if (*tmp == 127 || *tmp == 8)          {            if (*newdevice)              newdevice[strlen(newdevice) -1] = 0;          }          else          {            if (strlen(newdevice) < sizeof(newdevice) -1)              sprintf(strchr(newdevice, 0), "%c", *tmp);            else            {              printf("\nDevice name too long.\n");              *newdevice = 0;              continue;            }          }        }      }    }    else      idle = 1;    if (modem != -1)    {      if ((n = read(modem, tmp, sizeof(tmp) -1)) > 0)      {        write(STDOUT_FILENO, tmp, n);        idle = 0;      }    }    if (idle)      usleep(100000);  }  if (modem >= 0)    close(modem);  if (set_nonblock)    fcntl(STDIN_FILENO, F_SETFL, stdinflags & ~O_NONBLOCK);   tcsetattr(STDIN_FILENO, TCSANOW, &oldtset);  return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -