#include <stdio.h>
#include "shpa3api.h"
#include "mysql.h"
int stateValue=-1;
char *type;
int i;
struct StateInfo
{
int value;
char *info;
};
struct StateInfo myState;
struct IDCardANDPass
{
char *idCard;
char *pass;
};
struct IDCardANDPass idCardPass[10];
enum ChanelState
{
IDLE
WALT_CONNECT
PLAY_WELCOME
CHECK_PLAY_COME
PLAY_SELECT
CHECK_PLAY_SELECT
STEP1_CHECK_IDCARD
STEP1_PLAY_PASS
STEP1_CHECK_PASS
STEP1_CHECK_USER
STEP2_CHECK_IDCARD
STEP2_PLAY_PASS
STEP2_CHECK_PASS
STEP2_PLAY_PASS2
STEP2_CHECK_PASS2
STEP2_CHECK_USER
STEP3_CHECK_IDCARD
STEP3_PLAY_PASS
STEP3_CHECK_PASS
STEP3_PLAY_LOSS
STEP3_CHECK_LOSS
CHECK_PLAY_BYEBYE
NOTRK
};
enum ChanelState chanelState[10]={IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE};
char *currentState="ABC";
//数据库参数
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int t,r;
//主函数
int main ()
{
InitMySQL();
int init=0;
init=SsmStartCti("ShConfig.ini","ShIndex.ini");
if(init!=0)
{
printf("Init Is Error!/n");
puts(SsmGetLastErrMsgA());
return 0;
}
else
{
printf("Init Is OKa!/n");
}
int i;
while(1)
{
for(i=0;i<8;i++)
{
getChanelState(i);//通道状态
getChanelType(i);//通道类型
scanChanel(i,myState.value);//检测通道
}
sleep(1);
fflush(stdout);
printf("/n/n");
}
int nTmp = getch();
while ((nTmp != 'q') && (nTmp != 'Q'))
nTmp = getch();
ExitSys();
return 0;
}
InitMySQL()
{
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"localhost", "root", "", "cti",0,NULL,0))
{
printf("Error connection to database:%s/n",mysql_error(&mysql));
}
else
{
printf("Connected......../n");
}
}
getChanelState(int chanelIndex)
{
int temp=SsmGetChState(chanelIndex);
switch(temp)
{
case 0:
myState.value=0;
myState.info="Kong Xian";
break;
case 1:
myState.value=1;
myState.info="Zai ji";
break;
case 2:
myState.value=2;
myState.info="Zhen Ling";
break;
case 3:
myState.value=3;
myState.info="Tong Hua";
break;
case 4:
myState.value=4;
myState.info="Deng Dai Bo Hao Yin";
break;
case 5:
myState.value=5;
myState.info="Bo Hao";
break;
case 6:
myState.value=6;
myState.info="Deng Dai Bo Hao Jie Guo";
break;
case 7:
myState.value=7;
myState.info="Guo Qi";
break;
case 9:
myState.value=9;
myState.info="Deng Hou Bei Jiao Zhai Ji";
break;
default:
break;
}
printf("%s------------",myState.info);
printf("-------myState:%d---------",myState.value);
}
getChanelType(int chanelIndex)
{
int temp=SsmGetChType(chanelIndex);
switch(temp)
{
case 0:
type = "Mo Ni";
break;
case 1:
type = "Nei Xian";
break;
case 2:
type = "Zuo Xi";
break;
case 3:
type = "Lu Yin";
break;
case 20:
type = "-1";
break;
default:
type = "-1";
break;
}
printf("%s-----------",type);
}
scanChanel(int ch,int nstate)
{
if(nstate==7)//挂起
{
printf("------nstate=7--------");
switch(chanelState[ch])
{
case CHECK_PLAY_COME:
printf("------chanelState=4--------");
SsmStopPlayFileList(ch);
currentState="Stop Play Welcome Word!";
break;
case CHECK_PLAY_SELECT:
case CHECK_PLAY_BYEBYE:
printf("------chanelState=6,13,12,8--------");
SsmStopPlayIndex(ch);
currentState="Stop Index Play";
break;
}
}
printf("===chanelState:%d===",chanelState[ch]);
switch(chanelState[ch])
{
case IDLE:
printf("------chanelState=IDLE--------");
if(nstate==2) //wai xian zhen ling
{
printf("------nstate=2--------");
SsmPickup(ch);
chanelState[ch]=WALT_CONNECT;
}
break;
case WALT_CONNECT:
printf("------chanelState=2--------");
printf("----nstate:%d-----",nstate);
if(nstate==3)//tonghua zhaungtai
{
chanelState[ch]=PLAY_WELCOME;
}
currentState="Play Welcome";
break;
case PLAY_WELCOME:
printf("------chanelState=3--------");
SsmClearFileList(ch);
if((SsmAddToFileList(ch,"demovoc/Welcom1.voc",6,0,-1)==-1 || SsmAddToFileList(ch,"demovoc/Welcom2.voc",6,0,-1)==-1) )
{
resetCH(ch);
}
else if(SsmPlayFileList(ch) == -1)
{
resetCH(ch);
}
else
{
chanelState[ch]=CHECK_PLAY_COME;
}
currentState="Play Select Alt Voc";
break;
case CHECK_PLAY_COME:
printf("------chanelState=4--------");
if( SsmCheckPlay(ch) > 0) //停止播放Welcome
chanelState[ch] = PLAY_SELECT;
currentState="end of playing welcom";
break;
case PLAY_SELECT:
printf("------chanelState=5--------");
SsmSetDtmfStopPlay(ch,1);
if(SsmPlayIndexString(ch,"Select") == -1)
{
resetCH(ch);
}
else
{
SsmClearRxDtmfBuf(ch);
chanelState[ch] = CHECK_PLAY_SELECT;
}
currentState="Select Key!";
break;
case CHECK_PLAY_SELECT:
printf("------chanelState=12--------");
if(SsmGetRxDtmfLen(ch) >= 1 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[100];
int tt=SsmGet1stDtmf(ch, temp);
SsmClearRxDtmfBuf(ch);
switch(temp[0])
{
case '1': //DTMF=1: 验证
if(SsmPlayIndexString(ch,"PlayIDCard") == -1)
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP1_CHECK_IDCARD;
}
break;
case '2': //DTMF=2: 修改密码
if(SsmPlayIndexString(ch,"Step2PlayIDCard") == -1)
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP2_CHECK_IDCARD;
}
break ;
case '3': //DTMF=3:挂失
if(SsmPlayIndexString(ch,"Step3PlayIDCard") == -1)
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP3_CHECK_IDCARD;
}
break;
case '0': //DTMF=0: end of service,play "Byebye"
currentState="Exit";
if (SsmPlayIndexString(ch, "Byebye" )== -1 )
{
resetCH(ch);
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
break;
default:
break;
}
}
break;
/**
*************************************查询身份证的有效性
*/
case STEP1_CHECK_IDCARD://验证输入的IDCard
if(SsmGetRxDtmfLen(ch) >= 19 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[19];
int tt=SsmGetDtmfStr(ch, temp);
SsmClearRxDtmfBuf(ch);
for(i=0;i<17;i++)
{
if(!isdigit(temp[i]))
{
printf("NOT IS NUMBER %dKKK/n",temp[i]);
if (SsmPlayIndexString(ch, "InputError,PlayIDCard" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP1_CHECK_IDCARD;
}
}
}
if(!(isdigit(temp[17]) || temp[17]=='X') || temp[18]!='#')
{
if (SsmPlayIndexString(ch, "InputError,PlayIDCard" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP1_CHECK_IDCARD;
}
}
idCardPass[ch].idCard=temp;
chanelState[ch]=STEP1_PLAY_IDCARD_PASS;
currentState="GEt ID CARD";
}
break;
case STEP1_PLAY_PASS://播放输入密码
if (SsmPlayIndexString(ch, "PlayIDCardPass" )== -1 )
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP1_CHECK_PASS;
}
break;
case STEP1_CHECK_PASS://验证密码
if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[7];
int tt=SsmGetDtmfStr(ch, temp);
SsmClearRxDtmfBuf(ch);
for(i=0;i<6;i++)
{
if(!isdigit(temp[i]))
{
if (SsmPlayIndexString(ch, "InputError,PlayIDCardPass" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP1_CHECK_PASS;
}
}
}
if(temp[6]!='#')
{
if (SsmPlayIndexString(ch, "InputError,PlayIDCardPass" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP1_CHECK_PASS;
}
}
idCardPass[ch].pass=temp;
chanelState[ch] = STEP1_CHECK_USER;
currentState="this channel is not playing index now";
}
break ;
case STEP1_CHECK_USER://验证IDCard和Pass
if(checkIDCard(idCardPass[ch].idCard,idCardPass[ch].pass)==0)
{
if (SsmPlayIndexString(ch, "IDCardSucceed" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
else
{
if (SsmPlayIndexString(ch, "IDCardFailed" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
break;
/**
*************************************修改密码********
*/
case STEP2_CHECK_IDCARD://验证输入的IDCard
if(SsmGetRxDtmfLen(ch) >= 19 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[19];
int tt=SsmGetDtmfStr(ch, temp);
SsmClearRxDtmfBuf(ch);
for(i=0;i<17;i++)
{
if(!isdigit(temp[i]))
{
printf("NOT IS NUMBER %dKKK/n",temp[i]);
if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCard" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP2_CHECK_IDCARD;
}
}
}
if(!(isdigit(temp[17]) || temp[17]=='X') || temp[18]!='#')
{
if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCard" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP2_CHECK_IDCARD;
}
}
idCardPass[ch].idCard=temp;
chanelState[ch]=STEP2_PLAY_PASS;
currentState="GEt ID CARD";
}
break;
case STEP2_PLAY_PASS://播放输入密码
if (SsmPlayIndexString(ch, "Step2PlayIDCardPass" )== -1 )
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP2_CHECK_PASS;
}
break;
case STEP2_CHECK_PASS://验证密码
if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[7];
int tt=SsmGetDtmfStr(ch, temp);
SsmClearRxDtmfBuf(ch);
for(i=0;i<6;i++)
{
if(!isdigit(temp[i]))
{
if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP2_CHECK_PASS;
}
}
}
if(temp[6]!='#')
{
if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP2_CHECK_PASS;
}
}
idCardPass[ch].pass=temp;
chanelState[ch] = STEP2_PLAY_PASS2;
currentState="this channel is not playing index now";
}
break ;
case STEP2_PLAY_PASS2://再次播放输入密码
if (SsmPlayIndexString(ch, "Step2PlayIDCardPass2" )== -1 )
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP2_CHECK_PASS2;
}
break;
case STEP2_CHECK_PASS2://再次验证密码
if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[7];
int tt=SsmGetDtmfStr(ch, temp);
SsmClearRxDtmfBuf(ch);
for(i=0;i<6;i++)
{
if(!isdigit(temp[i]))
{
if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass2" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP2_CHECK_PASS2;
}
}
}
if(temp[6]!='#')
{
if (SsmPlayIndexString(ch, "InputError,Step2PlayIDCardPass2" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP2_CHECK_PASS2;
}
}
//验证两次新密码是否一样
if(idCardPass[ch].pass==temp)
{
chanelState[ch] = STEP2_CHECK_USER;
}
else
{
if (SsmPlayIndexString(ch, "TwoNewPassNotSame" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_SELECT;//返回到提示音
}
}
currentState="this channel is not playing index now";
}
break ;
case STEP2_CHECK_USER://更新密码
if(changePassToDB(idCardPass[ch].idCard,idCardPass[ch].pass)==0)
{
if (SsmPlayIndexString(ch, "ChangePassSucceed" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
else
{
if (SsmPlayIndexString(ch, "ChangePassFailed" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
break;
/**
*************************************挂失********
*/
case STEP3_CHECK_IDCARD://验证输入的IDCard
if(SsmGetRxDtmfLen(ch) >= 19 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[19];
int tt=SsmGetDtmfStr(ch, temp);
SsmClearRxDtmfBuf(ch);
for(i=0;i<17;i++)
{
if(!isdigit(temp[i]))
{
if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCard" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP2_CHECK_IDCARD;
}
}
}
if(!(isdigit(temp[17]) || temp[17]=='X') || temp[18]!='#')
{
if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCard" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP3_CHECK_IDCARD;
}
}
idCardPass[ch].idCard=temp;
chanelState[ch]=STEP3_PLAY_PASS;
currentState="GEt ID CARD";
}
break;
case STEP3_PLAY_PASS://播放输入密码
if (SsmPlayIndexString(ch, "Step3PlayIDCardPass" )== -1 )
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP3_CHECK_PASS;
}
break;
case STEP3_CHECK_PASS://验证密码
if(SsmGetRxDtmfLen(ch) >= 7 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[7];
int tt=SsmGetDtmfStr(ch, temp);
SsmClearRxDtmfBuf(ch);
for(i=0;i<6;i++)
{
if(!isdigit(temp[i]))
{
if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCardPass" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP3_CHECK_PASS;
}
}
}
if(temp[6]!='#')
{
if (SsmPlayIndexString(ch, "InputError,Step3PlayIDCardPass" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=STEP3_CHECK_PASS;
}
}
idCardPass[ch].pass=temp;
chanelState[ch] = STEP3_PLAY_LOSS;
currentState="this channel is not playing index now";
}
break ;
case STEP3_PLAY_LOSS://播放挂失
if (SsmPlayIndexString(ch, "Step3PlayLoss" )== -1 )
{
resetCH(ch);
}
else
{
chanelState[ch] =STEP3_CHECK_LOSS;
}
break;
case STEP3_CHECK_LOSS:
if(SsmGetRxDtmfLen(ch) >= 1 && (SsmCheckPlay(ch) == 2 || SsmCheckPlay(ch) == 1))
{
char temp[100];
int tt=SsmGet1stDtmf(ch, temp);
SsmClearRxDtmfBuf(ch);
switch(temp[0])
{
case '1': //DTMF=1: 挂失
if(changeLossToDB(idCardPass[ch].idCard,1))//挂失成功
{
if (SsmPlayIndexString(ch, "Step3LossSucceed" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
else//挂失失败
{
if (SsmPlayIndexString(ch, "Step3LossFailed" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
break;
case '2': //DTMF=2: 解除挂失
if(changeLossToDB(idCardPass[ch].idCard,0))//解除挂失成功
{
if (SsmPlayIndexString(ch, "Step3ReleaseLossSucceed" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
else//解除挂失失败
{
if (SsmPlayIndexString(ch, "Step3ReleaseLossFalied" )== -1 )
{
resetCH(ch);
break;
}
else
{
chanelState[ch]=CHECK_PLAY_BYEBYE;
}
}
break;
default:
break;
}
}
break;
/**
*************************************离开
*/
case CHECK_PLAY_BYEBYE://再见
printf("------chanelState=8--------");
if(SsmCheckPlay(ch) > 0)
{
SsmHangup(ch);
chanelState[ch] =IDLE;
}
break ;
default:
break;
}
printf("%s/n",currentState);
}
/*出错时重设通道*/
resetCH(int ch)
{
SsmHangup(ch);
puts(SsmGetLastErrMsgA());
chanelState[ch] = IDLE;
}
/*验证IDCard的有效性*/
int checkIDCard(char *idCard,char *pass)
{
query = "select * from userdata where IDCard='" + idCard + "' and IDPass='" + pass + "'";
t=mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if(t)
{
printf("Error making query: %s/n",mysql_error(&mysql));
}
else
{
printf("[%s]made ........../n",query);
}
res=mysql_store_result(&mysql);
int reValue=mysql_num_rows(res);
mysql_free_result(res);
mysql_close(&mysql);
if(reValue>0)
{
return 0;
}
else
{
return -1;//-1或0
}
}
/*修改密码*/
int changePassToDB(char *idCard,char *pass)
{
int reValue=0;
query="update userdata set idpass='" + pass + "' where idCard='" + idCard + "'";
t=mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if(t)
{
printf("Error making query:%s/n",mysql_error(&mysql));
reValue=-1;
}
else
{
printf("[%s] made......../n",query);
}
mysql_close(&mysql);
return reValue;
}
/*挂失与解除挂失*/
int changeLossToDB(char *idCard,int loss)
{
int reValue=0;
query="update userdata set LossFlag=" + loss + " where idCard='" + idCard + "'";
t=mysql_real_query(&mysql,query,(unsigned int) strlen(query));
if(t)
{
printf("Error making query:%s/n",mysql_error(&mysql));
reValue=-1;
}
else
{
printf("[%s] made......../n",query);
}
mysql_close(&mysql);
return reValue;
}