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

📄 testrfcarddlg.cpp

📁 详细的RF非接触卡测试源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    }
    if(0x0C == (nFlag&0x0C))
    {//采用3DES加密
        //取密钥,需要进行密钥管理,暂时采用简单的方法
        memcpy(pszKey,"HengShan..gz..cn",16);
        //数据进行8的边界对齐,需要后补0
        nLength = 8-nMessageLength%8;
        memset(pszMessage+nMessageLength,0x00,nLength);
        for(nCount=0;nCount<(nMessageLength+nLength)/8;nCount++)
        {
            //OIL_3DES(pszMessage+nCount*8,pszMessage+nCount*8,pszKey,DES_ENCRYPT);
        }
        return nMessageLength+nLength;
    }
    return 0;
}
//---------------------------------------------------------------------------
unsigned int CTestRFCardDlg::DecryptMessage(unsigned char* pszMessage,unsigned char nMessageLength,unsigned char nFlag)
{
    unsigned char nCount,nIndex;
    unsigned char pszKey[16];
    if(0x00 == (nFlag&0x0C))
    {//简单取反的方式
        for(nCount=0;nCount<nMessageLength;nCount++)
            pszMessage[nCount] = ~pszMessage[nCount];
        return nMessageLength;
    }
    if(0x04 == (nFlag&0x0C))
    {//简单和基础密钥异或的方式进行解密数据
        //取密钥,需要进行密钥管理,暂时采用简单的方法
        memcpy(pszKey,"HengShan",8);
        //数据一定是8的边界对齐
        for(nCount=0;nCount<nMessageLength/8;nCount++)
        {
            for(nIndex=0;nIndex<8;nIndex++)
            {
                pszMessage[nCount*8+nIndex] = pszMessage[nCount*8+nIndex]^pszKey[nIndex];
            }
        }
        return nMessageLength;
    }
    if(0x08 == (nFlag&0x0C))
    {//采用DES加密
        //取密钥,需要进行密钥管理,暂时采用简单的方法
        memcpy(pszKey,"HengShan",8);
        for(nCount=0;nCount<nMessageLength/8;nCount++)
        {
            //OIL_DES(pszMessage+nCount*8,pszMessage+nCount*8,pszKey,DES_DECRYPT);
        }
        return nMessageLength;
    }
    if(0x0C == (nFlag&0x0C))
    {//采用3DES加密
        //取密钥,需要进行密钥管理,暂时采用简单的方法
        memcpy(pszKey,"HengShan..gz..cn",16);
        for(nCount=0;nCount<nMessageLength/8;nCount++)
        {
            //OIL_3DES(pszMessage+nCount*8,pszMessage+nCount*8,pszKey,DES_DECRYPT);
        }
        return nMessageLength;
    }
    return 0;
}
//---------------------------------------------------------------------------
unsigned char CTestRFCardDlg::SSI_BeepReader(HANDLE handlePort)
{
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_BEEP_ON; 
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,1))break;
	}
	Sleep(200);
	if(COMM_SEND_TRY_TIMES == nCount) return 0;
	return 0;
}
unsigned char CTestRFCardDlg::SSI_LedReader(HANDLE handlePort,unsigned char nLedIndex,unsigned char nFlag)
{
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_LED_ON; 
	pszBuffer[1] = nLedIndex; 
	pszBuffer[2] = nFlag; 
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,3))break;
	}
	Sleep(200);
	if(COMM_SEND_TRY_TIMES == nCount) return 0;
	return 0;
}

