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

📄 testrfcarddlg.cpp

📁 详细的RF非接触卡测试源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// TestRFCardDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestRFCard.h"
#include "TestRFCardDlg.h"
#include "DataDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define SHTP_TIMES			0x03						//通讯失败重试次数
#define SHTP_SUCC			0x00						//通讯成功标志
#define SHTP_ERR			0xFF						//通讯失败
#define SHTP_RETRY  		0x02						//通讯方需要重试
#define SHTP_CRC_ERR		0xFE						//数据包发生校验错(用于和加油机控制板)
#define MAX_PKT_LENGTH 		0x80						//最大的数据包长度
#define SHTP_STX			0x9B						//包的引导符(与加油机控制板)
#define SHTP_ACK			0x07						//正确接收的应答包的命令字
#define SHTP_NAK			0x0F						//错误接收的应答包的命令字

#define SHTP_SET_SPEED			0x2F					//修改通讯速度
#define SHTP_QUERY_CARD			0x30					//检测卡片
#define SHTP_AUTHEN_CARD		0x31					//认证卡片
#define SHTP_READ_CARD			0x32					//读卡片
#define SHTP_WRITE_CARD			0x33					//写卡片
#define SHTP_INIT_VALUE			0x34					//设置初始化值
#define SHTP_READ_VALUE			0x35					//读卡片余额
#define SHTP_INCRMENT_VALUE		0x36					//卡片充值
#define SHTP_DECRMENT_VALUE		0x37					//卡片扣款

#define SHTP_GET_VERSION		0x40					//取读卡器版本信息
#define SHTP_BEEP_ON			0x41					//蜂鸣器鸣叫
#define SHTP_LED_ON			    0x42					//点亮指示灯
#define SHTP_RESET			    0x43					//设备软件复位

#define COMM_SEND_TRY_TIMES		6

#define COMM_SEND_ERROR			0xFE					//发送错误
#define COMM_RECV_ERROR			0xFF					//接收错误
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestRFCardDlg dialog

CTestRFCardDlg::CTestRFCardDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestRFCardDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestRFCardDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestRFCardDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestRFCardDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestRFCardDlg, CDialog)
	//{{AFX_MSG_MAP(CTestRFCardDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_ISSUE, OnButtonIssue)
	ON_BN_CLICKED(IDC_BUTTON_INCRMENT, OnButtonIncrment)
	ON_BN_CLICKED(IDC_BUTTON_DECRMENT, OnButtonDecrment)
	ON_BN_CLICKED(IDC_BUTTON_RESET, OnButtonReset)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestRFCardDlg message handlers

