读写器开发使用说明
IC卡内部存储结构知识:
本读写器支持ISO14443 TYPE A标准的Mifare One系列卡。Mifare One卡的内部存储结构分为16个扇区,从第0区到第15区,每个扇区有独立的密码和权限控制字,可作为独立的电子钱包,每个扇区有4个块,序号为第0块、第1块、第2块、第3块,每块16个字节,第3块是卡的密码和权限控制字专用块,禁止在此存放数据。第0块、第1块、第2块可随意存放数据。但第0区的第0块已被固化了IC卡出厂信息,此块只能读出信息,不可更改。
每张卡都有一个全球统一的4个字节的序列号。许多公司销售的读卡模块只有读取卡序列号的功能,也能用于一般的考勤系统。但这类读卡模块跟本公司的读写器有着本质的不同,本公司的读写器不仅能读序列号,而且还有服务于IC卡所有用途的功能,比如选中卡、认证、读卡、写卡、改密码、休眠卡能功能。
二、单片机串/UART/232接口控制协议
硬件接口提示
波特率参数为:19200,N,8,1
发送帧格式
帧长度(1字节) | 帧内容(不超过50个字节) | 帧内容的和校验(1字节) |
接收帧格式
帧长度(1字节) | 帧内容(不超过50个字节) | 帧内容的和校验(1字节) |
注:帧长度仅指帧内容的字节数
1、读IC卡号
功能 | 只读取IC卡序列号 | |
发送 |
注:0xF0前面的0x表示F0为十六进制数据,等于十进制的240
如:01 F0 F0
寻到卡时返回:
如: 发送:01 F0 F0 ,有卡时返回:05 00 40 AD 8B 28 4E 其中4E = 00 异或 40异或AD异或8B异或28;
| |
返回 |
| 寻不到卡 |
| 有两张以上卡片同时在感应区,发生冲突 | |
| 无法选择激活卡片 | |
| 卡片序列号已读取 |
2、集成读卡
功能 | 集成读卡,可以一次性读整个区的第0块、第1块、第2块共3块的信息,并且返回卡序列号。 | |
发送 | 0x0e(帧长度),0x78(命令字),控制字,卡号序列号[0~3](4个字节),区号,A/B密码,卡密码[0~5](5个字节),帧校验(1个字节)。 例如:发送:
如:0E 78 17 00 00 00 00 08 AA FF FF FF FF FF FF
寻不到卡时返回:
寻到卡时返回:
如:35 00 40 AD 8B 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4E
控制字:
推荐使用方法如下: //先定义以下常量 #define BLOCK0_EN 0x01//读第0块 #define BLOCK1_EN 0x02//读第1块 #define BLOCK2_EN 0x04//读第2块 #define NEEDSERIAL 0x08//是否指定卡序列号 #define EXTERNKEY 0x10//用帧内容中的密码认证或用事先已设定在读卡器中的密码认证 举例: //以下控制字含义:读块0、块1、块2,仅读指定序列号的卡,需要每次指定密码 控制字= BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + NEEDSERIAL+ EXTERNKEY //以下控制字含义:读块0、块2,可读任意卡,需要每次指定密码 控制字= BLOCK0_EN + BLOCK2_EN + EXTERNKEY //以下控制字含义:读块0、块2,可读任意卡,启用芯片内部密码 控制字= BLOCK0_EN + BLOCK2_EN
卡号序列号:如果在控制字的bit3为0 ,则Serial数组的内容无需赋值,否则需要赋值以便使其寻找指定的卡号。
区号指需要读出的区号,则0-15中的某个数,一张卡有16个区,各个区有单独密码
A/B密码为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。
卡密码出厂时为6个0xFF
| |
返回
| 0x01,0x08,0x08 | 寻不到卡 |
0x01,0x09,0x09 | 有两张以上卡片同时在感应区,发生冲突 | |
0x01,0x0a,0x0a | 无法选择激活卡片 | |
0x05,0x0b,卡号[0~3], 帧校验 | 密码装载失败,卡片序列号已知 | |
0x05,0x0c,卡号[0~3] , 帧校验 | 密码认证失败,卡片序列号已知 | |
0x05,0x01,卡号[0~3] , 帧校验 | 密码认证成功,卡片序列号已知,但读取扇区内容失败 | |
0x35,0x02,卡号[0~3],扇区内容[0~47] , 帧校验 | 第0块读出,但第1、2块没读出,仅扇区内容前16个字节的数据有效 | |
0x35,0x03,卡号[0~3],扇区内容[0~47] , 帧校验 | 第0、1块读出,但第2块没读出,仅扇区内容前32个字节的数据有效 | |
0x35,0x00,卡号[0~3],扇区内容[0~47] , 帧校验 | 第0、1、2块读出,扇区内容所有数据有效 |
3、集成写卡:
功能 | 集成读卡,写卡,可以一次性写整个区的第0块、第1块、第2块信息。 | |
发送 | 0x35(帧长度),0x69(命令字),控制字,卡号序列号[0~3](4个字节),区号,A/B密码,卡密码[0~5](6个字节),块0数据[0~15](16个字节),块1数据[0~15] (16个字节),块2数据[0~15] (16个字节),校验码
如:3E 69 17 00 00 00 00 08 AA FF FF FF FF FF FF 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F DC 控制字:
推荐使用方法如下: //先定义以下常量 #define BLOCK0_EN 0x01//写第0块 #define BLOCK1_EN 0x02//写第1块 #define BLOCK2_EN 0x04//写第2块 #define NEEDSERIAL 0x08//是否指定卡序列号 #define EXTERNKEY 0x10//用帧内容中的密码认证或用事先已设定在读卡器中的密码认证 举例: //以下控制字含义:写块0、块1、块2,仅写指定序列号的卡,需要每次指定密码 控制字= BLOCK0_EN + BLOCK1_EN + BLOCK2_EN + NEEDSERIAL+ EXTERNKEY //以下控制字含义:写块0、块2,可写任意卡,需要每次指定密码 控制字= BLOCK0_EN + BLOCK2_EN + EXTERNKEY //以下控制字含义:写块0、块2,可写任意卡,启用芯片内部密码 控制字= BLOCK0_EN + BLOCK2_EN
卡号序列号:如果在控制字的bit3为0 ,则Serial数组的内容无需赋值,否则需要赋值以便使其寻找指定的卡号。
区号指需要写进的区号,则0-15中的某个数,一张卡有16个区,各个区有单独密码,可独立使用
A/B密码为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。
卡密码出厂时为6个0xFF
| |
返回
| 0x05,0x08,0x08 | 寻不到卡 |
0x05,0x09,0x09 | 有两张以上卡片同时在感应区,发生冲突 | |
0x05,0x0a,0x0a | 无法选择激活卡片 | |
0x05,0x0b,卡号[0~3],校验码 | 密码装载失败,卡片序列号已知 | |
0x05,0x0c,卡号[0~3] ,校验码 | 密码认证失败,卡片序列号已知 | |
0x05,0x01,卡号[0~3] ,校验码 | 密码认证成功,卡片序列号已知,但写扇区内容失败 | |
0x05,0x02,卡号[0~3] ,校验码 | 第0块写入成功,但第1、2块写入失败 | |
0x05,0x03,卡号[0~3] ,校验码 | 第0、1块写入成功,但第2块写入失败 | |
0x05,0x00,卡号[0~3] ,校验码 | 第0、1、2块写入成功,如05 00 40 AD 8B 28 4E |
驱动蜂鸣器响:
发送:
改扇区密码:
功能 | 改扇区密码,在知道原密码的情况下改某一扇区的密码。 | |
发送 | 0x14(帧长度),0x3C(命令字),控制字,卡号序列号[0~3](4个字节),区号,A/B密码,卡旧密码[0~5](6个字节),卡新密码[0~5](6个字节),校验码。 如:14 3C 00 00 00 00 00 08 AA FF FF FF FF FF FF 88 88 88 88 88 88 9E
控制字:
推荐使用方法如下: //先定义以下常量 #define NEEDSERIAL 0x08 举例: //以下控制字含义:只改动指定序列号的卡 控制字= NEEDSERIAL
//以下控制字含义:改动任何卡 控制字= 0
卡号序列号:如果在控制字的bit3为0 ,则Serial数组的内容无需赋值,否则需要赋值以便使其寻找指定的卡号。
区号指需要写进的区号,则0-15中的某个数,一张卡有16个区,各个区有单独密码,可独立使用
A/B密码为0时以B密码来认证,为非0时以A密码来认证。刚出厂的卡以A密码来认证。
卡密码出厂时为6个0xFF
| |
返回(帧内容,不包括帧长度和帧校检码)
| 0x01,0x08,0x08 | 寻不到卡 |
0x01,0x09 | 有两张以上卡片同时在感应区,发生冲突 | |
0x01,0x0a | 无法选择激活卡片 | |
0x05,0x0b,卡号[0~3],校验码 | 密码装载失败,卡片序列号已知 | |
0x05,0x0c,卡号[0~3] ,校验码 | 密码认证失败,卡片序列号已知 | |
0x05,0x00,卡号[0~3] ,校验码 | 改密码成功 |