📄 gsm0710.c
字号:
restart = 1; } else { terminate = 1; terminateCount = -1; // don't need to close channels } } else { syslog(LOG_INFO,"Logical channel %d closed.\n", frame->channel); } } else { // channel already closed syslog(LOG_INFO,"Received DISC even though channel %d was already closed.\n", frame->channel); write_frame(frame->channel, NULL, 0, DM | PF); } break; case SABM: // channel open request if (cstatus[frame->channel].opened == 0) { if (frame->channel == 0) { syslog(LOG_INFO,"Control channel opened.\n"); } else { syslog(LOG_INFO,"Logical channel %d opened.\n", frame->channel); } } else { // channel already opened syslog(LOG_INFO,"Received SABM even though channel %d was already closed.\n", frame->channel); } cstatus[frame->channel].opened = 1; write_frame(frame->channel, NULL, 0, UA | PF); break; } } destroy_frame(frame); } if(_debug) syslog(LOG_DEBUG,"out of %s\n", __FUNCTION__); return framesExtracted;}/** Wait for child process to kill the parent. */void parent_signal_treatment(int param) { fprintf(stderr, "MUX started\n"); exit(0);}/** * Daemonize process, this process create teh daemon */int daemonize(int _debug){ if(!_debug) { signal(SIGHUP, parent_signal_treatment); if((the_pid=fork()) < 0) { wait_for_daemon_status = 0; return(-1); } else if(the_pid!=0) { if (wait_for_daemon_status) { wait(NULL); fprintf(stderr, "MUX startup failed. See syslog for details.\n"); exit(1); } exit(0);//parent goes bye-bye } //child continues setsid(); //become session leader //signal(SIGHUP, SIG_IGN); if(wait_for_daemon_status == 0 && (the_pid = fork()) != 0) exit(0); chdir("/"); //change working directory umask(0);// clear our file mode creation mask // Close out the standard file descriptors close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); } //daemonize process stop here return 0;}/** * Function responsible by all signal handlers treatment * any new signal must be added here */void signal_treatment(int param){ switch(param) { case SIGPIPE: exit(0); break; case SIGHUP: //reread the configuration files break; case SIGINT: //exit(0); terminate = 1; break; case SIGKILL: //kill immediatly //i'm not sure if i put exit or sustain the terminate attribution terminate = 1; //exit(0); break; case SIGUSR1: terminate = 1; //sig_term(param); case SIGTERM: terminate = 1; break; default: exit(0); break; }}/** * Fuunction to init Modemd Siemes MC35 families * Siemens need and special step-by for after get-in MUX state */int initSiemensMC35(){ char mux_command[] = "AT+CMUX=0\r\n"; char speed_command[20] = "AT+IPR=57600\r\n"; unsigned char close_mux[2] = { C_CLD | CR, 1 }; int baud = indexOfBaud(baudrate); //Modem Init for Siemens MC35i if (!at_command(serial_fd,"AT\r\n", 10000)) { if(_debug) syslog(LOG_DEBUG, "ERROR AT %d\r\n", __LINE__); syslog(LOG_INFO, "Modem does not respond to AT commands, trying close MUX mode"); write_frame(0, close_mux, 2, UIH); at_command(serial_fd,"AT\r\n", 10000); } if (baud != 0) { sprintf(speed_command, "AT+IPR=%d\r\n", baudrate); } if (!at_command(serial_fd, speed_command, 10000)) { if(_debug) syslog(LOG_DEBUG, "ERROR %s %d \r\n", speed_command, __LINE__); } if (!at_command(serial_fd,"AT\r\n", 10000)) { if(_debug) syslog(LOG_DEBUG, "ERROR AT %d \r\n", __LINE__); } if (!at_command(serial_fd,"AT&S0\r\n", 10000)) { if(_debug) syslog(LOG_DEBUG, "ERRO AT&S0 %d\r\n", __LINE__); } if (!at_command(serial_fd,"AT\\Q3\r\n", 10000)) { if(_debug) syslog(LOG_DEBUG, "ERRO AT\\Q3 %d\r\n", __LINE__); } if (pin_code > 0 && pin_code < 10000) { // Some modems, such as webbox, will sometimes hang if SIM code // is given in virtual channel char pin_command[20]; sprintf(pin_command, "AT+CPIN=\"%d\"\r\n", pin_code); if (!at_command(serial_fd,pin_command, 20000)) { if(_debug) syslog(LOG_DEBUG, "ERROR AT+CPIN %d\r\n", __LINE__); } } if (!at_command(serial_fd, mux_command, 10000)) { syslog(LOG_ERR, "MUX mode doesn't function.\n"); return -1; } return 0;}int initMotorolaG24(){ /**************************************************** Mode: 1(advanced) Subset: 0 Port Speed: 5(115200) N1(Max frame size) 64 T1(Acknoledgement time) 100ms N2(Max number retransmissions) 3 T2 300ms T3 10 seconds ****************************************************/ char mux_command[40] = "AT+CMUX=1,0,5,64,10,3,30,10\r\n"; unsigned char close_mux[2] = { C_CLD | CR, 1 }; int baud = indexOfBaud(baudrate); if (baud != 0) { // Setup the speed explicitly, if given sprintf(mux_command, "AT+CMUX=0,0,%d\r\n", baud); } /** * Modem Init for Siemens Generic like Sony * that don't need initialization sequence like Siemens MC35 */ if (!at_command(serial_fd,"AT\r\n", 10000)) { if(_debug) syslog(LOG_DEBUG, "ERROR AT %d\r\n", __LINE__); syslog(LOG_INFO, "Modem does not respond to AT commands, trying close MUX mode"); write_frame(0, close_mux, 2, UIH); at_command(serial_fd,"AT\r\n", 10000); } if (pin_code > 0 && pin_code < 10000) { // Some modems, such as webbox, will sometimes hang if SIM code // is given in virtual channel char pin_command[20]; sprintf(pin_command, "AT+CPIN=%d\r\n", pin_code); if (!at_command(serial_fd,pin_command, 20000)) { if(_debug) syslog(LOG_DEBUG, "ERROR AT+CPIN %d\r\n", __LINE__); } } #if 1 syslog(LOG_INFO,"mux_command is %s\n",mux_command); #endif if (!at_command(serial_fd, mux_command, 10000)) { syslog(LOG_ERR, "MUX mode doesn't function.\n"); return -1; } return 0;}/** * Function to start modems that only needs at+cmux=X to get-in mux state */int initGeneric(){ char mux_command[20] = "AT+CMUX=0\r\n"; unsigned char close_mux[2] = { C_CLD | CR, 1 }; int baud = indexOfBaud(baudrate); syslog(LOG_INFO,"baudrate is %d\n",baudrate); if (baud != 0) { // Setup the speed explicitly, if given sprintf(mux_command, "AT+CMUX=0,0,%d\r\n", baud); syslog(LOG_INFO,"baud is %d\n",baud); } /** * Modem Init for Siemens Generic like Sony * that don't need initialization sequence like Siemens MC35 */ if (!at_command(serial_fd,"AT\r\n", 10000)) { if(_debug) syslog(LOG_DEBUG, "ERROR AT %d\r\n", __LINE__); syslog(LOG_INFO, "Modem does not respond to AT commands, trying close MUX mode"); write_frame(0, close_mux, 2, UIH); at_command(serial_fd,"AT\r\n", 10000); } if (pin_code > 0 && pin_code < 10000) { // Some modems, such as webbox, will sometimes hang if SIM code // is given in virtual channel char pin_command[20]; sprintf(pin_command, "AT+CPIN=%d\r\n", pin_code); if (!at_command(serial_fd,pin_command, 20000)) { if(_debug) syslog(LOG_DEBUG, "ERROR AT+CPIN %d\r\n", __LINE__); } } if (!at_command(serial_fd, mux_command, 10000)) { syslog(LOG_ERR, "MUX mode doesn't function.\n"); return -1; } return 0;}int openDevicesAndMuxMode() { int i; int ret = -1; syslog(LOG_INFO,"Open devices...\n"); // open ussp devices maxfd = 0; for (i = 0; i < numOfPorts; i++) { remaining[i] = 0; if ((ussp_fd[i] = open_pty(ptydev[i], i)) < 0) { syslog(LOG_ERR,"Can't open %s. %s (%d).\n", ptydev[i], strerror(errno), errno); return -1; } else if (ussp_fd[i] > maxfd) maxfd = ussp_fd[i]; cstatus[i].opened = 0; cstatus[i].v24_signals = S_DV | S_RTR | S_RTC | EA; } cstatus[i].opened = 0; syslog(LOG_INFO,"Open serial port...\n"); // open the serial port if ((serial_fd = open_serialport(serportdev)) < 0) { syslog(LOG_ALERT,"Can't open %s. %s (%d).\n", serportdev, strerror(errno), errno); return -1; } else if (serial_fd > maxfd) maxfd = serial_fd; syslog(LOG_INFO,"Opened serial port. Switching to mux-mode.\n"); switch(_modem_type) { case MC35: //we coould have other models like XP48 TC45/35 ret = initSiemensMC35(); break; case GENERIC: /***************************************** added by Huangsw 2008-03-05 *****************************************/ #if 1 ret = initGeneric(); #else ret = initMotorolaG24(); #endif break; // case default: // syslog(LOG_ERR, "OOPS Strange modem\n"); } if (ret != 0) { return ret; } //End Modem Init terminateCount = numOfPorts; syslog(LOG_INFO, "Waiting for mux-mode.\n"); sleep(1); /**************************************** 1个控制通道 ****************************************/ syslog(LOG_INFO, "Opening control channel.\n"); write_frame(0, NULL, 0, SABM | PF); /********************************** numOfPorts个逻辑通道 **********************************/ syslog(LOG_INFO, "Opening logical channels.\n"); for (i = 1; i <= numOfPorts; i++) { sleep(1); write_frame(i, NULL, 0, SABM | PF); syslog(LOG_INFO, "Connecting %s to virtual channel %d on %s\n", ptsname(ussp_fd[i-1]), i, serportdev); } return ret;}void closeDevices() { int i; close(serial_fd); for (i = 0; i < numOfPorts; i++) { char *symlinkName = createSymlinkName(i); close(ussp_fd[i]); if (symlinkName) { // Remove the symbolic link to the slave device unlink(symlinkName); free(symlinkName); } }}/** * The main program */int main(int argc, char *argv[], char *env[]){#define PING_TEST_LEN 6 static char ping_test[] = "\x23\x09PING"; //struct sigaction sa; int sel, len; fd_set rfds; struct timeval timeout; unsigned char buf[4096], **tmp; char *programName; int i, size,t; unsigned char close_mux[2] = { C_CLD | CR, 1 }; int opt; pid_t parent_pid; // for fault tolerance int pingNumber = 1; time_t frameReceiveTime; time_t currentTime; programName = argv[0]; /*************************************/ if(argc<2) { usage(programName); exit(-1); } _modem_type = GENERIC; serportdev="/dev/modem"; while((opt=getopt(argc,argv,"p:f:h?dwrm:b:P:s:"))>0) { switch(opt) { case 'p' : serportdev = optarg; break; case 'f' : max_frame_size = atoi(optarg); break; //Vitorio case 'd' : _debug = 1; break; case 'm': if(!strcmp(optarg,"mc35")) _modem_type = MC35; else if(!strcmp(optarg,"mc75")) _modem_type = MC35; else if(!strcmp(optarg,"generic")) _modem_type = GENERIC; else _modem_type = UNKNOW_MODEM; break; case 'b': baudrate = atoi(optarg); break; case 's': devSymlinkPrefix = optarg; break; case 'w': wait_for_daemon_status = 1; break; case 'P': pin_code = atoi(optarg); break; case 'r': faultTolerant = 1; break; case '?' : case 'h' : usage(programName); exit(0); break; default: break; } } //DAEMONIZE //SHOW TIME parent_pid = getpid(); daemonize(_debug); //The Hell is from now-one /* SIGNALS treatment*/ signal(SIGHUP, signal_treatment); signal(SIGPIPE, signal_treatment); signal(SIGKILL, signal_treatment); signal(SIGINT, signal_treatment); signal(SIGUSR1, signal_treatment); signal(SIGTERM, signal_treatment); programName = argv[0]; if(_debug) { openlog(programName, LOG_NDELAY | LOG_PID | LOG_PERROR , LOG_LOCAL0);//pode ir at
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -