android串口通信——身份证识别器
本文主要解决的问题:
1.身份证识别器硬件的使用
2.读取到数据的解析
一、身份证识别器基础
1.调用身份证识别器的步骤
调用身份证识别器的步骤分为三步:
- 1.寻找身份证信息
- 2.选取身份证信息
- 3.读取身份证信息
2.波特率
身份证识别器的默认波特率是115200。
3.基本指令
1、寻找身份证信息:
寻卡命令: AA AA AA 96 69 00 03 20 01 22
返 回 值: AA AA AA 96 69 00 08 00 00 9F 00 00 00 00 972、选取身份证信息:
选卡命令: AA AA AA 96 69 00 03 20 02 21
返 回 值: AA AA AA 96 69 00 0C 00 00 90 00 00 00 00 00 00 00 00 9C3、读取身份证信息(文字+照片信息):
读卡命令: AA AA AA 96 69 00 03 30 01 32
返 回 值: 1295 字节数据身份证信息4 、 读取身份证信息(文字+照片+指纹特征点信息)
读卡命令: AA AA AA 96 69 00 03 30 10 23
返回 值: 2321 或 1809 或 1297 字节数据身份证信息
4. 身份证信息结构
身份证信息(文字+照片)结构:
AA AA AA 96 69 05 08 00 00 90 01 00 04 00 +( 256 字节文字信息 ) +( 1024 字节
照片信息) +( 1 字节 CRC)身份证信息(文字+照片+指纹)结构:
AA AA AA 96 69 09 0A 00 00 90 01 00 04 00 04 00 +( 256 字节文字信息) +
( 1024 字节图片信息) +( 1024 或 512 或 0 字节指纹信息) +1 字节校验位 指
纹数据的具体大小由第十五和第十六字节判断 (04 00)=4*16*16=1024
(02 00)=2*16*16=512
5.文字结构说明
文字信息采用 GB 13000 的 UCS-2 进行存储, 各项目分配如下:
项目 | 长度(字节) | 说明 |
---|---|---|
姓名 | 30 | 汉字 |
性别 | 2 | 代码 |
民族 | 4 | 代码 |
出生 | 16 | 年月日: YYYYMMDD |
住址 | 70 | 汉字和数字 |
公民身份号码 | 36 | 数字和字母X(x) |
签发机关 | 30 | 汉字 |
有效期起始日期 | 16 | 年月日: YYYYMMDD |
有效期截止日期 | 16 | 年月日: YYYYMMDD 有效期为长期时存储 “长期” |
备用 | 36 | 汉字 |
6.民族代码对照表
编号 | 名族 | 编号 | 名族 | 编号 | 名族 | 编号 | 名族 |
---|---|---|---|---|---|---|---|
01 | 汉 | 15 | 土家 | 29 | 柯尔克孜 | 43 | 乌孜别克 |
02 | 蒙古 | 16 | 哈尼 | 30 | 土 | 44 | 俄罗斯 |
03 | 回 | 17 | 哈萨克 | 31 | 达斡尔 | 45 | 鄂温克 |
04 | 藏 | 18 | 傣 | 32 | 仫佬 | 46 | 德昂 |
05 | 维吾尔 | 19 | 黎 | 33 | 羌 | 47 | 保安 |
06 | 苗 | 20 | 傈僳 | 34 | 布朗 | 48 | 裕固 |
07 | 彝 | 21 | 佤 | 35 | 撒拉 | 49 | 京 |
08 | 壮 | 22 | 畲 | 36 | 毛南 | 50 | 塔塔尔 |
09 | 布依 | 23 | 高山 | 37 | 仡佬 | 51 | 独龙 |
10 | 朝鲜 | 24 | 拉祜 | 38 | 锡伯 | 52 | 鄂伦春 |
11 | 满 | 25 | 水 | 39 | 阿昌 | 53 | 赫哲 |
12 | 侗 | 26 | 东乡 | 40 | 普米 | 54 | 门巴 |
13 | 瑶 | 27 | 纳西 | 41 | 塔吉克 | 55 | 珞巴 |
14 | 白 | 28 | 景颇 | 42 | 怒 | 56 | 基诺 |
97 | 其他 | 98 | 外国血统中国籍人士 |
7.性别代码对照表
编号 | 说明 |
---|---|
0 | 未知 |
1 | 男 |
2 | 女 |
9 | 未说明 |
二、身份证的读取
首先需要知道身份证的波特率和硬件连接地址,身份证的波特率默认是115200
1.读取的方法调用
/**
* 读取 身份证信息
*
* @param view
*/
public void readIdCard(View view) {
//1.硬件地址判断
String adress = addressTv.getText().toString().trim();
if ("".equals(adress)) {
Toast.makeText(this, "请选择硬件地址", Toast.LENGTH_SHORT).show();
return;
}
//2.波特率判断
String bauteStr = bauteRateTv.getText().toString().trim();
if ("".equals(bauteStr)) {
Toast.makeText(this, "请选择波特率", Toast.LENGTH_SHORT).show();
return;
}
new IDCardReadUtils(this).queryIdCardInfo(adress, Integer.parseInt(bauteStr), new IDCardReadUtils.IDCardListener() {
@Override
public void onInfo(IdCardBean bean) {
//输出身份证信息
infoTv.setText(bean.word.toMyString());
//头像的显示
decodeImagexxx(bean.headImage);
}
});
}
public String bmpPath = "/sdcard/photo.bmp";
public String wltPath = "/sdcard/photo.wlt";
public void decodeImagexxx(byte[] wlt) {
if (wlt == null) {
return;
}
try {
File wltFile = new File(wltPath);
FileOutputStream fos = new FileOutputStream(wltFile);
fos.write(wlt);
fos.close();
DecodeWlt dw = new DecodeWlt();
int result = dw.Wlt2Bmp(wltPath, bmpPath);
if (result == 1) {
File f = new File(bmpPath);
if (f.exists())
headIv.setImageBitmap(BitmapFactory
.decodeFile(bmpPath));
else {
// imageViewPhoto.setImageResource(R.drawable.photo);
}
} else {
// imageViewPhoto.setImageResource(R.drawable.photo);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
2.身份证的工具类(IDCardReadUtils)
这个类主要处理
1.读取身份证信息
①寻找身份证信息
②选取身份证信息
③读取身份证信息
2.把读取到信息进行处理,封装bean
package com.qwm.idcarddemo.utils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import com.qwm.idcarddemo.bean.IdCardBean;
import com.qwm.idcarddemo.bean.SerialPortSendData;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
/**
* @author qiwenming
* @date 2016/1/19 0019 下午 6:02
* @ClassName: IDCardReadUtils
* @ProjectName:
* @PackageName: com.qwm.idcarddemo.utils
* @Description