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

📄 cardreviewerdlg.cpp

📁 IC 卡读写操作VC版。有读写功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		memset(szVerifyVal, 0, sizeof(szVerifyVal));
		memset(szInfo, 0, sizeof(szInfo));
		pszPos = &m_szCardData[(24 + nCur) * 32];
		StrXor((char *)pszPos, 30, (char *)szVerifyVal);
		if (memcmp(pszPos + 30, szVerifyVal, 2) != 0)
		{
			_snprintf(szInfo, sizeof(szInfo), "S6B%d校验位错误", nCur);
			m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		}
		else
		{
			_snprintf(szInfo, sizeof(szInfo), "S6B%d校验位正确", nCur);
			m_ListAnalyse.AddMsg(szInfo, M_OK);
		}
	}
	memset(szInfo, 0, sizeof(szInfo));
	if (memcmp(&m_szCardData[24 * 32], &m_szCardData[25 * 32], 32) != 0)
	{
		_snprintf(szInfo, sizeof(szInfo), "S6B0和S6B1不符合!");
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
	}
	else
	{
		_snprintf(szInfo, sizeof(szInfo), "S6B0和S6B1符合");
		m_ListAnalyse.AddMsg(szInfo, M_OK);
	}
	IsValidPublic(&m_szCardData[24 * 32]);
	IsValidPublic(&m_szCardData[25 * 32]);
	// 判断是否为黑名单卡
	if (memcmp(&m_szCardData[24 * 32 + 12], "04", 2) == 0)
	{
		_snprintf(szInfo, sizeof(szInfo), "次卡为黑名单卡!");
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		GetDlgItem(IDC_BUTTONUnBlockCard)->EnableWindow(TRUE);
	}
}
// Flush Card Content
void CCardReviewerDlg::ShowCardInfo(void)
{
	char szVerifyVal[3] = {0};
	char szInfo[256] = {0};
	char szValue[32] = {0};
	char *pszPos = NULL;
	int nCur = 0;
	if ('\0' == m_szCardData[0])
	{
		_snprintf(szInfo, sizeof(szInfo), "读卡错误");
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		return ;
	}

	// 城市代码
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[4 * 32], 4);
	SetEditText(IDC_EDITCityCode, szValue);
	// 行业代码
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[4 * 32 + 4], 4);
	SetEditText(IDC_EDITIndustryCode, szValue);
	// 发行流水 ==> 用户卡号
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[4 * 32 + 8], 8);
	char szCardNo[32] = {0};
	int nCardNo = HexStrToLong(szValue, 8);
	_snprintf(szCardNo, sizeof(szCardNo), "1500%08d", nCardNo);
	SetEditText(IDC_EDITCardNo, szCardNo);
	// 卡认证码
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[4 * 32 + 16], 8);
	SetEditText(IDC_EDITCardMAC, szValue);
	// 启用标志
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[4 * 32 + 24], 2);
	if (memcmp(szValue, "01", 2) == 0)
	{
		SetEditText(IDC_EDITInitFlag, "未启用");
	}
	else if (memcmp(szValue, "02", 2) == 0)
	{
		SetEditText(IDC_EDITInitFlag, "启用");
	}
	else if (memcmp(szValue, "03", 2) == 0)
	{
		SetEditText(IDC_EDITInitFlag, "停用");
	}
	else if (memcmp(szValue, "04", 2) == 0)
	{
		SetEditText(IDC_EDITInitFlag, "黑名单卡");
	}
	else 
	{
		SetEditText(IDC_EDITInitFlag, szValue);
		_snprintf(szInfo, sizeof(szInfo), "未知启用标志");
		m_ListAnalyse.AddMsg(szInfo, M_WARING);
	}
	// 卡类
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[4 * 32 + 26], 2);
	if (memcmp(szValue, "00", 2) == 0)
	{
		SetEditText(IDC_EDITCardType, "普通卡");
	}
	else if (memcmp(szValue, "01", 2) == 0)
	{
		SetEditText(IDC_EDITCardType, "学生卡");
	}
	else if (memcmp(szValue, "02", 2) == 0)
	{
		SetEditText(IDC_EDITCardType, "老人卡");
	}
	else if (memcmp(szValue, "03", 2) == 0)
	{
		SetEditText(IDC_EDITCardType, "优待卡");
	}
	else 
	{
		SetEditText(IDC_EDITCardType, szValue);
		_snprintf(szInfo, sizeof(szInfo), "未知卡");
		m_ListAnalyse.AddMsg(szInfo, M_WARING);
	}
	// 卡片押金
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[4 * 32 + 28], 2);
	int nForgift = HexStrToLong(szValue, 2);
	_snprintf(szValue, sizeof(szValue), "%0.02f元", (float)nForgift);
	SetEditText(IDC_EDITForegift, szValue);
	// 发行日期
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[5 * 32], 8);
	SetEditText(IDC_EDITIssueDate, szValue);
	// 有效日期
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[5 * 32 + 8], 8);
	SetEditText(IDC_EDITVaildDate, szValue);
	// 启用日期
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[5 * 32 + 16], 8);
	SetEditText(IDC_EDITStartDate, szValue);
	// 充值时间
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[6 * 32], 8);
	SetEditText(IDC_EDITReloadTime, szValue);
	// 充值前余额
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[6 * 32 + 8], 8);
	int nAmt = ConverseHexStrToLong(szValue, 8);
	_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
	SetEditText(IDC_EDITReloadBefore, szValue);
	// 本次充值金额
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[6 * 32 + 16], 4);
	_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)atoi(szValue) / 100);
	SetEditText(IDC_EDITCurReload, szValue);
	// 操作员号
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[6 * 32 + 20], 6);
	SetEditText(IDC_EDITOperator, szValue);	
	// 充值总额
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[8 * 32], 8);
	nAmt = ConverseHexStrToLong(szValue, 8);
	_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
	SetEditText(IDC_EDITTotalReload, szValue);
	// 最大余额
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[8 * 32 + 8], 8);
	nAmt = ConverseHexStrToLong(szValue, 8);
	_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
	SetEditText(IDC_EDITMaxAmt, szValue);
	// 充值设备编号
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[8 * 32 + 16], 8);
	SetEditText(IDC_EDITReloadDev, szValue);
	// 钱包金额
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[9 * 32], 8);
	nAmt = ConverseHexStrToLong(szValue, 8);
	_snprintf(szValue, sizeof(szValue), "%0.02f.元", (float)nAmt / 100);
	SetEditText(IDC_EDITPurseAmt, szValue);
	_snprintf(szValue, sizeof(szValue), "%0.02f元", (float)nAmt / 100);
	IC_LcdClrScrn(m_hPOS, 0);
	IC_LcdClrScrn(m_hPOS, 1);
	IC_DispInfo(m_hPOS, 1, 0, szValue);
	IC_DispInfo(m_hPOS, 0, 0, "卡片金额:");
	IC_CtlBackLight(m_hPOS, 1);
	IC_PosBeep(m_hPOS, 5);
	// 钱包累计交易次数
	memset(szValue, 0, sizeof(szValue));
	memcpy(szValue, &m_szCardData[24 * 32 + 2], 4);
	memcpy(&szValue[4], "0000", 4);
	int nTimes = ConverseHexStrToLong(szValue, 8);
	_snprintf(szValue, sizeof(szValue), "%d.次", nTimes);
	SetEditText(IDC_EDITPurseTranCount, szValue);
	// 交易记录
	char szTranTime[64] = {0};
	char szTranAmtBefore[64] = {0};
	char szTranAmt[64] = {0};
	char szTranType[64] = {0};
	char szTypeDes[64] = {0};
	char szDevNo[64] = {0};
	m_ListCtlTranRep.DeleteAllItems();
	int i = 0;
	char szIndx[8] = {0};
	for (nCur = 1; nCur <= 12; nCur++)
	{
		if (0 == nCur % 4)
		{
			continue;
		}
		memset(szTranTime, sizeof(szTranTime), 0);
		memset(szTranAmtBefore, sizeof(szTranAmtBefore), 0);
		memset(szTranAmt, sizeof(szTranAmt), 0);
		memset(szTranType, sizeof(szTranType), 0);
		memset(szDevNo, sizeof(szDevNo), 0);
		memset(szTypeDes, sizeof(szTypeDes), 0);

		char *pszPos = &m_szCardData[(11 + nCur) * 32];
		memcpy(szTranTime, pszPos, 8);
		memcpy(szTranAmtBefore, pszPos + 8, 8);
		memcpy(szTranAmt, pszPos + 16, 6);
		memcpy(szTranType, pszPos + 22, 2);
		memcpy(szDevNo, pszPos + 24, 8);
		if (memcmp(szTranType, "01", 2) == 0)
		{
			strncpy(szTypeDes, "消费", sizeof(szTypeDes));
		}
		else if (memcmp(szTranType, "88", 2) == 0)
		{
			strncpy(szTypeDes, "充值", sizeof(szTypeDes));
		} 
		else 
		{
			strncpy(szTypeDes, szTranType, sizeof(szTypeDes));
		}
		memset(szIndx, 0, sizeof(szIndx));
		nAmt = ConverseHexStrToLong(szTranAmtBefore, 8);
		memset(szTranAmtBefore, 0, sizeof(szTranAmtBefore));
		_snprintf(szTranAmtBefore, sizeof(szTranAmtBefore), "%0.02f.元", (float)nAmt / 100);
		_snprintf(szIndx, sizeof(szIndx), "%02d", i + 1);
		m_ListCtlTranRep.InsertItem(LVIF_TEXT|LVIF_STATE, i, szIndx, 0, LVIS_SELECTED, 0, 0);		
		m_ListCtlTranRep.SetItemText(i,1,szTranTime);
		m_ListCtlTranRep.SetItemText(i,2,szTranAmtBefore);
		nAmt = ConverseHexStrToLong(szTranAmt, 8);
		memset(szTranAmt, 0, sizeof(szTranAmt));
		_snprintf(szTranAmt, sizeof(szTranAmt), "%0.02f.元", (float)nAmt / 100);
		m_ListCtlTranRep.SetItemText(i,3,szTranAmt);
		m_ListCtlTranRep.SetItemText(i,4,szTypeDes);
		m_ListCtlTranRep.SetItemText(i,5,szDevNo);

		i++;
	}
}
// Display all card data
void CCardReviewerDlg::ShowAllCardData(void)
{
	if ('\0' == m_szCardData[0])
	{
		return ;
	}
	SetEditText(IDC_EDITAnaRes, "");
	memset(m_szCardAllData, 0, sizeof(m_szCardAllData));
	char szSecHeader[128];
	char szTempData[33];
	for (int nSec = 0; nSec < 7; nSec++)
	{
		memset(szSecHeader, 0, sizeof(szSecHeader));
		_snprintf(szSecHeader, sizeof(szSecHeader), "第%d扇区信息:\r\n", nSec);
		strcat(m_szCardAllData, szSecHeader);
		for (int nBlk = 0; nBlk < 3; nBlk++)
		{
			memset(szTempData, 0, sizeof(szTempData));
			memcpy(szTempData, &m_szCardData[(nSec * 4 + nBlk) * 32], 32);
			strcat(m_szCardAllData, szTempData);
			strcat(m_szCardAllData, "\r\n");
		}
	}
	SetEditText(IDC_EDITAnaRes, m_szCardAllData);
}
void CCardReviewerDlg::OnBUTTONReadCard() 
{
	GetDlgItem(IDC_BUTTONReadCard)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTONPrintReport)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTONUnBlockCard)->EnableWindow(FALSE);

	ReadCardContent();
	
	AnalanyCard();
	ShowCardInfo();
	ShowAllCardData();

	GetDlgItem(IDC_BUTTONReadCard)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTONPrintReport)->EnableWindow(TRUE);
	IC_PosBeep(m_hPOS, 1);
	IC_PosBeep(m_hPOS, 1);
}

