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

📄 kdmcard.cpp

📁 磁卡读写器编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//'32H 读第二轨  '33H 读第三轨  '35H 读第1,2,3轨  '36H 清读/写缓冲区
    sprintf(chSend, "%cC65%c", 0x02, 0x03);
    bcc = KDM4787_BCC(chSend, strlen(chSend));
    sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
    if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
	{
        return _ERR_KDE_MAGREAD1;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return _ERR_KDE_MAGREAD1;
    }
    if(gCom.chRcvbuf[0]!=0x06)
		return _ERR_KDE_MAGREAD1;

    memset(chSend, '\0', 256);
    ENQ(chSend);
    if(!gCom.AsynSendData(chSend,strlen(chSend)))
	{
        return _ERR_KDE_MAGREAD2;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return _ERR_KDE_MAGREAD2;
    }
    j = 0;
    for (i=0;i<6;i++)
    {
        if(gCom.chRcvbuf[i]!=0x02)
        {
            chState[j] = gCom.chRcvbuf[i];
            j++;
        }
    }

	if(chState[0]!='P')
	{
		TraceDebug("state is not [P]!", 0);
        return _ERR_KDE_STATUS;
	}
    *Trk1='\0';
    for (;i<gCom.nRcvlen;i++)
    {
        if(gCom.chRcvbuf[i]==0x00)
            break;
        *Trk1 = gCom.chRcvbuf[i];
        Trk1++;
    }
    *Trk1 = 0x00;
    i++;
    *Trk2='\0';
    for (;i<gCom.nRcvlen;i++)
    {
        if(gCom.chRcvbuf[i]==0x00)
            break;
        *Trk2 = gCom.chRcvbuf[i];
        Trk2++;
    }
    *Trk2 = 0x00;
    i++;
    *Trk3='\0';
    for (;i<gCom.nRcvlen;i++)
    {
        if(gCom.chRcvbuf[i]==0x03)
            break;
        *Trk3 = gCom.chRcvbuf[i];
        Trk3++;
    }
    *Trk3 = 0x00;

    return _DEV_OK;
}


//Mode 0,前面退卡,  1,没收卡,后面吞卡
short CKDMCard::EjectCard(char Mode)
{
    char chSend[256], chSend1[256], chState[20];
    int  bcc, i ,j;
	int  takebackpermit;
    gTimeOut = 1;

    memset(chSend, '\0', 256);
    memset(chSend1, '\0', 256);
	memset(chState, '\0', 20);
	
	int  EjectTimes=0;

EJECT:
//退卡命令' 'C' 33H pm (0x30'从前面,0x31'从后面,0x32'不退卡)
	if(Mode == 1)
	{
		takebackpermit = GetPrivateProfileInt("KDE4787","TakeCardBack", 1, "KDDEV.INI");
		if(takebackpermit != 1)
		{
			return _ERR_KDE_NOT_PERMIT_BACK;
		}
	    sprintf(chSend, "%cC31%c", 0x02, 0x03);
	}
	else
	    sprintf(chSend, "%cC30%c", 0x02, 0x03);

    bcc = KDM4787_BCC(chSend, strlen(chSend));
    sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
    if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
	{
		gCom.AsynClose();
		TraceDebug("Eject card fail1!", 0);
		return _ERR_KDE_EJECT1;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
		gCom.AsynClose();
        return _ERR_KDE_EJECT1;
    }
    if(gCom.chRcvbuf[0]!=0x06)
	{
		TraceDebug("Eject card fail3!", 0);
		EjectTimes++;
		if(EjectTimes<2)
		{
		//	ResetKDM();    //11月22日晚修改
			Sleep((DWORD)100);
			goto EJECT;
		}
		gCom.AsynClose();     //有可能产生溢出
		return _ERR_KDE_EJECT1;
    }
    memset(chSend, '\0', 256);
    ENQ(chSend);
    if(!gCom.AsynSendData(chSend,strlen(chSend)))
	{
		gCom.AsynClose();
		TraceDebug("Eject card fail4!", 0);
        return _ERR_KDE_EJECT2;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
		gCom.AsynClose();
		TraceDebug("Eject card fail5!", 0);            //11月21日改,可能会出现弹卡失败,从此退出程序,却没关串口
        return _ERR_KDE_EJECT2;
    }

    j = 0;
    for (i=0;i<gCom.nRcvlen;i++)
    {
        if(gCom.chRcvbuf[i]!=0x02)
        {
            if(gCom.chRcvbuf[i]==0x03)
                break;
            chState[j] = gCom.chRcvbuf[i];
            j++;
        }
    }

	gCom.AsynClose();/////

    if(chState[0] != 'P')
		return _ERR_KDE_STATUS;
	if((chState[4] != '1')&&(chState[4] != '2'))
		return _KDE_NOCARD;
	else if(chState[4]=='1')
		return _KDE_CARD_ATGATE;
    return _KDE_CARD_INSIDE;
}

