初始化端口
icdev = dc_init(100,115200)
为100时表示usb口通讯,此时波特率无效
设置typeA
result = dc_config_card(icdev, 'A');
成功返回值0
long icdev串口标识符
string A为TypeA,B为TypeB
射频复位
result = dc_reset(icdev,Msec);
成功返回值0
long icdev串口标识符
smallint Msec复位时间
寻卡
result = dc_card(icdev, Mode, cardserialnumber);
成功返回值0
long icdev串口标识符
smallint mode寻卡模式 0一对一,1一对多
pansichar cardserialnumber返回的卡序列号
上电复位
result = dc_pro_resethex(icdev, * rLen, * rData);
成功返回值0
long icdev串口标示符
smallint rlen 返回数据长度
pansichar rData 返回信息
蜂鸣
result = dc_beep(icdev, Msec);
成功返回值0
long icdev串口标示符
smallint Msec 蜂鸣时间
发送apud
result = dc_pro_commandlink_hex(icdev, Len, apud, rLen, data, tt, fg);
long icdev串口标示符
smallint Len 发送数据长度
pansichar apud 发送数据
smallint rLen 返回数据长度
smallint tt 延时时间 我设置为7
smallint fg 分割长度 我设置为64
pansichar data 返回数据
apud命令
- MF 00A404000E325041592E5359532E4444463031
- AID 00A4040008A000000632010105
- 15H 00B095001E
- 16H 00B0960037
- 17H 00B097003C
- balance 805C000204
充值流程
- 卡片上电
- 进入MF’00A404000E325041592E5359532E4444463031’
- 进入AID’00A4040008A000000632010105’
- 读取15H’00B0950A0A’ 截取相应卡序列号后8字节
圈存初始化
805000020B[1字节密钥索引][4节交易金额][6字节终端机号][0x10]
返回数据
依次是:4字节旧余额,2字节卡联机交易序号,1字节密钥版本,1字节算法标识,4字节随机数,4字节MAC1- 用圈存初始化的返回数据调用“个人充值申请报文”接口,获得MAC2
- 圈存,805200000B[7字节交易日期时间][4字节MAC2][0x04]
返回数据是:4字节交易TAC - 调用“个人充值提交”接口
消费
- 消费初始化
805001020B
[1字节密钥索引][4节交易金额][6字节终端机号][0x0F]
消费流程(旧)
- 卡片上电
- 进入MF’00A404000E325041592E5359532E4444463031’
- 进入AID’00A4040008A000000632010105’
- 读取15H’00B0950A0A’ 截取相应卡序列号后8字节
消费初始化
805003020B[1字节密钥索引][4节交易金额][6字节终端机号][0x10]
返回数据
依次是:4字节旧余额,2字节卡联机交易序号,3字节透支限额,1字节密钥版本,1字节算法标识,4字节随机数- 用消费初始化的返回数据调用“商户消费申请报文”接口,获得MAC1
- 消费,805401000F[4字节终端交易序号] [7字节终端交易时间] [4字节MAC1][0x08]
返回数据是:4字节交易TAC,4字节MAC2 - 调用“商户消费提交”接口
D8读卡器相关操作
-
端口初始化
icdev := dc_init(100, 115200);
int dc_init(int port,long baud); 功 能:初始化通讯口 参 数:port:取值为0~19时,表示串口1~20;为100时,表示USB口通讯,此时波特率无效。
baud:为通讯波特率9600~115200
返 回:成功则返回串口标识符>0,失败返回负值,见错误代码表
例:int icdev;
icdev=dc_init(0,9600);//初始化串口1,波特率9600
-
初始化cpu卡卡座
st := dc_setcpu(icdev, 12);
__int16 dc_setcpu(HANDLE ICDev,unsigned char SAMID) 说明:设置要操作的SAM卡座 调用:int ICDev ---- dc_init 函数返回的端口标识符
unsigned char SAMID — 设置要操作的卡座号,0x0c为附卡座,0x0d 0x0e 0x0f各为SAM1 SAM2 SAM3
返回:<0 错误。其绝对值为错误号
=0 成功
读MF文件
CMD_MF
00A404000E325041592E5359532E4444463031
AID
all :00A4040008A000000632010105
00 //CLA Class
A4 //INS Instruction
04 // P1 Parameter 1
00 // P2 Parameter 2
08 //CMD_AID.length
A000000632010105 //CMD_AID
15H文件 ((1) 公共应用信息文件)
req:00B095001E
rep:0259 4920 FFFFFFFF020103105071000000000005201605232040123100009000
CardInfo info=new CardInfo();
info.setIssueCardCode(ByteUtil.toHexString(data,0,8)); //
info.setAppType(ByteUtil.toHexString(data,8,1)); //应用类型
info.setCardNo(ByteUtil.toHexString(data,10,10)); //卡号
info.setEffectiveDate(ByteUtil.toHexString(data,20,4)); //应用生效日期
info.setExpiryDate(ByteUtil.toHexString(data,24,4)); //应用失效日期
info.setVersion(ByteUtil.toHexString(data,9,1)); //应用版本号
return info;
16H((2) 持卡人基本信息文件)
req:00B0960037
rep:
17H((3) 管理信息文件)
req:00B097003C
rep:0000015649004920000101202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020209000
CardManageInfo info=new CardManageInfo();
info.setCountry(ByteUtil.toHexString(result,0,4));
info.setProvince(ByteUtil.toHexString(result,4,2));
info.setCity(ByteUtil.toHexString(result,6,2));
info.setCardType(ByteUtil.toHexString(result,10,1));
余额BALANCE
req:805C000204
rep:0000 D1F8 9000
6F49840E325041592E5359532E4444463031A537BF0C3461194F08A000000632010106500A4D4F545F545F4341534887010161174F08A00000063201010550084D4F545F545F45508701029000