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

📄 btmodem.c

📁 Affix - Bluetooth Protocol Stack for Linux has been developed at Nokia Research Center in Helsinki
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (argc == 1) {		usage();		return 0;	}	/* Initialize all variables: */	mddev = NULL;	bty = NULL;	mdfd = 0;	btfd = 0;	endprog = 0;	mdbuf = NULL;	btbuf = NULL;	verbose = 0;	oldmdsig = 0;	oldbtsig = 0;	logging = 0;	logfile = NULL;	logfp = 0;	logtext = 0;	silent = 0;	crtscts = 0;	hexdumplinewidth = 0;	mdtxcount = mdrxcount = btrxcount = bttxcount = 0;	/* Read the command line parameters: */	while ((param = getopt(argc, argv, "eb:hl::m:qvx::?")) != -1) {		switch (param) {			case 'e':				emu = 1;				break;			case 'b': /* Get the string with the bluetooth bty: */				bty = (char *)malloc(strlen(optarg)+1);				memset(bty, 0, strlen(optarg)+1);				memcpy(bty, optarg, strlen(optarg));				break;			case 'h':				crtscts = 1;				break;			case 'l':				logging = 1;				if (optarg != 0) {					logfile = (char *)malloc(strlen(optarg)+1);					memset(logfile, 0, strlen(optarg)+1);					memcpy(logfile, optarg, strlen(optarg));				} else {					logfile = (char *)malloc(19);					memset(logfile, 0, 19);					memcpy(logfile, "/var/log/btmodem", 18);				}				break;			case 'm': /* Get the string with the modem tty: */				mddev = (char *)malloc(strlen(optarg)+1);				memset(mddev, 0, strlen(optarg)+1);				memcpy(mddev, optarg, strlen(optarg));				break;			case 'q':				silent = 1;				break;			case 'v':				verbose++;				break;			case 'x':				hexdumplinewidth = 16;				if (optarg != 0) {					hexdumplinewidth = atoi(optarg);				}				break;			case '?':			default:				free_ressources();				usage();				exit(1);		}	}	if (emu)		return emulate();	logtext = (char *)malloc(BUFFER_SIZE);	memset(logtext, 0, BUFFER_SIZE);	/* Open the logfile: */	if (logging) {		logfp = fopen(logfile, "a");		if (logfp == NULL) {			perror("Unable to open logfile");			handle_interruption(0);		}	}	/* Set the devicenames to default values, if not yet initialized: */	if (bty == NULL) {		bty = (char *)malloc(10);		memset(bty, 0, 10);		memcpy(bty, "/dev/bty0", 9);	}	if (mddev == NULL) {		mddev = (char *)malloc(11);		memset(mddev, 0, 11);		memcpy(mddev, "/dev/ttyS0", 10);	}	snprintf(logtext, BUFFER_SIZE, "Connecting bluetooth serial connection on device %s with modem on device %s",			bty, mddev);	logit(logtext);	memset(logtext, 0, BUFFER_SIZE);	if (verbose)		logit("Installing signal handler for interruption");	signal(SIGINT, &handle_interruption);	fflush(stdout);	/* Open the devices */	btfd = open(bty, O_RDWR);	mdfd = open(mddev, O_RDWR);	if (btfd == -1) {		perror("Unable to open bluetooth serial device");		handle_interruption(0);	}	if (mdfd == -1) {		perror("Unable to open modem device");		handle_interruption(0);	}	/* Initialize the serial connection to the modem: */	modem_setup(mdfd);	modem_setup(btfd);	snprintf(logtext, BUFFER_SIZE, "Opened devices %s and %s successfully", bty, mddev);	logit(logtext);	memset(logtext, 0, BUFFER_SIZE);	/* Make them nonblocking */	val = fcntl(mdfd, F_GETFL, 0);	fcntl(mdfd, F_SETFL, val | O_NONBLOCK);	val = fcntl(btfd, F_GETFL, 0);	fcntl(btfd, F_SETFL, val | O_NONBLOCK);	/* Get the maximal file descriptor for select: */	if (mdfd > btfd)		maxhandle = mdfd;	else		maxhandle = btfd;	/* Initialize the buffers: */	mdbuf = (char *)malloc(BUFFER_SIZE);	btbuf = (char *)malloc(BUFFER_SIZE);	memset(mdbuf, 0, BUFFER_SIZE);	memset(btbuf, 0, BUFFER_SIZE);	btdata = 0;	mddata = 0;	mdrxsize = 0;	btrxsize = 0;	if (verbose > 1)		logit("Buffers for data created and initialized");	/* Initialize the bluetooth connection with the modem stat */	ioctl(mdfd, TIOCMGET, &oldmdsig);	/* Check DSR stat: */	snprintf(logtext, BUFFER_SIZE, "Initializing lines on bluetooth connection: DSR: ");	if ((oldmdsig & TIOCM_DSR) == TIOCM_DSR)	{		snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "1, ");		setbtsig |= TIOCM_DTR;	} else {		snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "0, ");		unsetbtsig |= TIOCM_DTR;	}	/* Check RI stat: */ 	snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "RI: ");	if ((oldmdsig & TIOCM_RI) == TIOCM_RI) {		snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "1, ");		setbtsig |= TIOCM_RI;	} else {		snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "0, ");		unsetbtsig |= TIOCM_RI;	}	/* Check CAR stat: */ 	snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "CAR: ");	if ((oldmdsig & TIOCM_CAR) == TIOCM_CAR) {		snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "1");		setbtsig |= TIOCM_CAR;	} else {		snprintf(logtext+strlen(logtext), BUFFER_SIZE - strlen(logtext), "0");		unsetbtsig |= TIOCM_CAR;	}	if (verbose)		logit(logtext);	memset(logtext, 0, BUFFER_SIZE);	ioctl(btfd, TIOCMBIS, &setbtsig);	ioctl(btfd, TIOCMBIC, &unsetbtsig);	ioctl(btfd, TIOCMGET, &oldbtsig);	/* 	 * The main loop of the program.	 * Runs until interupted	 */	while (endprog == 0) {		/* Read the signals on the devices: */		ioctl(mdfd, TIOCMGET, &mdsig);		ioctl(btfd, TIOCMGET, &btsig);		/* If the signals differ from the old ones,		   check if some signals must be set on the other side: */		if (btsig != oldbtsig) {			snprintf(logtext, BUFFER_SIZE, "Line change on bluetooth side: ");			setmdsig = 0;			unsetmdsig = 0;			/* Check if stat of DSR has changed: */			if ((btsig & TIOCM_DSR) != (oldbtsig & TIOCM_DSR))	{				snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "DTR -> ");				if ((btsig & TIOCM_DSR) == TIOCM_DSR) {					setmdsig |= TIOCM_DTR;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 ");				} else {					unsetmdsig |= TIOCM_DTR;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 ");				}			}			if (verbose)				logit(logtext);			memset(logtext, 0, BUFFER_SIZE);			ioctl(mdfd, TIOCMBIS, &setmdsig);			ioctl(mdfd, TIOCMBIC, &unsetmdsig);			oldbtsig = btsig;		}		if (mdsig != oldmdsig) {			snprintf(logtext, BUFFER_SIZE, "Line change on modemside: ");			setbtsig = 0;			unsetbtsig = 0;			/* Check if DSR has changed: */			if ((mdsig & TIOCM_DSR) != (oldmdsig & TIOCM_DSR))	{				snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "DSR -> ");				if ((mdsig & TIOCM_DSR) == TIOCM_DSR) {					setbtsig |= TIOCM_DTR;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 ");				} else {					unsetbtsig |= TIOCM_DTR;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 ");				}			}			/* Check if RI has changed: */ 			if ((mdsig & TIOCM_RI) != (oldmdsig & TIOCM_RI)) {				snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "RI -> ");				if ((mdsig & TIOCM_RI) == TIOCM_RI) {					setbtsig |= TIOCM_RI;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 ");				} else {					unsetbtsig |= TIOCM_RI;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 ");				}			}			/* Check if CAR has changed: */ 			if ((mdsig & TIOCM_CAR) != (oldmdsig & TIOCM_CAR)) {				snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "CAR -> ");				if ((mdsig & TIOCM_CAR) == TIOCM_CAR) {					setbtsig |= TIOCM_CAR;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "1 ");				} else {					unsetbtsig |= TIOCM_CAR;					snprintf(logtext + strlen(logtext), BUFFER_SIZE - strlen(logtext), "0 ");				}			}			if (verbose)				logit(logtext);			memset(logtext, 0, BUFFER_SIZE);			ioctl(btfd, TIOCMBIS, &setbtsig);			ioctl(btfd, TIOCMBIC, &unsetbtsig);			oldmdsig = mdsig;		}		/* Handle the data on the serial devices: */		FD_ZERO(&readfds);		FD_ZERO(&writefds);		/* Check only for data if we can read something: */		if (btdata < BUFFER_SIZE)			FD_SET(btfd, &readfds);		if (mddata < BUFFER_SIZE)			FD_SET(mdfd, &readfds);		/* Check if we can write data - as long as we have some: */		if (mddata > 0)			FD_SET(btfd, &writefds);		if (btdata > 0)			FD_SET(mdfd, &writefds);		/* Now check the file handles: */		tv.tv_sec = 0;		tv.tv_usec = 10000;		select(maxhandle+1, &readfds, &writefds, NULL, &tv);		/* First write data, if possible: */		/* to the modem: */		if (FD_ISSET(mdfd, &writefds)) {			/* Try to write, ignore error: */			if ((mdtxsize = write(mdfd, btbuf, btdata)) == -1) {				/* NO ERRORHANDLING! */			} else {				/* If verbosity is high enough, show the data: */				if (verbose > 1) {					snprintf(logtext, BUFFER_SIZE, "Data written to modem");					logit(logtext);					memset(logtext, 0, BUFFER_SIZE);					memcpy(logtext, btbuf, btdata);					logit(logtext);					memset(logtext, 0, BUFFER_SIZE);				}				/* If asked for, print an hexdump of the data: */				print_hexdump(btbuf, btdata, hexdumplinewidth, 1);				/* If only partial written, copy the rest to the beginning: */				if (mdtxsize != btdata) {					memmove(btbuf, btbuf + mdtxsize, btdata - mdtxsize);				}				/* Decrease the byte count for the buffer: */				btdata -= mdtxsize;				mdtxcount += mdtxsize;			}		}		/* to the bluetooth device: */		if (FD_ISSET(btfd, &writefds)) {			/* Try to write, ignore error: */			if ((bttxsize = write(btfd, mdbuf, mddata)) == -1) {				/* NO ERRORHANDLING! */			} else {				/* If verbosity is high enough, show the data: */				if (verbose > 1) {					snprintf(logtext, BUFFER_SIZE, "Data written to bluetooth");					logit(logtext);					memset(logtext, 0, BUFFER_SIZE);					memcpy(logtext, mdbuf, mddata);					logit(logtext);					memset(logtext, 0, BUFFER_SIZE);				}				/* If asked for, print an hexdump of the data: */				print_hexdump(mdbuf, mddata, hexdumplinewidth, 0);				/* If only partial written, copy the rest to the beginning: */				if (bttxsize != mddata) {					memmove(mdbuf, mdbuf + bttxsize, mddata - bttxsize);				}				/* Decrease the byte count for the buffer: */				mddata -= bttxsize;				bttxcount += bttxsize;			}		}		/* Now read the data - if there is data and there is space in the buffers: */		/* from the modem: */		if (FD_ISSET(mdfd, &readfds)) {			/* Try to read the data, ignore error: */			if ((mdrxsize = read(mdfd, mdbuf + mddata, BUFFER_SIZE - mddata)) == -1) {				/* NO ERRORHANDLING! */			} else {				if (verbose > 1) {					snprintf(logtext, BUFFER_SIZE, "Data read from modem");					logit(logtext);					memset(logtext, 0, BUFFER_SIZE);				}				mddata += mdrxsize;				mdrxcount += mdrxsize;			}		}		/* from the bluetooth device: */		if (FD_ISSET(btfd, &readfds)) {			/* Try to read the data, ignore error: */			if ((btrxsize = read(btfd, btbuf + btdata, BUFFER_SIZE - btdata)) == -1) {				/* NO ERRORHANDLING! */			} else {				if (verbose > 1) {					snprintf(logtext, BUFFER_SIZE, "Data read from bluetooth");					logit(logtext);					memset(logtext, 0, BUFFER_SIZE);				} else if (btrxsize == 0) {					/* Check for null packets to close the socket: */					endprog = 1;				}				btdata += btrxsize;				btrxcount += btrxsize;			}		}	}	logit("Connection closed");	snprintf(logtext, BUFFER_SIZE, "Modem stats: %ld bytes received, %ld bytes sent", 			mdrxcount, mdtxcount);	logit(logtext);	memset(logtext, 0, BUFFER_SIZE);	snprintf(logtext, BUFFER_SIZE, "Bluetooth stats: %ld bytes received, %ld bytes sent", 			btrxcount, bttxcount);	logit(logtext);	memset(logtext, 0, BUFFER_SIZE);	free_ressources();	return 0;}

⌨️ 快捷键说明

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