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

📄 shell.c

📁 Linux下gsm/gprs modem的看守程序。支持短信发送与接受。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* libgsmd tool * * (C) 2006-2007 by OpenMoko, Inc. * Written by Harald Welte <laforge@openmoko.org> * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * */ #include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <libgsmd/libgsmd.h>#include <libgsmd/voicecall.h>#include <libgsmd/misc.h>#include <libgsmd/phonebook.h>#include <libgsmd/sms.h>#include <libgsmd/pin.h>#include <gsmd/usock.h>#include <gsmd/ts0705.h>#ifndef __GSMD__#define __GSMD__#include <gsmd/talloc.h>#undef __GSMD__#endif#define STDIN_BUF_SIZE	1024int pending_responses = 0;/* this is the handler for receiving passthrough responses */static int pt_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh){	char *payload = (char *)gmh + sizeof(*gmh);	printf("RSTR=`%s'\n", payload);	return 0;}/* this is the handler for receiving phonebook responses */static int pb_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh){	struct gsmd_phonebook *gp;	struct gsmd_phonebooks *gps;	struct gsmd_phonebook_support *gpsu;	struct gsmd_phonebook_storage *gpst;	char *payload;	int i;	switch (gmh->msg_subtype) {	case GSMD_PHONEBOOK_FIND:				gps = (struct gsmd_phonebooks *) ((char *)gmh + sizeof(*gmh));		if (gps->pb.index > 0)			printf("%d, %s, %d, %s\n",					gps->pb.index, gps->pb.numb,					gps->pb.type, gps->pb.text);		else if (gps->pb.index < 0)			/* If index < 0, error happens */			printf("+CME ERROR %d\n", (0-(gps->pb.index)));		else			/* The record doesn't exist or could not read yet */			printf("Doesn't exist or couldn't read it yet\n");		if (gps->is_last)			pending_responses --;		break;	case GSMD_PHONEBOOK_READRG:		gps = (struct gsmd_phonebooks *) ((char *)gmh + sizeof(*gmh));		if (gps->pb.index > 0)			printf("%d, %s, %d, %s\n",					gps->pb.index, gps->pb.numb,					gps->pb.type, gps->pb.text);		else if (gps->pb.index < 0)			/* If index < 0, error happens */			printf("+CME ERROR %d\n", (0-(gps->pb.index)));		else			/* The record doesn't exist or could not read yet */			printf("Doesn't exist or couldn't read it yet\n");		if (gps->is_last)			pending_responses --;		break;	case GSMD_PHONEBOOK_READ:		gp = (struct gsmd_phonebook *) ((char *)gmh + sizeof(*gmh));		if (gp->index > 0)			printf("%d, %s, %d, %s\n",					gp->index, gp->numb,					gp->type, gp->text);		else if (gp->index < 0)			/* If index < 0, error happens */			printf("+CME ERROR %d\n", (0-(gp->index)));		else			/* The record doesn't exist or could not read yet */			printf("Doesn't exist or couldn't read it yet\n");		break;	case GSMD_PHONEBOOK_GET_SUPPORT:		gpsu = (struct gsmd_phonebook_support *) ((char *)gmh + sizeof(*gmh));		printf("(1-%d), %d, %d\n", gpsu->index, gpsu->nlength, gpsu->tlength);		pending_responses --;		break;	case GSMD_PHONEBOOK_LIST_STORAGE:		gpst = (struct gsmd_phonebook_storage *)((char *)gmh + sizeof(*gmh));		for (i = 0; i < gpst->num; i++) {			printf("%s, ", gpst->mem[i].type);		}		printf("\n");		break;	case GSMD_PHONEBOOK_WRITE:	case GSMD_PHONEBOOK_DELETE:	case GSMD_PHONEBOOK_SET_STORAGE:		/* TODO: Need to handle error */		payload = (char *)gmh + sizeof(*gmh);		printf("%s\n", payload);		break;	default:		return -EINVAL;	}	return 0;}/* this is the handler for receiving sms responses */static int sms_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh){	char payload[GSMD_SMS_DATA_MAXLEN];	int *result;	struct gsmd_sms_list *sms;	struct gsmd_addr *addr;	struct gsmd_sms_storage *mem;	static const char *msgtype[] = {		"Unread", "Received", "Unsent", "Sent"	};	static const char *memtype[] = {		"Unknown", "Broadcast", "Me message", "MT", "SIM", "TA", "SR"	};	switch (gmh->msg_subtype) {	case GSMD_SMS_LIST:	case GSMD_SMS_READ:		sms = (struct gsmd_sms_list *) ((void *) gmh + sizeof(*gmh));		if(sms->payload.is_voicemail)			printf("it's a voicemail \n");		printf("%s message %i from/to %s%s, at %i%i-%i%i-%i%i "				"%i%i:%i%i:%i%i, GMT%c%i\n",				msgtype[sms->stat], sms->index,				((sms->addr.type & __GSMD_TOA_TON_MASK) ==				 GSMD_TOA_TON_INTERNATIONAL) ? "+" : "",				sms->addr.number,				sms->time_stamp[0] & 0xf,				sms->time_stamp[0] >> 4,				sms->time_stamp[1] & 0xf,				sms->time_stamp[1] >> 4,				sms->time_stamp[2] & 0xf,				sms->time_stamp[2] >> 4,				sms->time_stamp[3] & 0xf,				sms->time_stamp[3] >> 4,				sms->time_stamp[4] & 0xf,				sms->time_stamp[4] >> 4,				sms->time_stamp[5] & 0xf,				sms->time_stamp[5] >> 4,				(sms->time_stamp[6] & 8) ? '-' : '+',				(((sms->time_stamp[6] << 4) |				  (sms->time_stamp[6] >> 4)) & 0x3f) >> 2);		if (sms->payload.coding_scheme == ALPHABET_DEFAULT) {			unpacking_7bit_character(&sms->payload, payload);			printf("\"%s\"\n", payload);		} else if (sms->payload.coding_scheme == ALPHABET_8BIT)			printf("8-bit encoded data\n");		else if (sms->payload.coding_scheme == ALPHABET_UCS2)			printf("Unicode-16 encoded text\n");		if (sms->is_last)			pending_responses --;		break;	case GSMD_SMS_SEND:		pending_responses --;		result = (int *) ((void *) gmh + sizeof(*gmh));		if (*result >= 0) {			printf("Send: message sent as ref %i\n", *result);			break;		}		switch (-*result) {		case 42:			printf("Store: congestion\n");			break;		default:			printf("Store: error %i\n", *result);			break;		}		break;	case GSMD_SMS_WRITE:		pending_responses --;		result = (int *) ((void *) gmh + sizeof(*gmh));		if (*result >= 0) {			printf("Store: message stored with index %i\n",					*result);			break;		}		switch (-*result) {		case GSM0705_CMS_SIM_NOT_INSERTED:			printf("Store: SIM not inserted\n");			break;		default:			printf("Store: error %i\n", *result);			break;		}		break;	case GSMD_SMS_DELETE:		pending_responses --;		result = (int *) ((void *) gmh + sizeof(*gmh));		switch (*result) {		case 0:			printf("Delete: success\n");			break;		case GSM0705_CMS_SIM_NOT_INSERTED:			printf("Delete: SIM not inserted\n");			break;		case GSM0705_CMS_INVALID_MEMORY_INDEX:			printf("Delete: invalid memory index\n");			break;		default:			printf("Delete: error %i\n", *result);			break;		}		break;	case GSMD_SMS_GET_MSG_STORAGE:		mem = (struct gsmd_sms_storage *)			((void *) gmh + sizeof(*gmh));		printf("mem1: %s (%i)       Occupied: %i / %i\n",				memtype[mem->mem[0].memtype],				mem->mem[0].memtype,				mem->mem[0].used,				mem->mem[0].total);		printf("mem2: %s (%i)       Occupied: %i / %i\n",				memtype[mem->mem[1].memtype],				mem->mem[1].memtype,				mem->mem[1].used,				mem->mem[1].total);		printf("mem3: %s (%i)       Occupied: %i / %i\n",				memtype[mem->mem[2].memtype],				mem->mem[2].memtype,				mem->mem[2].used,				mem->mem[2].total);		pending_responses --;		break;	case GSMD_SMS_GET_SERVICE_CENTRE:		addr = (struct gsmd_addr *) ((void *) gmh + sizeof(*gmh));		printf("Number of the default Service Centre is %s\n",				addr->number);		pending_responses --;		break;	default:		pending_responses --;		return -EINVAL;	}	return 0;}/* this is the handler for responses to network/operator commands */static int net_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh){	const struct gsmd_signal_quality *sq = (struct gsmd_signal_quality *)		((void *) gmh + sizeof(*gmh));	const char *oper = (char *) gmh + sizeof(*gmh);	const struct gsmd_msg_oper *opers = (struct gsmd_msg_oper *)		((void *) gmh + sizeof(*gmh));	const struct gsmd_own_number *num = (struct gsmd_own_number *)		((void *) gmh + sizeof(*gmh));	const struct gsmd_voicemail *vmail = (struct gsmd_voicemail *)		((void *) gmh + sizeof(*gmh));	enum gsmd_netreg_state state = *(enum gsmd_netreg_state *) gmh->data;	int result = *(int *) gmh->data;	static const char *oper_stat[] = {		[GSMD_OPER_UNKNOWN] = "of unknown status",		[GSMD_OPER_AVAILABLE] = "available",		[GSMD_OPER_CURRENT] = "our current operator",		[GSMD_OPER_FORBIDDEN] = "forbidden",	};	static const char *srvname[] = {		[GSMD_SERVICE_ASYNC_MODEM] = "asynchronous modem",		[GSMD_SERVICE_SYNC_MODEM] = "synchronous modem",		[GSMD_SERVICE_PAD_ACCESS] = "PAD Access (asynchronous)",		[GSMD_SERVICE_PACKET_ACCESS] = "Packet Access (synchronous)",		[GSMD_SERVICE_VOICE] = "voice",		[GSMD_SERVICE_FAX] = "fax",	};	switch (gmh->msg_subtype) {	case GSMD_NETWORK_SIGQ_GET:		if (sq->rssi == 99)			printf("Signal undetectable\n");		else			printf("Signal quality %i dBm\n", -113 + sq->rssi * 2);		if (sq->ber == 99)			printf("Error rate undetectable\n");		else			printf("Bit error rate %i\n", sq->ber);		pending_responses --;		break;	case GSMD_NETWORK_OPER_GET:	case GSMD_NETWORK_OPER_N_GET:		if (oper[0])			printf("Our current operator is %s\n", oper);		else			printf("No current operator\n");		pending_responses --;		break;	case GSMD_NETWORK_OPER_LIST:		for (; !opers->is_last; opers ++)			printf("%8.*s   %16.*s,   %.*s for short, is %s\n",					sizeof(opers->opname_num),					opers->opname_num,					sizeof(opers->opname_longalpha),					opers->opname_longalpha,					sizeof(opers->opname_shortalpha),					opers->opname_shortalpha,					oper_stat[opers->stat]);		pending_responses --;		break;	case GSMD_NETWORK_GET_NUMBER:		printf("\t%s\t%10s%s%s%s\n", num->addr.number, num->name,				(num->service == GSMD_SERVICE_UNKNOWN) ?				"" : " related to ",				(num->service == GSMD_SERVICE_UNKNOWN) ?				"" : srvname[num->service],				(num->service == GSMD_SERVICE_UNKNOWN) ?				"" : " services");		pending_responses --;		break;	case GSMD_NETWORK_VMAIL_SET:		if (result)			printf("Set voicemail error %i\n", result);		else			printf("Set voicemail OK \n");		pending_responses --;		break;	case GSMD_NETWORK_VMAIL_GET:		if(vmail->addr.number)			printf ("voicemail number is %s \n",vmail->addr.number);		pending_responses --;		break;	case GSMD_NETWORK_QUERY_REG:		switch (state) {			case GSMD_NETREG_UNREG:				printf("not searching for network \n");				break;			case GSMD_NETREG_REG_HOME:				printf("registered (home network) \n");				break;			case GSMD_NETREG_UNREG_BUSY:				printf("searching for network \n");				break;			case GSMD_NETREG_DENIED:				printf("registration denied \n");				break;			case GSMD_NETREG_REG_ROAMING:				printf("registered (roaming) \n");				break;			default:				break;		}		pending_responses --;		break;	default:		return -EINVAL;	}	return 0;}static int phone_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh){	char *payload  = (char *)gmh + sizeof(*gmh);	int *intresult = (void *)gmh + sizeof(*gmh);	const struct gsmd_battery_charge *bc = (struct gsmd_battery_charge *)		((void *) gmh + sizeof(*gmh));	switch (gmh->msg_subtype) {	case GSMD_PHONE_GET_IMSI:		printf("imsi <%s>\n", payload);		break;	case GSMD_PHONE_GET_MANUF:		printf("manufacturer: %s\n", payload);		break;	case GSMD_PHONE_GET_MODEL:		printf("model: %s\n", payload);		break;	case GSMD_PHONE_GET_REVISION:		printf("revision: %s\n", payload);		break;	case GSMD_PHONE_GET_SERIAL:		printf("serial: %s\n", payload);		break;	case GSMD_PHONE_POWERUP:		if (*intresult)			printf("Modem power-up failed: %i\n", *intresult);		else			printf("Modem powered-up okay\n");		break;	case GSMD_PHONE_POWERDOWN:		if (*intresult)			printf("Modem power-down failed: %i\n", *intresult);		else			printf("Modem down\n");		break;	case GSMD_PHONE_POWER_STATUS:		printf("Antenna Status: %s\n", payload);		break;	case GSMD_PHONE_GET_BATTERY:		printf("<BCS>: %d <BCL>: %d \n", bc->bcs, bc->bcl);		break;			case GSMD_PHONE_VIB_ENABLE:		if(*intresult)			printf("Vibrator enable failed: %i\n", *intresult);		else			printf("Vibrator enabled\n");		break;	case GSMD_PHONE_VIB_DISABLE:		if(*intresult)			printf("Vibrator disable failed: %i\n", *intresult);		else			printf("VIbrator disabled\n");		break;	default:		return -EINVAL;	}	pending_responses --;	return 0;}static int pin_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh){	int result = *(int *) gmh->data;	switch (gmh->msg_subtype) {		case GSMD_PIN_GET_STATUS:			printf("PIN STATUS: %i\n", result);			break;		case GSMD_PIN_INPUT:			if (result)				printf("PIN error %i\n", result);			else				printf("PIN accepted!\n");			break;		default:			return -EINVAL;		}	pending_responses --;	return 0;}static int call_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh){	struct gsmd_call_status *gcs;	struct gsmd_call_fwd_stat *gcfs;	int *ret;	switch (gmh->msg_subtype) {	case GSMD_VOICECALL_GET_STAT:		gcs = (struct  gsmd_call_status*) ((char *)gmh + sizeof(*gmh));				if (gcs->idx > 0)			printf("%d, %d, %d, %d, %d, %s, %d\n",					gcs->idx, gcs->dir,					gcs->stat, gcs->mode,					gcs->mpty, gcs->number,					gcs->type);		else if (gcs->idx < 0)			/* If index < 0, error happens */			printf("+CME ERROR %d\n", (0-(gcs->idx)));		else			/* No existing call */			printf("Doesn't exist\n");		if (gcs->is_last)			pending_responses --;		break;	case GSMD_VOICECALL_CTRL:		ret = (int*)((char *)gmh + sizeof(*gmh));		 (*ret)? printf("+CME ERROR %d\n", *ret) : printf("OK\n");		pending_responses --;		break;	case GSMD_VOICECALL_FWD_DIS:		pending_responses --;		break;	case GSMD_VOICECALL_FWD_EN:		pending_responses --;		break;	case GSMD_VOICECALL_FWD_STAT:		gcfs = (struct  gsmd_call_fwd_stat*) ((char *)gmh + sizeof(*gmh));				printf("+CCFC:%d, %d, %s\n",gcfs->status, gcfs->classx, gcfs->addr.number);		if (gcfs->is_last)			pending_responses --;		break;	case GSMD_VOICECALL_FWD_REG:

⌨️ 快捷键说明

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