📄 testrfcarddlg.cpp
字号:
}
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 + -