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

📄 testmif.c

📁 读卡器编程实例------Reader programming examples
💻 C
字号:
/******************************************************************************
*
*                               TEST711F.C   V2.3.0.0
*
*
* Author        :- Shen Qun
* System        :- Windowns, STAR POS, UNIX
* Last modified :- 2004-07-24, 2005-08-26
* Card type     :- MIFER1卡,MIFPRO卡
* Code          :- 
*
* Copyright     : Copyright 2000
* notice        : All rights reserved.
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "LD_Reader.h"

#ifdef _POS_
#include "main.h"
#endif

HICC hiCC;

#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 TestCpuCard_711F(HICC hCT)
{
	WORD usStatus,usRet, usRetLen=0;
	int 	i;
	unsigned char ucResp[100], data[100];
	unsigned char ucRespLen;

	//usRet = ICCTransmitAsc711F(hCT,	0, (unsigned char*)"00A40000023F00", 7, data, &usRetLen);
	//PubDisplays(1, 1, "\nTestCpuCard_711F Enter (Must Using Reader 711F)\n" );

	//CPU卡上电复位
	usRet = SAM_ICCPowerUp(hCT, ucResp, &ucRespLen);
	if ( usRet != 0) {
		PubDisplays(1, 1, "Reset Err %02X\n", usRet );
		return -1;
	}

	for ( i=0; i<ucRespLen; i++ )
		PubDisplays(1, 1, "%02X ", ucResp[i] );


	PubDisplays(1, 1, "\n" );
	for ( i=0; i<ucRespLen; i++ )
		PubDisplays(1, 1, "%2c ", ucResp[i] );


	//获得随机数
	usRet = SAM_ICCOutGoing(hCT, 0x00, 0x84, 0, 0, 8, data, &usStatus);
	PubDisplays(1, 1, "\nGet Random 00 84 00 00 08 \n" );
	PubDisplays(1, 1, "Outgoing SW=%04X\n", usStatus );

	//选择文件
	data [0] = 0x3f;
	data [1] = 0x00;
	usRet = SAM_ICCInComing(hCT, 0, 0xa4, 0,0, 2, data, &usStatus);
	PubDisplays(1, 1, "Select File 3F00   00 A4 00 02 3f 00 \n" );
	PubDisplays(1, 1, "Incoming SW=%04X\n", usStatus );

	if ( HIBYTE(usStatus) == 0x61 ) {
		usRet = SAM_ICCOutGoing(hCT, 0x00, 0xc0, 0, 0, LOBYTE(usStatus), data, &usStatus );
		PubDisplays(1, 1, "Outgoing SW=%04X\n", usStatus );
	}

	//usRet = ICCTransmitAsc711F(hCT,	0, (unsigned char*)"00A40000023F00", 7, data, &usRetLen);

	PubDisplays(1, 1, "TestCpuCard_711F Exit\n" );

	return 0;
}

uchar IncSector(HICC hiCC, ulong ulAmount, uchar ucBlock)
{
	unsigned char ucStatus, ucTmpBuf[5];
	WORD	usRet;

	if(ucBlock<0||ucBlock>63) return 124;

	LongToCharIntel(ulAmount, ucTmpBuf);
	usRet = MifIncrement(hiCC, ucBlock, ucTmpBuf, &ucStatus);
	if (usRet != ICCER_OK)	return 255;
	if (ucStatus != 0 )		return ucStatus;

	usRet = MifTransfer(hiCC, ucBlock, &ucStatus);
	if (usRet != ICCER_OK)	return 255;
	if (ucStatus != 0 )		return ucStatus;
	return 0;
}

uchar DecSector(HICC hiCC, ulong ulAmount, uchar ucBlock)
{
	unsigned char ucStatus, ucTmpBuf[5];
	WORD	usRet;

	if(ucBlock<0||ucBlock>63) return 124;

	LongToCharIntel(ulAmount, ucTmpBuf);
	usRet = MifDecrement(hiCC, ucBlock, ucTmpBuf, &ucStatus);
	if (usRet != ICCER_OK)	return 255;
	if (ucStatus != 0 )		return ucStatus;

	usRet = MifTransfer(hiCC, ucBlock, &ucStatus);
	if (usRet != ICCER_OK)	return 255;
	if (ucStatus != 0 )		return ucStatus;
	return 0;
}

WORD TestMif_711FTypeB(HICC hCT)
{
	WORD			usRet;
	unsigned char	ucStatus, ucLen = 0;
	unsigned char	ucTmpBuf[17], ucCardId[5];
	unsigned char	ucCid=0;
	unsigned char	ucProtocolType;
	unsigned short	usSw1Sw2;
	char			szErrMessage[100];
	int				i;

	usRet = MifTypeSelect(hCT, 1, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	usRet = MifRequestB(hCT, IDLE, 0, 0, ucTmpBuf, &ucLen, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);
	ucProtocolType = ucTmpBuf[10] & 0x01;

	for ( i=0; i<ucLen; i++ )
		PubDisplays(1, 1, "%02X ", ucTmpBuf[i] );
	PubDisplays(1, 1, "\n" );
	memcpy(ucCardId, ucTmpBuf+1, 4);

	/*
	   usRet = MifSlotMarker(hCT, 1, ucCardId, &ucLen, &ucStatus);
	   if (usRet != ICCER_OK )		return usRet;
	   GetMifErrMessage(ucStatus, szErrMessage);
	   PubDisplays(1, 1, ("%s\n", szErrMessage);
	   */

	usRet = MifPiccAttrib(hCT, ucCardId, 0, 7, ucProtocolType, ucCid, ucTmpBuf, &ucLen, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);
	/*
	   usRet = MifDeselectB(hCT, ucCid, &ucStatus);
	   if (usRet != ICCER_OK )		return usRet;
	   GetMifErrMessage(ucStatus, szErrMessage);
	   PubDisplays(1, 1, "%s\n", szErrMessage);
	   */
	usRet = MifExchangeB(hCT, ucCid, 0x00, 0x84, 0x00, 0x00, 0, ucTmpBuf, 8, ucTmpBuf, &ucLen, &usSw1Sw2); 
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "\nGet Random 00 84 00 00 08 \n" );
	PubDisplays(1, 1, "%s SW1SW2 = %x\n", szErrMessage, usSw1Sw2);

	ucTmpBuf[0] = 0x3f;
	ucTmpBuf[1] = 0x00;
	usRet = MifExchangeB(hCT, ucCid, 0x00, 0xA4, 0x00, 0x00, 2, ucTmpBuf, 0, ucTmpBuf, &ucLen, &usSw1Sw2); 
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "Select File 3F00   00 A4 00 02 3f 00 \n" );
	PubDisplays(1, 1, "%s SW1SW2 = %x\n", szErrMessage, usSw1Sw2);

	return usRet;
}