/*
功能:查询是否有卡在天线区
参数:nMode:查询方式 缺省可以置 0;系统自动以QUERY_ALL方式查询 
			0x52 为QUERY_ALL;
			0x26 为QUERY_IDLE
	  pszData:接收数据缓冲,格式:第一个字节为状态 
	          其后的字节为卡类型 0x01 Mifare Light 0x04 Mifare Ultra Light
	                             0x08 Mifare Standard S50 0x10 Mifare Plus S70
	          后面两个字节为卡片的ATQ
	          后面的四个字节为查到的卡号
	          如果没有查到卡则只有状态位
返回:返回的数据长度,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_QueryRFCard(HANDLE handlePort,unsigned char nMode,unsigned char *pszData)
{
	unsigned char pszBuffer[256];
	unsigned char nLength;

	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_QUERY_CARD; 
	pszBuffer[1] = nMode;
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,2))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return 0;
	nLength = HOST_GetMessage(handlePort,0,pszBuffer);
	if(SHTP_ERR != nLength)
	{
		memcpy(pszData,pszBuffer+1,nLength-1);
		memcpy(g_pszASN,pszBuffer+1,nLength-1);
		return nLength-1;
	}
	return 0;
}
/*
功能:认证卡片的密钥
参数:nKeyType:密钥类型
			   0x60 为A密钥
			   0x61 为B密钥
	  nSector :为认证密钥的扇区(0~15)
	  pszKey  :提交的密钥(6个字节)
返回:0 成功 1 失败,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_AuthenRFCard(HANDLE handlePort,unsigned char nKeyType,unsigned char nSector,unsigned char *pszKey)
{
	unsigned char nFlag;
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_AUTHEN_CARD;
	pszBuffer[1] = nKeyType;
	pszBuffer[2] = nSector;
	memcpy(pszBuffer+3,pszKey,6);
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,9))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	if(SHTP_ERR != HOST_GetMessage(handlePort,0,pszBuffer))
		nFlag = pszBuffer[1];
	else
		nFlag = COMM_RECV_ERROR;
	return nFlag;
}
/*
功能:读卡
参数:nSector :为读的扇区(0~15) 
	  nBlock  :为要读的块(0~3)
	  pszData:接收数据缓冲,格式:第一个字节为状态 其后的16个字节为数据
	          如果读失败则只有状态位
返回:返回的数据长度,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_ReadRFCard(HANDLE handlePort,unsigned char nSector,unsigned char nBlock,unsigned char *pszData )
{
	unsigned char nLength;
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_READ_CARD;
	pszBuffer[1] = nSector;
	pszBuffer[2] = nBlock;
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,3))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	nLength = HOST_GetMessage(handlePort,0,pszBuffer);
	if(SHTP_ERR != nLength)
	{
		memcpy(pszData,pszBuffer+1,nLength-1);
	}
	else
		return COMM_RECV_ERROR;

	return nLength-1; 
}

/*
功能:写卡
参数:nSector :为要写的扇区(0~15) 
	  nBlock  :为要写的块(0~3)
	  pszData :为要写的数据
返回:0 成功 1 失败,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_WriteRFCard(HANDLE handlePort,unsigned char nSector,unsigned char nBlock,unsigned char *pszData )
{
	unsigned char nFlag;
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_WRITE_CARD;
	pszBuffer[1] = nSector;
	pszBuffer[2] = nBlock;
	memcpy(pszBuffer+3,pszData,16);
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,19))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	if(SHTP_ERR != HOST_GetMessage(handlePort,0,pszBuffer))
		nFlag = pszBuffer[1];
	else
		nFlag = COMM_RECV_ERROR;
	return nFlag;
}

/*
功能:读卡余额
参数:nSector :扇区(0~15) 
	  nBlock  :块(0~3)
	  pszData :金额缓冲(高位在前)
返回:0 成功 1 失败,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_ReadRFValue(HANDLE handlePort,unsigned char nSector,unsigned char nBlock,unsigned char *pszData )
{
	unsigned char nLength;
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_READ_VALUE;
	pszBuffer[1] = nSector;
	pszBuffer[2] = nBlock;
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,3))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	nLength = HOST_GetMessage(handlePort,0,pszBuffer);
	if(SHTP_ERR != nLength)
	{
		if(0x00 == pszBuffer[1])
		{
			memcpy(pszData,pszBuffer+2,nLength-1);
			return 0;
		}
		else
			return 1;
	}
	else
		return COMM_RECV_ERROR;
}

/*
功能:初始卡片金额
参数:nSector :扇区(0~15) 
	  nBlock  :块(0~3)
	  pszData :金额缓冲(高位在前)
返回:0 成功 1 失败,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_InitRFValue(HANDLE handlePort,unsigned char nSector,unsigned char nBlock,unsigned char *pszData )
{
	unsigned char nFlag;
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_INIT_VALUE;
	pszBuffer[1] = nSector;
	pszBuffer[2] = nBlock;
	memcpy(pszBuffer+3,pszData,4);
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,7))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	if(SHTP_ERR != HOST_GetMessage(handlePort,0,pszBuffer))
		nFlag = pszBuffer[1];
	else
		nFlag = COMM_RECV_ERROR;
	return nFlag;
}

/*
功能:卡片充值
参数:nSector :扇区(0~15) 
	  nBlock  :块(0~3)
	  pszData :金额缓冲(高位在前)
返回:0 成功 1 失败,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_IncrmentRFValue(HANDLE handlePort,unsigned char nSector,unsigned char nBlock,unsigned char *pszData )
{
	unsigned char nFlag;
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_INCRMENT_VALUE;
	pszBuffer[1] = nSector;
	pszBuffer[2] = nBlock;
	memcpy(pszBuffer+3,pszData,4);
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,7))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	if(SHTP_ERR != HOST_GetMessage(handlePort,0,pszBuffer))
		nFlag = pszBuffer[1];
	else
		nFlag = COMM_RECV_ERROR;
	return nFlag;
}

/*
功能:卡片扣值
参数:nSector :扇区(0~15) 
	  nBlock  :块(0~3)
	  pszData :金额缓冲(高位在前)
返回:0 成功 1 失败,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_DecrmentRFValue(HANDLE handlePort,unsigned char nSector,unsigned char nBlock,unsigned char *pszData )
{
	unsigned char nFlag;
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_DECRMENT_VALUE;
	pszBuffer[1] = nSector;
	pszBuffer[2] = nBlock;
	memcpy(pszBuffer+3,pszData,4);
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,7))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	if(SHTP_ERR != HOST_GetMessage(handlePort,0,pszBuffer))
		nFlag = pszBuffer[1];
	else
		nFlag = COMM_RECV_ERROR;
	return nFlag;
}
/*
功能:设备复位
参数:
返回:0 成功 1 失败,如果为0xFE、0xFF则表示通讯失败
*/
unsigned char CTestRFCardDlg::SSI_ResetRFDevice(HANDLE handlePort)
{
	unsigned char pszBuffer[256];
	PurgeComm(handlePort,PURGE_TXCLEAR);PurgeComm(handlePort,PURGE_RXCLEAR);
	pszBuffer[0] = SHTP_RESET;
	for(int nCount=0;nCount<COMM_SEND_TRY_TIMES;nCount++)
	{
		if(SHTP_SUCC == HOST_PutMessage(handlePort,0,pszBuffer,1))break;
	}
	if(COMM_SEND_TRY_TIMES == nCount) return COMM_SEND_ERROR;
	return 0;
}


void CTestRFCardDlg::OnButtonIssue() 
{
	char pszDisplay[128];
	char pszTemp[64];

	unsigned char pszData[64];
	unsigned char pszCardData[64];

	unsigned char nResult;
	// TODO: Add extra validation here
	HANDLE handlePort;
	//准备解析数据
	GetDlgItem(IDC_EDIT_NAME)->GetWindowText(pszDisplay,64);
	if(0 == strlen(pszDisplay))
	{
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("姓名不能为空!");
		return;
	}
	memset(pszCardData,0x00,64);
	memcpy(pszCardData,pszDisplay,16);

⌨️ 快捷键说明

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