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

📄 acard.c

📁 asterisk c-agi 提供c 语言接口的例子
💻 C
字号:
#include "acard.h"
/*
 * 电话卡系统;
 * 普通流程:
 *     选择提示语言种类
 *     输入卡号码,密码
 *     输入被叫号码,或者选择功能
 *        11#余额查询
	1、输入接入码17908,听语音“欢迎使用江苏电信IP业务,请您选择提示语音的种类,1为普通话,2为英语。”
	2、通过卡号密码鉴权后,听语音“主叫绑定请拨66#”。
	3、按66#,听语音“请您选择服务种类,登记当前主叫请按1,取消当前主叫请按2,登记密码请按3,
		取消密码 请按4,绑定其他电话请按5,解除其他电话的绑定请按6,返回请按0”。

	4、选择1进行本机绑定。
	5、选择5进行异机绑定,听语音“请输入要绑定的电话号码”,输入区号+绑定号码。
	6、完成绑定操作之后,在绑定话机上:
	(1)一次拨号:179088+被叫号码
	(2)二次拨号:听语音“请输入您的卡号,如果要使用本话机已经绑定的卡号,请直接按#”,
	按“#”后听语音“请拨您要的号码或缩位号码,并在号码后加拨#号”,拨被叫号码+#完成呼叫。
	7、登记回拨电话,77#“请选择服务种类,登记当前主叫请按1,取消当前主叫请按2,登记密码请按3,
	取消密码请按4,登记其他电话请按5,解除其他回拨电话绑定请按6”
 */
/*
	程序流程:
	*  约束电话判定;
*/
/*
acard.conf

*/

ACARD_SYS_Param acardSysParam;

int initacardSysParam();

int initACardAllInfo(AGI_TOOLS agi,ACARD_Caller_Info *acinfo);

int checkCallerNo(MYSQL mysql,ACARD_Caller_Info *acinfo);
int dealNormalPhone(AGI_TOOLS agi,MYSQL mysql,ACARD_Caller_Info *acinfo);
int main()
{
	/*declare structures and variables */
	MYSQL mysql;

	//for AGI
	AGI_TOOLS agi;
	AGI_CMD_RESULT res;

//	FILE *fp;

	ACARD_Caller_Info acardCallerInfo;


	AGITool_Init(&agi);

	AGITool_verbose(&agi, &res, AGITool_ListGetVal(agi.agi_vars, "agi_request"), 0);
	//
	if(initacardSysParam())
	{
		//printDebugInfo(agi,DEBUG_INFO_ERROR,&acardCallerInfo,"ERROR Read DB Params");
		AGITool_noop(&agi,&res,"ERROR Read DB Params");
		//mysql_close(&mysql);
		AGITool_Destroy(&agi);
		return 2;
	}
	AGITool_noop(&agi,&res,"OKKKKKKK");
	initACardAllInfo(agi,&acardCallerInfo);

	//initialize MYSQL structure
	if(mysql_init(&mysql)==NULL)
	{
		//
		printDebugInfo(agi,DEBUG_INFO_ERROR,&acardCallerInfo,"Init MYSQL ERROR");
		AGITool_Destroy(&agi);
		return 1;
	}
	printDebugInfo(agi,DEBUG_INFO_INFO,&acardCallerInfo,"Init MYSQL OKK");


	//connect to database
	if(mysql_real_connect(
		&mysql,
		acardSysParam.host,
		acardSysParam.user,
		acardSysParam.passwd,
		acardSysParam.dbname,0,NULL,0)==NULL)
	{
		//
		printDebugInfo(agi,DEBUG_INFO_ERROR,&acardCallerInfo,"ERROR Connect TO Database");
		mysql_close(&mysql);
		AGITool_Destroy(&agi);
		return 3;
	}

	initACARDVoiceList(agi,mysql,&acardCallerInfo);

	//约束电话识别
	checkCallerNo(mysql,&acardCallerInfo);
	if(acardCallerInfo.response_flag==ACARD_RESPONSE_FLAG_ANSWER)
	{
		AGITool_answer(&agi,&res);
	}
	switch(acardCallerInfo.limit_type)
	{
	case ACARD_CALL_TYPE_NORMAL:
		//进入选择提示语,输入卡号,密码流程
		dealNormalPhone(agi,mysql,&acardCallerInfo);
	case ACARD_CALL_TYPE_DIRECT:
	case ACARD_CALL_TYPE_LIMIT:
	case ACARD_CALL_TYPE_IDPASSWD:;
	}
	//
	mysql_close(&mysql);
	AGITool_hangup(&agi,&res,acardCallerInfo.channel_name);
	AGITool_noop(&agi,&res,"Exit");
	AGITool_Destroy(&agi);
	return 0;
}

