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

📄 testpad03.c

📁 读卡器编程实例------Reader programming examples
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
 *
*                             TestPad03.C   V1.0.0.0
 *
 *							  用于测试PAD03的接口函数
 *
 * Author        :- Shen Qun
 * System        :- VC 6.0 or STAR POS
 * Last modified :- 2006.12.19 
 * 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);
	if (CARD_STATUS != 0)
	{
		return FAIL;
	}

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

	key[0] = (char) 0x67;
	key[1] = (char) 0xC6;
	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);
	}
	else
	{
		display_ic_status();
		debug_disps(3, (char *) data, 8);
	}

	//选择文件
	displays(3, 1, "Begin Select File...\n");

	data[0] = 0x3f;
	data[1] = 0x00;
	stat = incoming(hd_no, card_no, 0x00, 0xA4, 0, 0, 2, data);

	//stat = PSAM_Select_File ( hd_no, card_no, 0x3f, 0x00, data) ;
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);
	}
	else
	{
		display_ic_status();
	}

	stat = power_down(hd_no, card_no);
	if (stat != SUCC)
	{
		GetErrorMessage(stat, tmp_str);
		display(2, tmp_str);
	}

	displays(8, 1, "Press any key to continue\n");
	inkey(0);
	cls();

	return stat;
}

int test_display(unsigned char hd_no)
{
	short			ret;
	unsigned char	key;
	char			tmp_str[100];

	displays(1, 1, "display a line in PINPAD\n");
	display(2, "在PINPAD上从某一行的第一列开始显示中西文字符,并清掉后面的已有的字符\n");
	ret = display_pad(hd_no, 1, "Test Display");
	if (ret != SUCC)
	{
		display(1, "(display_pad):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	display(4, "在PINPAD上显示5*7小点阵ASCII字符, 不清除其它显示.\n");
	ret = disps_ascii(hd_no, 2, 4, "1234ABCD");
	if (ret != SUCC)
	{
		display(1, "(disps_ascii):");
		GetErrorMessage(ret, tmp_str);
		display(2, "%s", tmp_str);
	}

	ret = display_pad(hd_no, 6, "Display显示第6行");

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

	displays(5, 1, "push a key in PINPAD......\n");
	while (1)
	{
		get_push_key(hd_no, &key);	//读入键值后,下一次读入是0
		if (key != 0)
		{
			displays(6, 1, "get push key= %02x\n", key);
			break;
		}
	}

	displays(7, 1, "get kbhit of PinPad: \n");
	while (1)
	{
		kbhit_pad(hd_no, &key);		//kbhit未清缓冲区,下一次读出还是原值
		if (key != 0)
		{
			displays(8, 1, "kbhit_pad return=%02x\n", key);
			break;
		}
	}

	return SUCC;
}

int test_input_key(unsigned char hd_no)
{
	unsigned char	tmp_str[100], str_len;
	short			sRet = 0;

	memset(tmp_str, 0, sizeof(tmp_str));

	cls();
	displays(1, 1, "INPUT KEY in PINPAD\n");
	if (reader_type == READER_STAR752)
	{
		disps_ascii(hd_no, 1, 1, "INPUT:          ");
		disps_ascii(hd_no, 2, 1, "AMOUNT:123.45   ");
	}
	else
	{
		display_pad(hd_no, 1, "请输密:");
		display_pad(hd_no, 2, "金额:123.45");
	}

	//sRet = input_str ( hd_no, 1, 0, ASTERISK|VAR_LEN|PINDATA, 6, 1 );
	sRet = input_str(hd_no, 1, 8, VAR_LEN, 19, 1);
	if (sRet == 0)
	{
		do
		{
			sRet = get_str(hd_no, &str_len, tmp_str, 1);
			if (sRet == RCV_TIMEOUT)
			{
				printf("get_str timeout\n");
				return FAIL;
			}
		}while(sRet == BUSY_INPUT);
		displays(2, 1, "key length=%d ", str_len);
		//displays(3, 1, "key=%s\n", tmp_str);
		printf("key=%s\n", tmp_str);
	}

	memset(tmp_str, 0, sizeof(tmp_str));

	displays(4, 1, "INPUT Code in PINPAD\n");
	if (reader_type == READER_STAR752)
	{
		disps_ascii(hd_no, 1, 1, "INPUT CODE:     ");
		disps_ascii(hd_no, 2, 1, "                ");
	}
	else
	{
		display_pad(hd_no, 1, "请输密码:");
		display_pad(hd_no, 2, "");
	}

	input_str(hd_no, 2, 1, ASTERISK | VAR_LEN | PINDATA, 6, 0);
	if (sRet != 0)
	{
		return FAIL;
	}

	do
	{
		/*590取消键判断
		  if( kbhit( ) ){
		  if( inkey( 0 ) == CANCEL ){
		  reset_pad( );
		  return( FAIL );
		  }
		  }
		  */
		if (get_str(hd_no, &str_len, tmp_str, 0) == SUCC)
		{
			if (str_len != 6)
			{
				display_pad(hd_no, 1, "请输入密码:");
				display_pad(hd_no, 2, "");
				input_str(hd_no, 2, 1, ASTERISK | VAR_LEN, 6, 0);
				continue;
			}
			else
			{
				break;
			}
		}
	} while (1);

	displays(5, 1, "key length=%d ", str_len);
	//displays(6, 1, "key=%s\n", tmp_str);
	printf("key=%s\n", tmp_str);

	sRet = write_user_key(hd_no, "PIN_", "01234567");
	if (sRet != SUCC)
	{
		display(1, "(write_user_key):err");
		inkey(0);
	}

	sRet = X98_from_pad(hd_no, 0, "PIN_", "0000000000000000", tmp_str);

	//_DES("01234567", tmp_str, tmp_str+10);

⌨️ 快捷键说明

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