void CCardReviewerDlg::OnBUTTONUnBlock() 
{
}

bool g_bTrueIsIn = true;

DWORD WINAPI TreatThread(void * pParam)
{
	CCardReviewerDlg *dlgReviewer = (CCardReviewerDlg *)pParam;
	unsigned long ulSnr=0;
	if (NULL == dlgReviewer)
	{
		return -1;
	}
	bool bTrueIsIn = false;
    for(;; Sleep(1))
    {
		if (0 >= dlgReviewer->m_hPOS)
		{
			continue ;
		}
		if (bTrueIsIn)
		{
			if (0 != IC_Card(dlgReviewer->m_hPOS,0,&ulSnr))
			{
				dlgReviewer->CleanCardInfo();
				bTrueIsIn = false;
			}
			continue;
		}
		if (0 != IC_Card(dlgReviewer->m_hPOS,0,&ulSnr))
		{
			bTrueIsIn = false;
			continue;
		}
		bTrueIsIn = true;
		dlgReviewer->OnBUTTONReadCard();
    }
    return 0;
}

int CCardReviewerDlg::CreatMakeCardThread(void)
{
    DWORD threadId;
    HANDLE hThread;
    hThread  = CreateThread(0, 0x1000, TreatThread, (PVOID)this, 0, &threadId);
	return 0;
}


void CCardReviewerDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	DisConnectReader();	
	CDialog::OnClose();
}

// Flush Card Content
void CCardReviewerDlg::CleanCardInfo(void)
{
	// 城市代码
	SetEditText(IDC_EDITCityCode, "");
	// 行业代码
	SetEditText(IDC_EDITIndustryCode, "");
	// 发行流水 ==> 用户卡号
	SetEditText(IDC_EDITCardNo, "");
	// 卡认证码
	SetEditText(IDC_EDITCardMAC, "");
	// 启用标志
	SetEditText(IDC_EDITInitFlag, "");
	// 卡类
	SetEditText(IDC_EDITCardType, "");
	// 卡片押金
	SetEditText(IDC_EDITForegift, "");
	// 发行日期
	SetEditText(IDC_EDITIssueDate, "");
	// 有效日期
	SetEditText(IDC_EDITVaildDate, "");
	// 启用日期
	SetEditText(IDC_EDITStartDate, "");
	// 充值时间
	SetEditText(IDC_EDITReloadTime, "");
	// 充值前余额
	SetEditText(IDC_EDITReloadBefore, "");
	// 本次充值金额
	SetEditText(IDC_EDITCurReload, "");
	// 操作员号
	SetEditText(IDC_EDITOperator, "");	
	// 充值总额
	SetEditText(IDC_EDITTotalReload, "");
	// 最大余额
	SetEditText(IDC_EDITMaxAmt, "");
	// 充值设备编号
	SetEditText(IDC_EDITReloadDev, "");
	// 钱包金额
	SetEditText(IDC_EDITPurseAmt, "");
	// 钱包累计交易次数
	SetEditText(IDC_EDITPurseTranCount, "");
	// 交易记录
	m_ListCtlTranRep.DeleteAllItems();
	m_ListAnalyse.ClearStr();
	SetEditText(IDC_EDITAnaRes, "");
}

