历途读卡扫描接口
(Version 1.0)
修订历史
日期
版本
说明
作者
2014-12-25
1.0
第一版,初稿
吕贤鸿
1、接口说明:(具体请查看API文档说明,路径:读卡扫描接口\doc\index.html)
(A) RFID读卡:
1. RfidManager :该类提供了读卡号、读扇区的块、写数据到扇区的块。
1)getInstance(String serialPort , int baudrate) :获取RfidManager实例,以对卡片进行读写操作
a) serialPort :Rfid模块连接到硬件串
如/dev/ttyS0
b) Baudrate :Rfid模块通讯使用的波特率如115200
2)recyle() :RfidManager资源回收,客户端软件结束时调用
3)setOnRfidDataListener(RfidDataListener listener):设置Rfid数据监听器,用于监听Rfid模块操作是否已完成并通知用户获取相应的数据
a)listener :Rfid数据监听器
4)requestUID() :读卡号,请求读取卡号。
5)requestWrite(int whichBlock , int whichKeyMode ,int[] keyBuf , int[] dataBuf):写数据到某个扇区的某块上,参数说明:
a) whiBlock: 卡上块的地址,从0x00开始;
b) whichKeyMode: 码模式,0x60—KeyA, x61—KeyB,默认KeyA ;
c) keyBuf: 的密码,长度6个字节,卡的出厂密码是6个0xff ;
d) dataBuf: 写到卡里的数据,长度为16个字节;
6)requestRead(int whichBlock , int whichKeyMode ,int[] keyBuf):读扇区的块,请求读取某个扇区的某块上的数据,参数说明:
a)whiBlock: 卡上块的地址,从0x00开始;
b)whichKeyMode: 码模式,0x60—KeyA, x61—KeyB,默认KeyA ;
c)keyBuf: 的密码,长度6个字节,卡的出厂密码是6个0xff ;
2. RfidDataListener:
1) onError(int request , int code):Rfid操作出错回调方法
a) request: 请求Rfid操作类型,RfidRequest.RFID_REQUEST_GET_UID请求读卡卡片的UID;RfidRequest.RFID_REQUEST_READ请求Rfid读取卡片上块的数据;RfidRequest.RFID_REQUEST_WRITE请求Rfid写数据到卡片上块。
b) code: 请求Rfid操作出错的代码,具体代码说明请查看RfidError
2) onRfidDataReady(int request , byte[] data):Rfid操作成功回调函数,写卡成功会返回长度为1的data byte数组,并且值为-1。
a) request:请求Rfid操作类型
b) Data : Rfid操作返回的数据,如请求读取uid则返回byte数据的uid数据
3. RfidError: 请求Rfid操作出错返回的代码
4. RfidRequest: 请求Rfid操作的类型:获取卡片Uid;读卡片块的数据;写数据到卡片
(B) 扫描:
1. ScanManager: 该类提供了扫描头扫描的方法
1) getInstance(String serialPort , int baudrate ):获取ScanManager实例,以触发扫描头进行扫描操作。
a) serialPort :Rfid模块连接到硬件串口号如/dev/ttyS0
c) Baudrate :Rfid模块通讯使用的波特率如115200
2) setOnScanDataListener(ScanDataListener listener) :设置扫描数据监听器
a) listener:扫描数据监听器
3) requestScan():触发扫描头进行触发操作。
4) recyle() :ScanManager资源回收,客户端软件结束时调用
2. ScanDataListener:扫描数据监听器,当扫描结束会通过监听器通知用户获取扫描数据。
1) onError(int error):扫描操作出错回调方法。
a) error:扫描出错代码,具体查看ScanError。
2) onDataReceived(final byte[] buffer): 扫描成功回调方法
B) buffer : 扫描数据
3. ScanError: 扫描出错代码
2、接口使用说明:把读卡扫描接口\libs拷贝到对应的工程目录,(具体请查阅demo源码,路径:读卡扫描接口\demo)
(A) RFID读卡:
1 .获取RfidManager实例
mRfidManager=RfidManager.getInstance("/dev/ttyMT0", SerialConstant.SERIAL_CONSTANT_BAUDRATE_115200) ;
2. 设置RfidManager数据监听器
mRfidManager.setOnRfidDataListener(new RfidDataListener() {
@Override
public void onRfidDataReady(int request, byte[] data) {
}
@Override
public void onError(int request, int code) {
}
});
3. 请求RfidManager操作
1).请求读取UID:
mRfidManager.requestUID();
2).请求读取卡片上块的数据:如读取卡片数据块2上的数据,块访问密码为6个0xff,密钥模式为0x60则
int[] keyBuf = {0xff,0xff,0xff,0xff,0xff,0xff};
mRfidManager.requestRead(0x02, 0x60, keyBuf);
3). 请求写数据到卡片上的块:如写16个字节到数据块2,块访问密码为6个0xff,密钥模式为0x60
int[] keyBuf = {0xff,0xff,0xff,0xff,0xff,0xff};
int[] dataBuf = {0x38 , 0x17 ,0x38 , 0x17 ,0x38 , 0x17 ,0x38 , 0x17 ,0x38 , 0x17 ,0x38 , 0x17 ,0x38 , 0x17 ,0x38 , 0x17};
mRfidManager.requestWrite(0x02,0x60,keyBuf, dataBuf);
4. RfidManager关闭回收
mRfidManager.recyle();
(B) 扫描:
1. 获取ScanManager实例
mScanManager=ScanManager.getInstance("/dev/ttyMT1",
SerialConstant.SERIAL_CONSTANT_BAUDRATE_9600);
2. 设置ScanManager数据监听器
mScanManager.setOnScanDataListener(new ScanDataListener() {
@Override
public void onError(int error) {
}
@Override
public void onDataReceived(byte[] buffer) {
}
});
3. 触发扫描
mScanManager.requestScan();
4. ScanManager关闭回收操作
mScanManager.recyle();
三.备注
1. Mifare 1卡片的存储容量为8192 BIT X 1位字长(即1K X 8位字长),采用EEPROM作为存储介质,整个结构划分为16个扇区,编为扇区0 ~~ 15。每个扇区有4个块(Block),分别为块0,块1,块2和块3。每个块有16个字节。一个扇区共有 16 Byte X 4 = 64 Byte
2. 扇区0的块0是特殊的,是厂商代码,已固化,不可改写。其中:第0~4个字节为卡片的序列号,第5个字节为序列号的校验码;第6个字节为卡片的容量“SIZE”字节;第7,8个字节为卡片的类型号字节,即Tagtype字节;其他字节由厂商另加定义
4. Key_Mode : 0x60 --KeyA
0x61 --KeyB
5.块地址: 0X00-----0X3F,如扇区0的4个块的地址分别是0x00,0x01,0x02,0x03
扇区1的4个块的地址分别是0x04,0x05,0x06,0x07
6. 擦除块就是把16个0x00写到块里
7. 每种卡的块的数量不同,S50为0~63 ,S70为0~255
8. 错误列表
Status code Meaning
0xF1 LRC error
0xF2 NO THIS CMD
0xF3 SET_ERRO
0xF4 PARA_ERRO
0xB1 NO_CARD
0xB2 ANTICOLL_ERROR
0xB3 SELECT_ERROR
0xB4 HALT_ERROR
0xB6 AUTH_ERROR
0xB7 READ_ERROR
0xB8 WRITE_ERROR
0xB9 VALUEOPER_ERROR
0xBA VALUEBAK_ERROR
0xBC RATS_ERROR
0xBE TPCL_ERROR
0xD1 POWERUP_ERROR
0xD2 POWEROFF_ERROR
0xD3 APDU_ERRO
0xD4 PTS_ERRO
0xD5 NO_SLOT
0xD6 CHACK_ERRO
9. 扇区密码:每个扇区的第4块是用来存放当前扇区的密码,并且只能用来存放密码不能存放其它数据,修改密码跟写块操作时一样的,只不过16个字节的数据时有固定的
的,6个字节密码A + 4个字节控制字 + 6个字节密码B ,一般卡用的密码模式是密码A ,控制字一定要遵守该块上的控制字,如果搞错控制字会写坏当前扇区。4个字节控制字(可以读该扇区的块3来获取), 6个字节密码B(可以读该扇区的块3来获取) 例子:读某个扇区的块3返回来的数据是:0,0, 0,0,0,0, 255,7,128,105 255,255,255,255,255,255 前6个0是密码A ,密码A是不能通过读卡读出来的,所以0不是密码A ;255,7,128,105 是4个字节的控制字,如果想修改该扇区的密码则把这4个控制字填到相应的位置,;255,255,255,255,255,255是密码B,修改密码是也把这6个字节填到相应的位置,比如我想改修改该扇区的密码为6个1,那16个字节的数据构成为:1,1,1,1,1,1 255,7,128,105 255,255,255,255,255,255。卡片出厂默认密码是6个255