📄 modeminit.c
字号:
#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 + -