short CKDMCard::IcCardPower(short PowerMode, char *ATR)
{
    char chSend[256],chSend1[256],State[20];
    int  bcc, i;

    memset(chSend, '\0', 256);
    memset(chSend1,'\0', 256);
	memset(State, '\0', 20);
//IC卡上下电指令 ' 'C' 38H pm   'pm '30H 下电 '31H 上电
    sprintf(chSend, "%cC8%d%c", 0x02, PowerMode, 0x03);
    bcc = KDM4787_BCC(chSend, strlen(chSend));
    sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
    if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
	{
        return _ERR_KDE_ICPOWER1;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return _ERR_KDE_ICPOWER1;
    }
    if(gCom.chRcvbuf[0]!=0x06)
        return _ERR_KDE_ICPOWER1;

    memset(chSend, '\0', 256);
    ENQ(chSend);
    if(!gCom.AsynSendData(chSend,strlen(chSend)))
	{
        return _ERR_KDE_ICPOWER2;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return _ERR_KDE_ICPOWER2;
    }

    memcpy(State,gCom.chRcvbuf,6);
    State[6]='\0';
	if(State[1]!=0x50)
	{
        return _ERR_KDE_ICPOWER2;
    }
    *ATR='\0';
    for (i=6;i<gCom.nRcvlen;i++)
    {
        if(gCom.chRcvbuf[i]==0x03)
            break;
        *ATR = gCom.chRcvbuf[i];
        ATR++;
    }
    *ATR = '\0';
    
    return _DEV_OK;
}

short CKDMCard::SendICCommand(char *ICSendbuf, char *ICRecvbuf, char *ICSW)
{
    char   chRcvData[128],chSend[256];
	char chIns[3];

	memset(chSend,'\0',128);
    PacketStr(ICSendbuf, chSend);

	memcpy(chIns,&chSend[6],2);//指令
	chIns[2]='\0';
    //发送CPU指令
	if(!gCom.AsynSendData(chSend, strlen(chSend)))
	{
        return _ERR_KDE_ICCOMM1;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return _ERR_KDE_ICCOMM1;
    }
    if(gCom.chRcvbuf[0]!=0x06)
        return _ERR_KDE_ICCOMM1;

    memset(chSend, '\0', 128);
    ENQ(chSend);
    //发送05 0d
	if(!gCom.AsynSendData(chSend,strlen(chSend)))
	{
        return _ERR_KDE_ICCOMM2;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return _ERR_KDE_ICCOMM2;
    }

    short i, k=0,j=0,curr;
	short nDataLen;
    i = -1;
    for (i=0; i<gCom.nRcvlen; i++)
		if(gCom.chRcvbuf[i] == 0x02)
			break;
    if(i==gCom.nRcvlen)
		return _ERR_KDE_ICCOMM2;

	i++;
    if(gCom.chRcvbuf[i]!=0x50)
		return _ERR_KDE_ICCOMM2;        //接收错误数据
    i+=3;

	if(strncmp(&gCom.chRcvbuf[i],"02",2)!=0)
		return _ERR_KDE_ICCOMM2;        //无卡错误返回
    i+=2;
	curr = i;   //有效数据位置

    memset(chRcvData, '\0', 128);
	for(i=curr;i<gCom.nRcvlen;i++)
	{
		if(gCom.chRcvbuf[i]==0x03)
			break;
		chRcvData[j] = gCom.chRcvbuf[i];
		j++;
	}
	memset(ICSW, '\0', 5);
	memset(pICSW,'\0',5);
	memset(pICRCV,'\0',256);

    nDataLen = strlen(chRcvData);
    if(nDataLen==4)
	{
		memcpy(ICSW,chRcvData,4);
		memcpy(pICSW,chRcvData,4);
	}
    else
	{
		if(memcmp(chIns,&chRcvData[0],2)==0)
		{
		    memcpy(ICRecvbuf,&chRcvData[2],nDataLen-6);  
		    memcpy(ICSW,&chRcvData[nDataLen-4],4);  //求出SW码
    		memcpy(pICRCV,&chRcvData[2],nDataLen-6);  
	        memcpy(pICSW,&chRcvData[nDataLen-4],4);  //求出SW码
		}
		else
		{
		    memcpy(ICRecvbuf,&chRcvData[0],nDataLen-4);  
		    memcpy(ICSW,&chRcvData[nDataLen-4],4);  //求出SW码
    		memcpy(pICRCV,&chRcvData[0],nDataLen-4);  
	        memcpy(pICSW,&chRcvData[nDataLen-4],4);  //求出SW码
		}
    }
    return 0;
}
void CKDMCard::PacketStr(char *InStr, char *OutStr)
{
    char chSend[128];
    short nLen,ret;
   
	memset(chSend,'\0',128);
    wsprintf(chSend,"%cC90%s%c",0x02,InStr,0x03);

    nLen = strlen(chSend);
    ret = KDM4787_BCC(chSend, strlen(chSend));
	
    wsprintf(OutStr,"%s%c%c",chSend,ret,0x0d);
}

