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