WORD TestMif_711F(HICC hCT)
{
	int i;
	unsigned char	ucCardType[4], ucKey[10], ucSector=1, ucCardId[4];
	unsigned char	ucStatus, ucSize;
	WORD			usRet;
	unsigned char	ucTmpBuf[17];
	char			szErrMessage[100];

	memset(ucKey, 0xf1, sizeof(ucKey));

	for( i=0; i<2; i++ ){
		//完成在天线范围内的TYPE A卡的激活操作
		usRet = MifRequest(hCT, 0, ucCardType, &ucStatus);
		if (ucStatus == 0 )
			break;
	}

	//防冲突处理,在被激活的多张卡片中选择一张卡
	PubDisplays(1, 1, "MifAnticoll.......");
	usRet = MifAnticoll(hCT, ucCardId, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//选择指定卡号的卡
	PubDisplays(1, 1, "MifSelect.........");
	usRet = MifSelect(hCT, ucCardId, &ucSize, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//KEYA密钥地址=ucSector
	//KEYB密钥地址=ucSector+0x10
	//选择指定的地址的存储密钥
	PubDisplays(1, 1, "MifLoadkey........");
	usRet = MifLoadkey(hCT, ucSector, ucKey, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);

	//选择指定地址的存储密钥认证卡片
	PubDisplays(1, 1, "MifAuth...........");
	usRet = MifAuth(hCT, ucSector, ucSector, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);


	//根据提供的密钥对指定的扇区进行认证
	PubDisplays(1, 1, "MifAuthToRam...... " );
	usRet = MifAuthToRam(hCT, ucSector, KEYA, ucKey, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);




	//准备写数据
	for(i=0; i<16; i++ )
		ucTmpBuf[i] = i;

	PubDisplays(1, 1, "MifWrite...... " );
	usRet = MifWrite(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);


	//读数据
	PubDisplays(1, 1, "MifRead...........");
	usRet = MifRead(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);


	//准备数值块
	PubDisplays(1, 1, "MifWrite..........");
	memcpy(ucTmpBuf, "\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\xff\x00\xff", 16 );
	usRet = MifWrite(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);


	PubDisplays(1, 1, "IncSector10.......");
	ucStatus = IncSector(hCT, 10, (uchar)(4*ucSector+1));
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);
	//读数据
	usRet = MifRead(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	for ( i=0; i<16; i++ )
		PubDisplays(1, 1, "%02X ", ucTmpBuf[i] );

	PubDisplays(1, 1, "\nDecSector9........");
	ucStatus = DecSector(hCT, 9, (uchar)(4*ucSector+1));
	GetMifErrMessage(ucStatus, szErrMessage);
	PubDisplays(1, 1, "%s\n", szErrMessage);
	//读数据
	usRet = MifRead(hCT, (uchar)(4*ucSector+1), ucTmpBuf, &ucStatus);
	if (usRet != ICCER_OK )		return usRet;
	for ( i=0; i<16; i++ )
		PubDisplays(1, 1, "%02X ", ucTmpBuf[i] );

	return	usRet;

}



void main(void)
{
	HICC hCT;
	WORD usRet = 0;

	//建立物理端口(COM1)与读写器711F之间通讯的逻辑句柄
	usRet = Mif_PortInit("COM1", &hCT, 28800);
	if ( usRet != 0 )
	{
		PubDisplays(1, 1, "Mif_PortInit Error %x", usRet );
		usRet = Mif_Close ( hCT );
		return ;
	}
	//SetReadWriteDelay(100,0);
	TestMif_711F(hCT);

	usRet = SetLed(hCT, 0, 1);
	usRet = SetLed(hCT, 0, 0);
	usRet = SetLed(hCT, 1, 1);
	usRet = SetLed(hCT, 1, 0);
	usRet = BuzzerMs(hCT, 4);
	if ( usRet != 0 )
	{
		PubDisplays(1, 1, "BuzzerMs Error %x", usRet );
		usRet = Mif_Close ( hCT );
		return ;
	}
	
	//TestMif_711FTypeB(hCT);

	//TestCpuCard_711F(hCT);

	//TestMif_711F(hCT);

	usRet = Mif_Close ( hCT );

	return;
}

⌨️ 快捷键说明

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