键初始化及使用步骤:
1.设置PINpad参数 Pinpad_SetPPType()
2.检测Pinpad是否连接正常 Pinpad_Connect()或者Pinpad_connect2()
3.下载主密钥到index0, Pinpad_LoadMasterKey()
4.检测0号主密钥是否存在,Pinpad_Checkkey(0);
5.选择0号主密钥,输入用户密码 Pinpad_GetPin();
在QMF项目里面,EvdIFunc_OnCallFunc()里面的 VMAC_InitDevices();里面的Device_Init_Pinpad()函数,对密码键盘进行了初始化
void Device_Init_Pinpad(Term_Config *T_Config)
{
/*设置内外置类型 -加密模式*/
switch(T_Config->mfixPrm.PP_In_Ext)
{
case INTERNAL_PINPAD:
Pinpad_SetPPType(INTERNAL_PINPAD, T_Config->mfixPrm .PP_DesType, CLEAR_FORMAT);
break;
case EXTERNAL_PINPAD:
Pinpad_SetPPType(EXTERNAL_PINPAD, T_Config->mfixPrm .PP_DesType, CLEAR_FORMAT);
break;
default:
return;
}
//if (T_Config->mfixPrm.PP_In_Ext == EXTERNAL_PINPAD) //无论内置外置都需要Pinpad_Connect()
{
/*检测PINpad是否正常连接
MmiUtil_DispChinese("检测密码键盘",1,3);*/
Pinpad_Close();
if(Pinpad_Connect() != VS_SUCCESS)
{
MmiUtil_DispChinese("检测密码键盘失败", 1, 3);
SVC_WAIT(2000);
}
else
{
MmiUtil_DispChinese("检测密码键盘成功", 1, 3);
}
}
MmiUtil_Reset();
return;
}
在mobile里面
EvdIFunc_OnActive()函数里面的 VMAC_InitDevices(0);函数里面的
open_pinpad(flag);函数对密码键盘进行了初始化
/***************************************************************************
** pinpad_open() -- open the pin pad communications port.
***************************************************************************/
void open_pinpad(int flag)
{
// flag == 0
char buf[20];
int type ;
NF_Get_Env("#ENCYPT", buf, 1); //获得加密算法的类型
if(buf[0] == '1')
pos_cfg.tdes = 1; //3//3DES
else
pos_cfg.tdes = 0; //DES
type = MmiUtil_GetTerminalType(); //获取设备型号
if(type == _VX610 || type == _VX670 || type == _VX680 || type == _VX680C || type == _VX810 || type == _VX820)
{
NF_Put_Env("#PINPAD", "0", 1); //把密码键盘类型改为外置
}
NF_Get_Env("#PINPAD", buf, 1);
pos_cfg.pinpad_type = (buf[0] == '1');
/*设置键盘参数,这个必须有*/
if(pos_cfg.tdes) //如果3DES 加密
{
/*设置PINpad参数*/
if(pos_cfg.pinpad_type == 1)
Pinpad_SetPPType(EXTERNAL_PINPAD, PP222_3DES_MODE, CLEAR_FORMAT);
else// 执行内置键盘
Pinpad_SetPPType(INTERNAL_PINPAD, PP222_3DES_MODE, CLEAR_FORMAT);
}
else //如果DES加密
{
/*设置PINpad参数*/
if(pos_cfg.pinpad_type == 1)
Pinpad_SetPPType(EXTERNAL_PINPAD, PP222_DES_MODE, CLEAR_FORMAT);
else
Pinpad_SetPPType(INTERNAL_PINPAD, PP222_DES_MODE, CLEAR_FORMAT);
}
/*检测PINpad是否正常连接*/
if(flag) //flag == 0 这一步不执行
{
if(pos_cfg.pinpad_type == 1)
disp_msg3("检测外置密码键盘");
else
disp_msg3("检测内置密码键盘");
}
if(pos_cfg.pinpad_type == 1) //执行这个
{
MmiUtil_UserClr(LINE2);
MmiUtil_DisplayLine((char*)"测试密码键盘2", LINE2);
wait_key(60);
buf[NF_Get_Env("#PINPORT", buf, sizeof(buf))] = 0; //加了一个结尾/0
if(strlen(buf) <= 0) //如果没有默认com1就设置为com2
strcpy(buf, "/dev/com2");
if(Pinpad_Connect2(buf) != VS_SUCCESS) //Iinpad_Connect2 检查有没有连接
{
if(flag)
{
disp_msg3("密码键盘检测失败");
SVC_WAIT(2000);
}
}
else if(flag)
disp_msg3("密码键盘检测OK");
} // end if(pos_cfg)
else
{
MmiUtil_UserClr(LINE2);
MmiUtil_DisplayLine((char*)"测试密码键盘1", LINE2);
wait_key(60);
if(Pinpad_Connect() != VS_SUCCESS)
{
if(flag)
{
disp_msg3("密码键盘检测失败");
SVC_WAIT(2000);
}
}
else if(flag)
disp_msg3("密码键盘检测OK");
}
}
在签到的时候
会重新打开密码键盘,并检测主密钥是否存在
然后
在消费的时候
先主密钥检测是否存在,然后通过Pinpad_GetPin获得密码,
在退货的时候获取主管密码,没有进行主密钥检测
if(MmiUtil_InputPWD(LINE2, (char*)Disp, (char*)tmp, passwd_min_len, passwd_len, RIGHT_JST) < 0)
获取输入密码