int initacardSysParam()
{
	///etc/acard.conf
	FILE *fp;
	fp=fopen("/etc/acard.conf","r");
	if(fp==NULL)
		return 1;
	else
	{
		fscanf(fp,"%s\n",acardSysParam.host);
		fscanf(fp,"%s\n",acardSysParam.user);
		fscanf(fp,"%s\n",acardSysParam.passwd);
		fscanf(fp,"%s\n",acardSysParam.dbname);
		fscanf(fp,"%s\n",acardSysParam.logfile);
		//fscanf(fp,"%d\n",acardSysParam.debugflag);
		acardSysParam.debugflag=3;
		//fprintf(stdout,acardSysParam.logfile);
		fclose(fp);
		return 0;
	}
}

int initACardAllInfo(AGI_TOOLS agi,ACARD_Caller_Info *acinfo)
{
	sprintf(acinfo->caller_id,AGITool_ListGetVal(agi.agi_vars,"agi_callerid"));
	sprintf(acinfo->dn_id,AGITool_ListGetVal(agi.agi_vars,"agi_dnid"));
	sprintf(acinfo->contract_id,"");
	sprintf(acinfo->user_id,"");
	sprintf(acinfo->channel_name,AGITool_ListGetVal(agi.agi_vars,"agi_channel"));
	sprintf(acinfo->unique_id,AGITool_ListGetVal(agi.agi_vars,"agi_uniqueid"));
	acinfo->limit_type=ACARD_CALL_TYPE_NORMAL;//初始化的是需要卡号密码的那种
	acinfo->prompt_type=ACARD_PROMPT_TYPE_VOICE;//多育种提示
	acinfo->response_flag=ACARD_RESPONSE_FLAG_ANSWER;//需要应答
	acinfo->phone_state=ACARD_PHONE_STATE_NORMAL;//正常使用
	return 0;
	
}

int checkCallerNo(MYSQL mysql,ACARD_Caller_Info *acinfo)
{
	MYSQL_RES *result;
	MYSQL_ROW row;
	char sqlstr[255];

	sprintf(sqlstr,"select * from T_LIMITPHONE where phone_no='%s'",
		acinfo->caller_id);

	mysql_query(&mysql,sqlstr);
	result=mysql_store_result(&mysql);

	row=mysql_fetch_row(result);
	if(row)
	{
		sprintf(acinfo->user_id,row[0]);
	}
	else
	{
		//no the phoneno,do nothing
	}
	mysql_free_result(result);
	return 0;
}

