数据输入格式
Preamble (5个字节,AA AA AA 96 69, 前3个字节用于 帧同步, 后面2个字节,表示帧开始)
数据长度 (2个字节,高位在前,低位在后, 数据长度是指 本帧之后的所有有效数据的长度,CMD+Para+Data+CHKSUM)
CMD (命令,1个字节)
Para (参数,1个字节)
Data (数据,n个字节)
CHK_SUM (校验和,1个字节, 数据帧中除帧头和校验和之外的数据逐字节按位异或的结果)
数据输出格式:
Preamble (5个字节,跟输入格式中的一样,也是 AA AA AA 96 69)
数据长度 (2个字节,高位在前,低位在后, 有效数据=SW1+SW2+SW3+Data+CHK_Sum)
SW1,SW2(各1字节, 阅读器转发证卡 回应的APDU中的SW1,SW2)
SW3 (1字节, 阅读器自身的状态码)
说明 | 命令CMD | 参数Para |
复位 | 10 | FF |
状态检测 | 11 | FF |
读SAM模块编号 | 12 | FF |
寻找身份证 | 20 | 01 |
选取身份证 | 20 | 02 |
读取基本信息 | 30 | 01 |
读取最新追加信息 | 30 | 03 |
设置串口速率115200 bps | 60 | 00 |
设置串口速率57600bps | 60 | 01 |
设置串口速率38400bps | 60 | 02 |
设置串口速率19200bps | 60 | 03 |
设置串口速率9600bps | 60 | 04 |
状态
SW1 SW2 SW3 | Data | 说明 |
00 00 90 | 和具体命令有关,可能为空 | 操作成功 |
00 00 9F | 卡的IIN | 返回找卡成功信息 |
00 00 10 | 接收业务终端数据的校验和错误 | |
00 00 11 | 接收业务终端数据的长度错误 | |
00 00 21 | 接收业务终端的命令错误,包括命令中的各种数值或者逻辑搭配错误 | |
00 00 24 | 无法识别的错误 | |
XX XX 31 | 身份证对阅读器认证失败 | |
00 00 32 | 阅读器对身份证认证失败 | |
00 00 33 | 信息验证错误 | |
00 00 40 | 错误的卡 | |
XX XX 41 | 读身份证失败 | |
XX Xx 47 | 取随机数失败 | |
00 00 60 | 阅读器自检失败,不能接收任何命令 | |
00 00 66 | 阅读器未经过授权,无法使用 | |
00 00 80 | 搜寻身份证失败 | |
XX XX 81 | 选取身份证失败 | |
00 00 91 | 没有这项内容 |
读取基本信息的响应
aaaaaa9669 (Preamble)
0508 (长度)
00 00 90 (SW1 SW2 SW3)
data(长度为1284字节的数据, 1284+1+3=1288=0x508)
chksum
data的内容
0100 (文字信息的长度, 256字节)
0400 (照片的长度)
姓名 (30个字节), 也就是说姓名最长的为15个字,不足的补空格
性别(2个字节) 男=1, 女=0
民族 (4个字节)
出生日期(16个字节)
住址(70个字节,最多35个字,不足的补空格)
身份证号(36字节)
签发机关(30个字节,最多15个字,不足的补空格)
有效起始 (16个字节)
有效结束( 16个字节, 年满46周岁的,此处为汉字”长期”, 补空格)
长度36的备用字节, 用空格填充
校验和算法:
def calculate_xor_checksum(message): checksum = 0 for e in message: checksum ^= e return checksum