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

📄 testpad03.c

📁 读卡器编程实例------Reader programming examples
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
 *
*                             TestPad03.C   V1.0.4.0
 *
 *							  用于测试PAD03的接口函数
 *
 * Author        :- Shen Qun
 * System        :- VC 6.0 or STAR POS
 * Last modified :- 2007.08.16
 * Funciton		 :- Test Api for pinpad 
 *
 * Copyright     : Copyright 2006 LANDI
 * notice        : All rights reserved.
 ******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "LD_Reader.h"

extern unsigned char	CARD_STATUS, CARD_SW1, CARD_SW2;
#define CLA_CODE	0x00
void					debug_disps(char line, char *_data, int len);

unsigned char			reader_type = 255;

void display_ic_status(void)
{
#ifdef _POS_
	displays(7, 1, "STATUS=%02x SW1SW2=%02x%02x", CARD_STATUS, CARD_SW1, CARD_SW2);
#else
	printf("STATUS=%02x, SW1=%02x, SW2=%02x\n", CARD_STATUS, CARD_SW1, CARD_SW2);
#endif
}

#ifndef _POS_

// 用于Windows下函数测试
void display_cen(int line, char *data)
{
	printf("%s", data);
}

void display_inv(int line, char *data)
{
	printf("%s", data);
}

void displays(int line, int col, char *format, ...)
{
	va_list ap;
	int		arg;

	va_start(ap, format);		/* Variable argument begin */

	arg = va_arg(ap, int);
	printf(format, arg);

	va_end(ap);					/* Variable argument end */
}

void display(int line, char *format, ...)
{
	va_list ap;
	int		arg;

	va_start(ap, format);		/* Variable argument begin */

	arg = va_arg(ap, int);
	printf(format, arg);

	va_end(ap);					/* Variable argument end */
}

void debug_disps(char line, char *_data, int len)
{
	int i;

	for (i = 0; i < len; i++)
	{
		display(1, "%02X ", (unsigned char) _data[i]);
	}

	display(1, "\n");
}

int inkey(int time)
{
	return 0;
}

void clearall()
{
}

void cls()
{
}

void ResetTime()
{
}

#else
void debug_disps(char line, char *_data, int len)
{
	char	str1[20], str2[20];
	int		i, j;

	j = 0;
	do
	{
		memset(str1, 0, 20);
		for (i = 0; i < 8; i++)
		{
			if ((j + i) >= len)
			{
				str1[i * 2] = 0;
				break;
			}

			sprintf(str1 + i * 2, "%02x", _data[j + i]);
		}

		sprintf(str2, "%d~%d of %d", j + 1, j + i, len);
		displays(line, 1, str2);
		displays(line + 1, 1, str1);
		inkey(0);
		j += 8;
	} while (j < len);
}
#endif
#ifndef _POS_
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
	va_list ap;
	int		arg;

	va_start(ap, pszFmt);		/* Variable argument begin */

	arg = va_arg(ap, int);
	printf(pszFmt, arg);

	va_end(ap);					/* Variable argument end */
}

#else
void PubDisplays(char dln, char dlc, char *pszFmt, ...)
{
	char	szDispStr[500];
	va_list VarList;

	va_start(VarList, pszFmt);
	vsprintf(szDispStr, pszFmt, VarList);
	va_end(VarList);

	displays(dln, dlc, "%s", szDispStr);
	return;
}
#endif
int ReaderPowerOn(int expect_code, unsigned char ucReaderHandle)
{
	short			sRet;
	unsigned char	ucTmpBuf[100], ucBufLen;
	unsigned char	ucCardNo = 0;

	sRet = power_up(ucReaderHandle, ucCardNo, ucTmpBuf, &ucBufLen);
	display_ic_status();
	debug_disps(3, (char *) ucTmpBuf, (int) ucBufLen);
	return SUCC;
}

void ReaderAPDU(unsigned int uiLen_APDU, unsigned char *ucCommand_APDU)
{
	unsigned char	ucResponse_APDU[512];
	unsigned char	Lc = 0, Le = 0;
	unsigned char	ucCardNo = 0;
	short			sRet;
	unsigned short	usLen;
	unsigned char	ucReaderHandle = 1;

	usLen = 0;					//处理61 6C

	//usLen = 2;		//不处理 61 6C
	if (uiLen_APDU == 4)		//case 1
	{
		Lc = 0;
		Le = 0;
	}
	else if (uiLen_APDU == 5)	//case 2
	{
		Lc = 0;
		Le = ucCommand_APDU[4];
	}
	else if (uiLen_APDU == (unsigned int) (5 + ucCommand_APDU[4]))	// case 3
	{
		Lc = ucCommand_APDU[4];
		Le = 0;
	}
	else if (uiLen_APDU == (unsigned int) (6 + ucCommand_APDU[4]))	// case 4
	{
		Lc = ucCommand_APDU[4];
		Le = ucCommand_APDU[4 + Lc + 1];
		usLen = 0;
	}
	else
	{
		return;
	}

	sRet = ICCTransmit
		(
			ucReaderHandle,
			ucCardNo,
			ucCommand_APDU[0],
			ucCommand_APDU[1],
			ucCommand_APDU[2],
			ucCommand_APDU[3],
			Lc,
			ucCommand_APDU + 5,
			Le,
			ucResponse_APDU,
			&usLen
		);

	display_ic_status();
	debug_disps(3, (char *) ucResponse_APDU, (int) usLen);
	if (usLen == 0 && CARD_SW1 == 0x61)
	{
		Lc = 0;
		Le = CARD_SW2;
		memset(ucResponse_APDU, 0, sizeof(ucResponse_APDU));
		sRet = ICCTransmit
			(
				ucReaderHandle,
				ucCardNo,
				0x00,
				0xC0,
				0x00,
				0x00,
				Lc,
				ucCommand_APDU + 5,
				Le,
				ucResponse_APDU,
				&usLen
			);
		display_ic_status();
		debug_disps(3, (char *) ucResponse_APDU, (int) usLen);
	}

	return;
}

