📄 acard.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 + -