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

📄 sms_modem.c

📁 使用TAP的蜂窝型GSM手机短消息服务中心
💻 C
📖 第 1 页 / 共 2 页
字号:
		t.c_cflag |= PARODD; 		/* set parity to odd	*/		break;	case 'N':		break;				/* No parity DEFAULT	*/	default:		lprintf(LOG_ERROR, "MODEM: Parity must be either E,O or N\n");		close(modem);		return -1; 	}	/* ---------------------------- */	/* Set stop bits 1 or 2		*/	/* ---------------------------- */		switch (stop)	{	case '2':		t.c_cflag |= CSTOPB;		/* 2 Stop bits		*/		break;	case '1':				/* 1 Stop bits DEFAULT	*/ 		break;	default:		lprintf(LOG_ERROR, "MODEM: Stop bits must be either 1 or 2\n");		close(modem);		return -1; 	}	/* ---------------------------- */	/* Set flow control		*/	/* Hardware or Software		*/	/* ---------------------------- */	switch (flow)	{#if defined(LINUX)	case 'H':		t.c_cflag |= CRTSCTS;		/* Hardware Flow	*/		             			/* control		*/		break;#endif	case 'S':		t.c_iflag |= IXON |		/* Xon/Xoff Flow	*/		             IXOFF |		/* control		*/		             IXANY;		break;	default:#if !defined(LINUX)		lprintf(LOG_ERROR, "MODEM: Flow control must be S for this platform\n");#else		lprintf(LOG_ERROR, "MODEM: Flow control must be either H or S for this platform\n");#endif		close(modem);		return -1; 	}	/* ---------------------------- */	/* Set baud rate		*/	/* Convert from numeric to 	*/	/* defines set in termios	*/	/* ---------------------------- */	if (baud >= 38400)	{	t_baud = B38400;	}	else if (baud >= 19200)	{	t_baud = B19200;	}	else if (baud >= 9600)	{	t_baud = B9600;	}	else if (baud >= 4800)	{	t_baud = B4800;	}	else if (baud >= 2400)	{	t_baud = B2400;	}	else if (baud >= 1200)	{	t_baud = B1200;	}	else	{	t_baud = B300;	} 	if (cfsetispeed(&t, t_baud) == -1) 	/* Set Input Baud rate 	*/	{		lprintf(LOG_WARNING, "MODEM: Failed Trying to set Input baud to %ld\n", baud);		close(modem);		return -1;	}	if (cfsetospeed(&t, t_baud) == -1) 	/* Set output Baud rate	*/	{		lprintf(LOG_WARNING, "MODEM: Failed Trying to set Output baud to %ld\n", baud);		close(modem);		return -1;			}	/* ---------------------------- */	/* Apply changes to modem	*/	/* device			*/	/* ---------------------------- */	if (tcflush(modem, TCIOFLUSH) == -1) 	{	lprintf(LOG_WARNING, "MODEM: Failed tcflush()\n");		close(modem);		return -1;	}	if (tcsetattr(modem,TCSANOW, &t) == -1) 	{	lprintf(LOG_WARNING, "MODEM: Failed tcsetattr()\n");		close(modem);		return -1;	}	/* ---------------------------- */	/* Reset mode to blocking	*/	/* ---------------------------- */	fcntl_clear(modem, O_NONBLOCK);	if (toggle_DTR(modem, MDM_dtr_sleep))	{	close(modem);		return -1;	}	modem_status = MODEM_OPEN;	return modem;}/* -------------------------------------------------------------------- *//* Send AT string. Check if result contains AT.				*//* If command is echoed then set modem_echo flag.			*//* -------------------------------------------------------------------- */int test_modem_echo(int modem){	char	buf[MAX_BUFSIZE],		str[MAX_BUFSIZE];	sms_strcpy(str, command_prefix);	sms_strcat(str, command_suffix);	if (twrite(modem, str, sms_strlen(str), MDM_write_timeout))	{	return(-1);	}	if (expstr(modem, buf, response_prefix, MAX_BUFSIZE, MDM_echo_timeout))	{	return(-1);	}	if (strncmp(buf, str, sms_strlen(str)) == 0)	{		modem_echo = TRUE;		lprintf(LOG_VERBOSE, "MODEM: Modem echo is set to ON\n");	} 	else	{	modem_echo = FALSE;		lprintf(LOG_VERBOSE, "MODEM: Modem echo is set to OFF\n");	}	if (expstr(modem, buf, response_suffix, MAX_BUFSIZE, MDM_echo_timeout))	{	return(-1);	}	if (strncmp(buf, "OK", sms_strlen("OK")))	{	return(-1);	}	return 0;}/* -------------------------------------------------------------------- *//* Send ATE0 string to set local echo to off.				*//* -------------------------------------------------------------------- */int set_local_echo(int modem){	char	str[MAX_BUFSIZE];	int	res;	sms_usleep(test_guard_time);	if (twrite(modem, "\r", sms_strlen("\r"), MDM_write_timeout))	{	return(-1);	}	sms_usleep(test_guard_time);	if (twrite(modem, "\r", sms_strlen("\r"), MDM_write_timeout))	{	return(-1);	}	sms_usleep(test_guard_time);	sms_strcpy(str, command_prefix);	sms_strcat(str, set_local_echo_off);	sms_strcat(str, command_suffix);	if (twrite(modem, str, sms_strlen(str), MDM_write_timeout))	{	return(-1);	}	if ((res = MDM_response(modem, MDM_response_timeout)) != MDM_OK)	{	return(-1);	}	lprintf(LOG_VERBOSE, "MODEM: Setting Local Modem Echo to OFF\n");	if (test_modem_echo(modem))	{	return(-1);	}		if (modem_echo)	{	return(-1);	}	return 0;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */int MDM_send_hangup(int modem){	char 	str[MAX_BUFSIZE],		*ptr;	int	res, 		retry,		hangup_status;	hangup_status = FALSE;	for (retry = soft_hangup_retries; retry > 0; retry--)	{		tcflush(modem, TCIOFLUSH);	/* Flush all data 	*/		sms_usleep(guard_time);		/* Sleep for gaurd_time	*/						/* before transmitting	*/						/* any data		*/		for(ptr = attention_command; *ptr ;ptr++)		{			str[0] = *ptr;			str[1] = '\0';					if (twrite(modem, str, sms_strlen(str), MDM_write_timeout))			{	break;			}				if (ptr[1] != '\0')			{	sms_usleep(esc_time);			}		}		if (*ptr)		{	lprintf(LOG_WARNING, "MODEM: Failed to issue attention command - %s\n", attention_command); 			break;		}		sms_usleep(guard_time);		/* Sleep for gaurd_time	*/						/* before transmitting	*/						/* any data		*/			res = MDM_response(modem, MDM_hangup_timeout);	 	if (res != MDM_OK)		{	lprintf(LOG_WARNING, "MODEM: Expecting OK response - %s\n", get_response(res)); 		}		sms_usleep(guard_time);		/* Sleep for gaurd_time	*/		sms_strcpy(str, command_prefix);		sms_strcat(str, command_suffix);			twrite(modem, str, sms_strlen(str), MDM_write_timeout);		res = MDM_response(modem, MDM_hangup_timeout);	 	if (res != MDM_OK)		{	lprintf(LOG_WARNING, "MODEM: Expecting OK response - %s\n", get_response(res)); 		}		sms_strcpy(str, command_prefix);		sms_strcat(str, hangup_command);		sms_strcat(str, command_suffix);		twrite(modem, str, sms_strlen(str), MDM_write_timeout);		res = MDM_response(modem, MDM_hangup_timeout);	 	if (res != MDM_OK)		{	if ((res == MDM_NO_CARRIER) ||			    (res == MDM_DISCONNECTED))			{				hangup_status = TRUE;				break;			}			lprintf(LOG_WARNING, "MODEM: Expecting OK response - %s\n", get_response(res)); 		}		else		{	hangup_status = TRUE;			break;		}	}	return hangup_status;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */int toggle_DTR(int modem, int sleep_int){struct 	termios 	t;speed_t	ibaud,	obaud;	if (tcgetattr(modem, &t) == -1)	{	lprintf(LOG_WARNING, "MODEM: Failed tcgetattr()\n");		close(modem);		return -1;	}	if (((ibaud = cfgetispeed(&t)) == -1) ||	    ((obaud = cfgetospeed(&t)) == -1))	{		lprintf(LOG_WARNING, "MODEM: Failed cfgetspeed()\n");		return -1;	}	if ((cfsetospeed(&t, B0) == -1) || 	/* Hangup as B0 causes	*/	    (cfsetispeed(&t, B0) == -1)) 	/* DTR to be lowered	*/	{							lprintf(LOG_WARNING, "MODEM: Failed cfsetspeed() - B0 HANGUP\n");		return -1;	}	if (tcsetattr(modem,TCSANOW, &t) == -1) 	{	lprintf(LOG_WARNING, "MODEM: Failed tcsetattr() - B0 HANGUP\n");		return -1;	}	sleep(sleep_int);			/* Allow things to 	*/						/* Settle down DTR may	*/						/* need to be left	*/						/* lowered for a period	*/						/* of time		*/	if ((cfsetospeed(&t, obaud) == -1) ||	    (cfsetispeed(&t, ibaud) == -1))	{							lprintf(LOG_WARNING, "MODEM: Failed cfsetspeed()\n");		return -1;	}	if (tcsetattr(modem,TCSANOW, &t) == -1) 	{#if 0		lprintf(LOG_WARNING, "MODEM: Failed tcsetattr() - setting speed\n");		return -1;#endif	}	return 0;}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */void MDM_hangup(int modem){	if (modem_status == MODEM_CLOSED)	{	return;	}	MDM_send_hangup(modem);	toggle_DTR(modem, MDM_dtr_sleep);#if 0	lprintf(LOG_VERBOSE, "MODEM: Returning Terminal to original settings\n");	if (tcsetattr(modem, TCSANOW, &t_orig) == -1)	{						/* Failed to return 	*/						/* to original terminal	*/						/* settings		*/		lprintf(LOG_WARNING, "MODEM: Failed tcsetattr() - Trying to return modem device to original settting\n");	}#endif	close(modem);	modem_status = MODEM_CLOSED;	lprintf(LOG_VERBOSE, "MODEM: Hangup Complete\n");	resource_unlock(modem_lockfile);	/* Remove lock file	*/						/* on this device	*/}/* -------------------------------------------------------------------- *//* -------------------------------------------------------------------- */int MDM_dial(char *number, char data, char parity, char stop, long baud) {	int 	modem,		res;	char 	str[MAX_BUFSIZE],		fname[MAX_BUFSIZE];	sms_strcpy(fname, MODEMDIR);	sms_strcat(fname, "/sms_modem");	if (read_resource_file(fname, resource_list, TRUE) != RESOURCE_FILE_OK)	{	lprintf(LOG_ERROR, "MODEM: Unrecoverable Failure Parsing modem file %s\n", fname); 		exit(-1);	}	sms_strcpy(modem_file, device_dir);	sms_strcat(modem_file, device);	sms_strcpy(modem_lockfile, lock_dir);	if (modem_lockfile[sms_strlen(modem_lockfile)] != '/')	{	sms_strcat(modem_lockfile, "/");	}	sms_strcat(modem_lockfile, lock_prefix);#if 0/* SOLARIS Lockfile syntax must add the following. */	{ RESOURCE_STRING,  "MDM_lock_platform", 	0, 0, NULL, 0, "TRADITIONAL",   0, 	  &lock_platform  	},{ RESOURCE_STRING,  "MDM_lock_format", 		0, 0, NULL, 0, "TRADITIONAL",   0, 	  &lock_format  	},#include <sys/types.h>#include <sys/stat.h>#include <sys/mkdev.h>static 	char 	*lock_platform,		*lock_format;	struct stat stat_buf;	if (stat(modem_file, &stat_buf) == -1)	{	lprintf(LOG_ERROR, "MODEM: stat() Failed\n"); 		exit(-1);	}	if (strcmp(lock_platform, "SOLARIS") == 0)	{		sprintf(&modem_lockfile[sms_strlen(modem_lockfile)],"%03u.%03u.%03u",		        major(stat_buf.st_dev),		        stat_buf.st_rdev >> 18,		        minor(stat_buf.st_rdev));	}	else	{	if (strcmp(MDM_lock_platform, "TRADITIONAL") != 0)		{	lprintf(LOG_WARNING, "MODEM: MDM_lock_platform invalid using 'TRADITIONAL'\n"); 		}		sms_strcat(modem_lockfile, device);	}#else	sms_strcat(modem_lockfile, device);#endif	if ((strcmp(flow_control, "Software") != 0) &&	    (strcmp(flow_control, "Hardware") != 0))	{		lprintf(LOG_ERROR, "MODEM: MDM_flow_control must be either 'Software' or 'Hardware'\n"); 		exit(-1);	}	MDM_obtain_lock(device);	/* May Block until lock		*/					/* obtained. This is dependant 	*/					/* on 'lock_action' set to	*/					/* BLOCK or NO_BLOCK		*/	modem = MDM_init(modem_file, data, parity, stop, flow_control[0], baud);	if (modem < 0)	{	lprintf(LOG_ERROR, "MODEM: MDM_init() Failed\n"); 		exit(-1);	}	if (set_local_echo(modem) == -1)	{	lprintf(LOG_ERROR, "MODEM: Setting Local echo Failed\n"); 		exit(-1);	}		sms_strcpy(str, command_prefix);	sms_strcat(str, init_command);	sms_strcat(str, command_suffix);	lprintf(LOG_VERBOSE, "MODEM: Sending Initialization string %s to modem\n", str); 	if (MDM_send(modem, str) != 0)	{	lprintf(LOG_VERBOSE, "MODEM: Sending Initialization string\n"); 		exit(-1);	}	lprintf(LOG_VERBOSE, "MODEM: Waiting for Initialization to complete...\n"); 	if ((res = MDM_response(modem, MDM_response_timeout)) != MDM_OK)	{	lprintf(LOG_VERBOSE, "MODEM: Expecting OK response - %s\n", get_response(res)); 		exit(-1);	}	lprintf(LOG_VERBOSE, "MODEM: Initialization complete\n"); 	lprintf(LOG_VERBOSE, "MODEM: Dialing %s\n", number); 	sms_strcpy(str, command_prefix);	sms_strcat(str, dial_command);	sms_strcat(str, number_prefix);	sms_strcat(str, number);	sms_strcat(str, command_suffix);	lprintf(LOG_VERBOSE, "MODEM: Sending dial string %s to modem\n", str); 	if (MDM_send(modem, str) != 0)	{	lprintf(LOG_ERROR, "MODEM: Sending dial string\n");		exit(-1);	}	lprintf(LOG_VERBOSE, "MODEM: Waiting for Connection...\n");	if ((res = MDM_response(modem, MDM_connect_timeout)) != MDM_CONNECT)	{	lprintf(LOG_VERBOSE, "MODEM: Expecting CONNECT response - %s\n", get_response(res)); 		exit(-1);	}	lprintf(LOG_VERBOSE, "MODEM: Connection Established.\n");	return modem;}

⌨️ 快捷键说明

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