int test_4428(unsigned char hd_no)
{
	char	out[1024], length, key[256];
	char	tmp_str[100];
	short	ret;
	char	status, err_no;

	ret = power_up_4428(hd_no, &status, &length, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(power_up_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, length);

	if (ICC_in(hd_no) == 0)
	{
		ret = read_SIM4428(hd_no, 0, 20, out);
		if (ret != SUCC)
		{
			display(1, "(read_SIM4428)");
			GetErrorMessage(ret, tmp_str);
			display(2, "%s", tmp_str);
		}

		debug_disps(3, out, 20);
	}
	else
	{
		display(1, "No Card Insert\n");
		return FAIL;
	}

	ret = read_ERR_SIM4428(hd_no, &err_no);
	display(2, "err_no=%d\n", err_no);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	key[0] = (char) 0x67;
	key[1] = (char) 0xC7;
	ret = verify_SIM4428(hd_no, key, &err_no);
	if (err_no != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(verify_4428)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	display(2, "err_no=%d\n", err_no);

	ret = read_SIM4428(hd_no, 1021, 500, out);
	if (ret != SUCC)
	{
		display(1, "(read_SIM4428)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, 10);

	memset(out, 0, sizeof(out));
	out[0] = (char) 0x12;
	out[1] = (char) 0x23;
	out[2] = (char) 0x55;
	out[3] = (char) 0xaa;
	ret = write_SIM4428(hd_no, 10, 10, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(write_4428)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	return SUCC;
}

int test_4442(unsigned char hd_no)
{
	char	out[256], length, key[256];
	char	tmp_str[100];
	short	ret;
	char	status, err_no;

	ret = power_up_4442(hd_no, &status, &length, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(power_up_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, length);

	if (ICC_in(hd_no) == 0)
	{
		ret = read_SIM4442(hd_no, 0, 20, out);
		if (ret != SUCC)
		{
			display(1, "(read_SIM4428)");
			GetErrorMessage(ret, tmp_str);
			display(2, "%s", tmp_str);
		}

		debug_disps(3, out, 20);
	}
	else
	{
		display(1, "No Card Insert\n");
		return FAIL;
	}

	key[0] = (char) 0xB6;
	key[1] = (char) 0x23;
	key[2] = (char) 0x07;
	ret = verify_SIM4442(hd_no, key, &err_no);
	if (err_no != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(verify_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	display(2, "err_no=%d\n", err_no);

	ret = read_SIM4442(hd_no, 32, 3, out);
	status = CARD_STATUS;
	if (ret != SUCC)
	{
		display(1, "(read_SIM4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, 3);

	memset(out, 0, sizeof(out));
	out[0] = (char) 0xab;
	out[1] = (char) 0xcd;
	out[2] = (char) 0xef;
	out[3] = (char) 0xaa;
	ret = write_SIM4442(hd_no, 32, 10, out);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

	if (ret != SUCC)
	{
		display(1, "(write_4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	ret = read_SIM4442(hd_no, 32, 3, out);
	if (ret != SUCC)
	{
		display(1, "(read_SIM4442)");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	debug_disps(3, out, 4);

	return SUCC;
}

int test_cpu_card(unsigned char hd_no)
{
	unsigned char	data[100], len;
	char			card_no = 0, err_str[100];
	short			stat, ret;
	char			tmp_str[100];

	cls();
	displays(1, 1, "\nBegin test CPU card......! \n");
/*
	displays(1, 1, "Insert IC card\n");
	do
	{
		ret = ICC_in(hd_no);
		GetErrorMessage(ret, err_str);
	} while (ret != SUCC);
 */
	stat = power_up(hd_no, card_no, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);

	stat = power_down(hd_no, 1);
	stat = power_up(hd_no, 1, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);

	stat = power_up(hd_no, 2, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);

	stat = power_up(hd_no, 4, data, &len);
	display_ic_status();
	debug_disps(3, (char *) data, len);

	/*	
	if ( len == 0 ) {
		display_ic_status();
		return FAIL;
	}
*/
	//获得随机数
	displays(2, 1, "Begin Get Random...\n");
	stat = outgoing(hd_no, card_no, 0x00, 0x84, 0, 0, 8, data);
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);

⌨️ 快捷键说明

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