int dealNormalPhone(AGI_TOOLS agi,MYSQL mysql,ACARD_Caller_Info *acinfo)
{
	MYSQL_RES *result;
	MYSQL_ROW row;

	AGI_CMD_RESULT res;
	char sqlstr[255];
	char vfname[255];
	char msgstr[255];
	int tryi,tryalli;
	//

	if(getVoiceFileName(agi,acinfo,VOICE_SELECT_LANGUAGE,
		LANGUAGE_TYPE_MANDARIN,vfname))
	{
		//error no this voicefile
		return 1;
	}
	AGITool_get_data(&agi,&res,vfname,2000,1);
	if(strcmp(res.result,"1")==0)
	{
		printDebugInfo(agi,DEBUG_INFO_INFO,acinfo,"LTYPE=LANGUAGE_TYPE_MANDARIN");
		acinfo->prompt_type=LANGUAGE_TYPE_MANDARIN;
	}
	else
	{
		printDebugInfo(agi,DEBUG_INFO_INFO,acinfo,"LTYPE=LANGUAGE_TYPE_ENGLISH");
		acinfo->prompt_type=LANGUAGE_TYPE_ENGLISH;
	}
	//读取语言种类
	//输入卡号
	tryalli=0;
	while(tryalli<3)
	{
		tryi=0;
		while(tryi<3)
		{
			if(getVoiceFileName(agi,acinfo,VOICE_INPUT_USERID,acinfo->prompt_type,vfname))
			{
				printDebugInfo(agi,DEBUG_INFO_ERROR,acinfo,"No VOICE_INPUT_USERID Voice");
				return 1;
			}
			AGITool_get_data(&agi,&res,vfname,2000,19);
			if(strlen(res.result)<6)
			{
				printDebugInfo(agi,DEBUG_INFO_WARNING,acinfo,"Input CARDNO Length FAILED");
				if(getVoiceFileName(agi,acinfo,VOICE_ERROR_INPUT,acinfo->prompt_type,vfname))
				{
					printDebugInfo(agi,DEBUG_INFO_ERROR,acinfo,"No VOICE_INPUT_USERID Voice");
					return 1;
				}
				AGITool_stream_file(&agi,&res,vfname,"1234567890#*",0);
				tryi++;
			}
			else
			{
				sprintf(msgstr,"INPUT USERID %s",res.result);
				printDebugInfo(agi,DEBUG_INFO_INFO,acinfo,msgstr);
				sprintf(acinfo->user_id,res.result);
				break;
			}
		}
		if(tryi>=3)
		{
			printDebugInfo(agi,DEBUG_INFO_WARNING,acinfo,"INPUT USERID ERROR >3");
			return 1;
		}
		//input password
		tryi=0;
		while(tryi<3)
		{
			if(getVoiceFileName(agi,acinfo,VOICE_INPUT_PASSWORD,acinfo->prompt_type,vfname))
			{
				printDebugInfo(agi,DEBUG_INFO_ERROR,acinfo,"No VOICE_INPUT_PASSWORD Voice");
				return 1;
			}
			AGITool_get_data(&agi,&res,vfname,2000,19);
			if(strlen(res.result)<4)
			{
				printDebugInfo(agi,DEBUG_INFO_WARNING,acinfo,"Input PASSWORD Length FAILED");
				if(getVoiceFileName(agi,acinfo,VOICE_ERROR_INPUT,acinfo->prompt_type,vfname))
				{
					printDebugInfo(agi,DEBUG_INFO_ERROR,acinfo,"No VOICE_INPUT_PASSWORD Voice");
					return 1;
				}
				AGITool_stream_file(&agi,&res,vfname,"1234567890#*",0);
				tryi++;
			}
			else
			{
			
				sprintf(msgstr,"INPUT PASSWORD %s",res.result);
				printDebugInfo(agi,DEBUG_INFO_INFO,acinfo,msgstr);
				sprintf(acinfo->user_passwd,res.result);
				break;
			}
		}
		if(tryi>=3)
		{
			printDebugInfo(agi,DEBUG_INFO_WARNING,acinfo,"INPUT PASSWORD ERROR >3");
			return 1;
		}

		//AGITool_noop(&agi,&res,res.result);
		//数据库验证用户密码
		sprintf(sqlstr,"select * from T_USERID where user_id='%s' and user_password='%s'",
			acinfo->user_id,acinfo->user_passwd);
		//以后考虑MD5?
		mysql_query(&mysql,sqlstr);
		result=mysql_store_result(&mysql);
		if(row=mysql_fetch_row(result))
		{
			//OKK
			sprintf(acinfo->contract_id,row[0]);
			break;
		}
		else
		{
			//error ,should input again
			if(getVoiceFileName(agi,acinfo,VOICE_ERROR_USERID_PASSWORD,acinfo->prompt_type,vfname))
			{
				printDebugInfo(agi,DEBUG_INFO_WARNING,acinfo,"No VOICE_ERROR_USERID_PASSWORD Voice");
				return 1;
			}
			AGITool_stream_file(&agi,&res,vfname,"1234567890#*",0);
			tryalli++;
		}
		mysql_free_result(result);
	}
	sprintf(msgstr,"USERID %s password %s,contract %s",
		acinfo->user_id,acinfo->user_passwd,acinfo->contract_id);
	printDebugInfo(agi,DEBUG_INFO_INFO,acinfo,msgstr);
	return 0;
}

int printDebugInfo(AGI_TOOLS agi,int debugFlag,ACARD_Caller_Info *acinfo,char *debugInfo)
{
	AGI_CMD_RESULT res;
	FILE *fp;
	char msgbuff[1024];
	time_t timep;
	time (&timep);

	if(debugFlag<=acardSysParam.debugflag)
	{
		AGITool_noop(&agi,&res,debugInfo);
		fp=fopen(acardSysParam.logfile,"w");
		//fp=fopen("/var/lib/acard/acard.log","a+");
		if(fp==NULL)
		{
			AGITool_noop(&agi,&res,acardSysParam.logfile);
			AGITool_noop(&agi,&res,"OPENLOF FAILED");
		}
		else
		{
			sprintf(msgbuff,"%s:CHN-%s,USR-%s,CALLER-%s,%s\n",
				asctime(gmtime(&timep)),
				acinfo->channel_name,
				acinfo->user_id,
				acinfo->caller_id,
				debugInfo);
			fprintf(fp,msgbuff);
			fclose(fp);
		}
	}
	return 0;
}

⌨️ 快捷键说明

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