BOOL CTestRFCardDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	CComboBox *pComboList;
	pComboList = (CComboBox *)GetDlgItem(IDC_COMBO_PORT);
	pComboList->SetCurSel(0);
	pComboList = (CComboBox *)GetDlgItem(IDC_COMBO_BAUD);
	pComboList->SetCurSel(0);

	pComboList = (CComboBox *)GetDlgItem(IDC_COMBO_SEX);
	pComboList->SetCurSel(1);
	pComboList = (CComboBox *)GetDlgItem(IDC_COMBO_NATION);
	pComboList->SetCurSel(1);

	g_nHostID = 0;
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestRFCardDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTestRFCardDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTestRFCardDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTestRFCardDlg::OnOK() 
{
	char pszDisplay[128];
	char pszTemp[32];
	unsigned char pszData[64];
	unsigned char pszCardData[64];
	unsigned char nResult;
	// TODO: Add extra validation here
	HANDLE handlePort;
	
	int nIndex,nPort,nBaud;
	CComboBox *pComboList;
	pComboList = (CComboBox *)GetDlgItem(IDC_COMBO_PORT);
	nPort = pComboList->GetCurSel()+1;
	pComboList = (CComboBox *)GetDlgItem(IDC_COMBO_BAUD);
	nIndex = pComboList->GetCurSel();
	switch(nIndex)
	{
		case 0 : nBaud = 9600;break;
		case 1 : nBaud = 19200;break;
		case 2 : nBaud = 57600;break;
		case 3 : nBaud = 115200;break;
	}
	handlePort = SSI_OpenRFReader(nPort,nBaud);
	//Sleep(1000);
	//SSI_BeepReader(handlePort);
	
	memset(pszData,0x00,64);
	nResult = SSI_QueryRFCard(handlePort,0x52,pszData);
	if(pszData[1]&0x01)
		sprintf(pszDisplay,"Mifare Light ATQ:%02x%02x;卡号:%02x%02x%02x%02x",pszData[2],pszData[3],pszData[4],pszData[5],pszData[6],pszData[7]);
	if(pszData[1]&0x04)
		sprintf(pszDisplay,"Mifare Ultra Light ATQ:%02x%02x;卡号:%02x%02x%02x%02x%02x%02x%02x",
		                    pszData[2],pszData[3],pszData[4],pszData[5],pszData[6],pszData[7],pszData[8],pszData[9],pszData[10]);
	if(pszData[1]&0x08)
		sprintf(pszDisplay,"Mifare Standard ATQ:%02x%02x;卡号:%x%x%x%x",pszData[2],pszData[3],pszData[4],pszData[5],pszData[6],pszData[7]);
	if(pszData[1]&0x10)
		sprintf(pszDisplay,"Mifare Plus ATQ:%02x%02x;卡号:%x%x%x%x",pszData[2],pszData[3],pszData[4],pszData[5],pszData[6],pszData[7]);
	if((0x00 == pszData[2])&&(0x00 == pszData[3])&&(0x00 == pszData[4])&&(0x00 == pszData[5]))
	{
		SSI_CloseRFReader(handlePort);
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("没有卡片!");
		return;
	}
	else
	{
		//保存卡号
		memcpy(g_pszASN,pszData+4,4);
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(pszDisplay);
	}
	//开始验证卡片密钥 A密钥
	memset(pszData,0xff,6);
	nResult = SSI_AuthenRFCard(handlePort,0x60,0,pszData);
	if(nResult)
	{
		SSI_CloseRFReader(handlePort);
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("认证密钥失败!");
		return;
	}
	else
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("认证密钥成功!");
	//开始读卡
	memset(pszData,0x00,128);
	nResult =SSI_ReadRFCard(handlePort,0,1,pszData);
	memcpy(pszCardData,pszData+1,16);
	nResult =SSI_ReadRFCard(handlePort,0,2,pszData);
	if(0x00 != pszData[0])
	{
		SSI_CloseRFReader(handlePort);
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("读卡失败!");
		return;
	}
	else
	{
		memcpy(pszCardData+16,pszData+1,16);
		memset(pszDisplay,0x00,128);
		for(int nCount=0;nCount<16;nCount++)
		{
			sprintf(pszTemp,"%02x",pszData[nCount+1]);
			strcat(pszDisplay,pszTemp);
		}
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText(pszDisplay);
	}
	//认证1扇区密钥
	memset(pszData,0xff,6);
	nResult = SSI_AuthenRFCard(handlePort,0x60,1,pszData);
	if(nResult)
	{
		SSI_CloseRFReader(handlePort);
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("认证密钥失败!");
		return;
	}
	else
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("认证密钥成功!");
	//开始读卡
	memset(pszData,0x00,128);
	nResult =SSI_ReadRFCard(handlePort,1,0,pszData);
	memcpy(pszCardData+32,pszData+1,16);
	//开始读余额
	int nMoney;
	memset(pszData,0x00,128);
	nResult = SSI_ReadRFValue(handlePort,1,1,pszData);
	if(0 == nResult)
	{
		nMoney  = pszData[0]*256L*256L*256L;
		nMoney += pszData[1]*256L*256L;
		nMoney += pszData[2]*256L;
		nMoney += pszData[3];
		sprintf(pszDisplay,"%u.%02u",nMoney/100,nMoney%100);
		GetDlgItem(IDC_EDIT_MONEY)->SetWindowText(pszDisplay);
	}
	else
	{
		SSI_CloseRFReader(handlePort);
		GetDlgItem(IDC_STATIC_STATUS)->SetWindowText("读卡金额失败!");
		return;
	}
	//准备解析数据
	//CComboBox *pComboList;
	memset(pszDisplay,0x00,64);
	memcpy(pszDisplay,pszCardData,16);
	GetDlgItem(IDC_EDIT_NAME)->SetWindowText(pszDisplay);
	pComboList = (CComboBox *)GetDlgItem(IDC_COMBO_SEX);
	//提取性别

	int nSexIndex = pszCardData[16]>>6;
	pComboList->SetCurSel(nSexIndex);

	//提取民族
	int nNationIndex =pszCardData[16]&0x3f;
	pComboList->SetCurSel(nNationIndex);
	SSI_CloseRFReader(handlePort);
	//提取生日
	//提取生日 2006年5月1日
	memset(pszDisplay,0x00,32);
	for(int i=0;i<4;i++)
	{
		sprintf(pszTemp,"%02x",pszCardData[17+i]);
		strcat(pszDisplay,pszTemp);
	}
	int nYear,nMonth,nDay;
	memset(pszTemp,0x00,16);
	memcpy(pszTemp,pszDisplay,4);
	nYear = atol(pszTemp);
	memset(pszTemp,0x00,16);
	memcpy(pszTemp,pszDisplay+4,2);
	nMonth = atol(pszTemp);
	memset(pszTemp,0x00,16);
	memcpy(pszTemp,pszDisplay+6,2);
	nDay = atol(pszTemp);
	CTime issuetime(nYear,nMonth,nDay,0,0,0);

	GetDlgItem(IDC_DATETIMEPICKER1)->SetWindowText(pszDisplay);
	CDateTimeCtrl *pDateTime;
	pDateTime = (CDateTimeCtrl *)GetDlgItem(IDC_DATETIMEPICKER1);
	pDateTime->SetFormat("yyyMMdd");
	pDateTime->SetTime(&issuetime);
	GetDlgItem(IDC_DATETIMEPICKER1)->SetWindowText(pszDisplay);

⌨️ 快捷键说明

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