short CKDMCard::CloseDoor()
{
    char chSend[256], chSend1[256];
    int  bcc, i, num = 0;
	char State[128];
	short ret;

	ret = gOpenKDMCom();
	if(ret == _NO_DEVICE)
		return _NO_DEVICE;
	else if(ret)
	{
		gCom.AsynClose();
		return _ERR_KDE;
	}


    memset(chSend, '\0', 256);
    memset(chSend1, '\0', 256);
//退卡命令' 'C' 33H pm (0x30'从前面,0x31'从后面,0x32'不退卡)
    sprintf(chSend, "%cC%c1%c", 0x02,0x3a, 0x03);
    bcc = KDM4787_BCC(chSend, strlen(chSend));
    sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
    if(!gCom.AsynSendData(chSend1, strlen(chSend1)))
	{
        return -1;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return -1;
    }
 
    if(gCom.chRcvbuf[0]!=0x06)
        return -2;

    memset(chSend, '\0', 256);
    ENQ(chSend);
    if(!gCom.AsynSendData(chSend,strlen(chSend)))
	{
        return -1;
    }
    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return -1;
    }

    *State = 0x00;
    for (i=0;i<gCom.nRcvlen;i++)
    {
        if(gCom.chRcvbuf[i]!=0x02)
        {
            if(gCom.chRcvbuf[i]==0x03)
                break;
            State[i] = gCom.chRcvbuf[i];
        }
    }
    *State = 0x00;
	gCom.AsynClose();/////

    return 0;


}


short CKDMCard::ResetKDM()
{
    char chSend[128] ,chSend1[128],chState[20];
    int  i=0, bcc;
    memset(chSend, '\0', 128);
    memset(chSend1,'\0', 128);
	memset(chState, '\0', 20);

   //复位命令  DLE EOT

    sprintf(chSend,"%cC%c%c%c",0x02, 0x10, 0x04, 0x03);
    bcc = KDM4787_BCC(chSend, strlen(chSend));
    sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
    gCom.AsynSendData(chSend1,strlen(chSend1));

    if(!gCom.sReadByEndChar(0x0d, gTimeOut))
	{
        return _ERR_KDE_RESET1;
    }
    if(gCom.chRcvbuf[0]!=0x10 || gCom.chRcvbuf[1]!=0x04)
        return _ERR_KDE_RESET1;

	//Clear Memory  36h 36h
    memset(chSend, '\0', 128);
    memset(chSend1,'\0', 128);

    sprintf(chSend,"%cC%c%c%c",0x02, 0x36, 0x36, 0x03);
    bcc = KDM4787_BCC(chSend, strlen(chSend));
    sprintf(chSend1, "%s%c%c", chSend, bcc, 0x0D);
    gCom.AsynSendData(chSend1,strlen(chSend1));

	TraceDebug("Reset  KDE  OK!", 0);
 	return _DEV_OK;
}

⌨️ 快捷键说明

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