本文主要参考《ETC交易IC卡操作说明.doc》和《ETC用户卡数据规范.pdf》进行理解,其实文档中已经详细的描述了指令部分,
这里解释下圈存的含义:这里直接拷贝百度的一段回答过来,意思基本就是将银行卡里的钱划到IC卡上的过程。等划过去之后,就可以用IC卡进行消费。
中国石化加油卡单用户圈存是什么意思
你办卡时在石化IC卡系统数据库里有一个账号,账号里存着你的数据,这个账号下面对应着一张IC卡(单用户),多张时有一张是母卡。你到加油站加油时,用的是IC卡加油,IC卡上记录着你的金额会随着加油金额减少,直到这张IC卡里的金额为0后,IC卡就加不了油了。这时候怎么办,于是你自己或别人帮你在你的账号里交钱,但只交钱你的IC卡还是加不了油。为什么,因为钱的金额信息还没存入你的IC卡里去,于是你就得带你的IC卡到加油站的专门机上存贮一下信息,这样你的卡上有了数据又可以继续加油了。“单用户圈存”就是“带你的IC卡到加油站的专门机上存贮一下信息”的这一步骤。
多用户也是一样,只是多一个环节,就是把母卡上的钱分配给分卡的子账户而已,分配后分卡一样要去圈存。
至于的数据如何传送是关系到机密了,不能细说了
基本看文档就可以对ETC卡的基本信息进行读取,首先要熟悉文件目录,不要乱写电卡数据,可以随意读取,但是写一定要慎重,比如圈存初始化,权限校验的初始化等操作,如果卡是空卡,可能只有三次机会,有用户信息的可能是15次,超出了卡就锁死了。
文档中提到:基本的通信协议为:
1.命令格式
情形1:
命令:
CLA |
INS |
P1 |
P2 |
00 |
应答:
SW1 |
SW2 |
情形2:
命令:
CLA |
INS |
P1 |
P2 |
Le |
应答:
Le字节DATA |
SW1 |
SW2 |
情形3:
命令:
CLA |
INS |
P1 |
P2 |
Lc |
DATA |
应答:
SW1 |
SW2 |
情形4:
命令:
CLA |
INS |
P1 |
P2 |
Lc |
DATA |
Le |
应答:
Le字节DATA |
SW1 |
SW2 |
说明:
CLA:指令类别
INS: 指令类型的指令码
P1P2:指令参数
Lc:数据DATA长度
DATA:数据域或应答数据域
Le:要求返回数据长度,Le为00表示返回卡中最大数据长度
--------------------------------------------------------------------------------------------分隔符-----------------------------------------------------------------------
1:比如读二进制文件:00B0xxxxxx,
参数解释:
若P1的高三位为100,则低5位为短的文件标识符,P2为读的偏移量。
若P1的最高位不为1,则P1P2为欲读文件的偏移量,所读文件为当前文件。
Le表示要读取的字节数。
例如我们要读0015文件的前8字节,那么就需要发送‘00 B0 95 00 08’,由卡片返回的相应数据为‘11 22 33 44 55 66 77 88 90 00’。
那为什么是95就是要读15文件呢,因为16进制的15 = 00010101 95 = 10010101,高三位为100,也就是说:9500中,后五位10101为文件标识,00为偏移量。而低五位10101=15,为文件标识符,也就是读的是0015文件。同样,要读16文件,则高三位为100,低五位为10110,转为16进制则为:96,也就是00 B0 96 00 08可以读16文件的八个字节。:
2: 选择文件00 A4 00 00 02 DF 01,
该命令中,没有要求返回数据长度,DF01为发送数据,所以可以返回sw1+sw2,sw1+sw2为返回状态码,成功则为9000
其中:DF01为选择读取的文件,见上图DF01根目录。
3: 读记录文件
00 B2 01 CC 02
P1表示要读取的文件的记录号。
P2标识要读取的短文件的标识符。
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
P2的含义 |
x |
x |
x |
x |
x |
1 |
0 |
0 |
b4-b8为短文件标识符 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
当前文件 |
Le表示要读的文件的长度。
例如我们要读记录文件0019的第一条记录的前2字节,那么我们可以发送‘00 B2 01 CC 02’,卡片返回‘11 22 90 00’。
同上1分析:19 = 11001,加上100为111001100,则等于CC。读18文件则为18 = 11000,加上100为11000100,等于C44:
写二进制文件 00D6xxxxxxxx
写二进制文件参考读二进制文件,不过写文件需要输入参数数据,也就是向卡片中写入的数据,而且写卡前需要校验权限,检验过才能写卡。
5:操作卡片的过程中总会遇到很多错误,状态码提示各种各样的错误,文档中对sw1+sw2也有说明:
注:当SW1的高半字节为‘9’,且低半字节不为‘0’时,其含义依赖于相关应用。
当SW1的高半字节为‘6’,且低半字节不为‘0’时,其含义与应用无关。
比如返回610c,按照解释则为:正常需发GET RESPONSE命令,
比如:63CF 警告 校验失败 ,则表示最多重试15次,超过卡就锁死了。
当然读卡过程中会返回很多数据,这个时候数据的具体含义要根据《ETC用户卡数据规范.pdf》来按位解释,可以得到具体的有用信息,比如车牌号,车主姓名,身份证号,有效期,卡片余额等一些信息。
基本上从文档中的描述来看,00b0,00b2等都为读记录,00a4为目录操作,80开头的指令基本就是计算DES,消费和圈存等操作。0082等为电卡权限验证。
文章中提到的文档我已经上传,参考链接:http://download.csdn.net/detail/bawang_cn/9718672