void CCardReviewerDlg::OnBUTTONUnBlockCard() 
{
	char szInfo[256] = {0};

	short st;
	unsigned long ulSnr=0;
	if (0 != IC_Card(m_hPOS,0,&ulSnr))
	{
		MessageBox("Get Card Error!");
		return ;
	}

	if (!LoadKey((unsigned char*)m_szKey06, 6))
	{
		memset(szInfo, 0, sizeof(szInfo));
		_snprintf(szInfo, sizeof(szInfo), "6扇区加载密钥失败");
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		MessageBox(szInfo);
	}
	if (!Authentic(6,1))
	{
		memset(szInfo, 0, sizeof(szInfo));
		_snprintf(szInfo, sizeof(szInfo), "6扇区密钥认证失败");
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		MessageBox(szInfo);
	}

	char szData[33] = {0};
	char szVerifyVal[3] = {0};
	// 应用标识目录区
	// 读取6扇区内容
	if (!ReadBlock(6, 0, (unsigned char*)&szData[0]))
	{
		memset(szInfo, 0, sizeof(szInfo));
		_snprintf(szInfo, sizeof(szInfo), "读取S2B%d失败", 0);
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		MessageBox(szInfo);
		
		return ;
	}
	memcpy(&szData[12], "00", 2);
	memset(szVerifyVal, 0, sizeof(szVerifyVal));
	StrXor(&szData[0], 30, szVerifyVal);
	memcpy(&szData[30], szVerifyVal, 2);
	if (!WriteBlock(6, 0, (unsigned char *)szData))
	{
		memset(szInfo, 0, sizeof(szInfo));
		_snprintf(szInfo, sizeof(szInfo), "更新S2B%d失败", 0);
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		MessageBox(szInfo);
	}
	if (!WriteBlock(6, 1, (unsigned char *)szData))
	{
		memset(szInfo, 0, sizeof(szInfo));
		_snprintf(szInfo, sizeof(szInfo), "更新S2B%d失败", 1);
		m_ListAnalyse.AddMsg(szInfo, M_ERROR);
		MessageBox(szInfo);
	}
	MessageBox("操作完毕!");
	GetDlgItem(IDC_BUTTONUnBlockCard)->EnableWindow(FALSE);	
}

⌨️ 快捷键说明

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