关闭

[置顶] ACR122U Android端应用开发入道指南

标签: androidACR122URFID
744人阅读 评论(0) 收藏 举报
分类:

前言

“API指导”为本文的核心部分,其翻译自官方的API文档。在“参考资料”部分说明了我所参考的官方API的版本,并提供下载地址。为便于理解并着手开发,我在“相关知识”部分顺便添加了我查找到的与之相关的必备知识。


参考资料

  1. 官方API文档
    我主要参考官方提供的API文档来学习开发,其版本是1.1.3,请点击这里下载我上传到CSDN的开发包,内含API文档;或者从龙杰公司的官网下载,请点击这里前往,然后选择“下载”页面来下载。

  2. 应用程序接口指南
    此外,官方给出的应用程序接口说明文档也是必备的且极其重要的参考资料,我参考的是2.02版本,可以点击这里下载我上传到CSDN的文档,或者从龙杰公司的官网下载,请点击这里前往,选择“下载”页面来下载。


API指导

com.acs.smartcard 包描述

提供了在Android 3.1以及以上的系统中与ACS智能卡读卡器进行通讯的类和接口。为了创建并初始化一个Reader对象,先要通过调用Context.getSystemService()获得一个UsbManager的对象。

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
Reader reader = new Reader(manager);

如果你想在你的应用中检测卡片,你应该为Reader对象提供一个Reader.OnStateChangeListener对象

reader.setOnStateChangeListener(new OnStateChangeListener() {
    @Override
    public void onStateChange(int slotNum, int prevState, int currState) {
        // TODO: Add your code here
    }
});

Opening Reader:打开读卡器

为了打开一个读卡器,你需要从UsbManager获得一个UsbDevice对象并请求一个访问该设备的权限,或者你可以使用一个intent filter来发现一个设备。更多的信息,请参考Android开发指导的“USB Host”部分。

try {
    reader.open(device);
} catch (IllegalArgumentException e) {
    e.printStackTrace();
}

如果UsbDevice对象不被支持或者由于通讯错误而不能被打开时,将抛出IllegalArgumentException(不合法的参数异常)。

Closing Reader:关闭读卡器

在你关闭了应用后Android系统不会自动关闭USB设备。你将不能在下次打开应用时使用在上次使用后没有拔出的读卡器。因此,建议你在关闭应用前要先关闭读卡器。

reader.close();

Resetting Card:重置卡片

在传输APDU(应用协议数据单元)之前,你需要先对卡片上电。如果卡片被正产地打开,ATR字符串将被返回。否则,它将返回一个指示错误的异常。

try {
    byte[] atr = reader.power(slotNum, Reader.CARD_WARM_RESET);
} catch (ReaderException e) {
    e.printStackTrace();
}

Setting Protocol:设置协议

在卡片上电后,卡片的状态变为可协商的(Reader.CARD_NEGOTIABLE)或者指定的(Reader.CARD_SPECIFIC).当卡片的状态不是指定的时你不能传输APDU命令。要选择一个协议,调用Reader.setProtocol()方法并将首选的协议作为其参数。

try {
    reader.setProtocol(slotNum, Reader.PROTOCOL_T0 | Reader.PROTOCOL_T1);
} catch (ReaderException e) {
    e.printStackTrace();
}

Transmitting APDU:传输APDU

在选择协议后,你可以使用Reader.transmit()来传输APDU命令。

byte[] command = { 0x00, 0x84, 0x00, 0x00, 0x08 };
byte[] response = new byte[300];
int responseLength;
try {
    responseLength = reader.transmit(slotNum, command, command.length, response,
            response.length);
} catch (ReaderException e) {
    e.printStackTrace();
}

Controlling Reader:控制读卡器

如果读卡器支持一套escape commands,你可以使用Reader.control()来控制读卡器。

// Get firmware version (ACR122)
byte[] command = { 0xFF, 0x00, 0x48, 0x00, 0x08 };

byte[] response = new byte[300];
int responseLength;
try {
    responseLength = reader.control(slotNum, Reader.IOCTL_CCID_ESCAPE, command,
            command.length, response, response.length);
} catch (ReaderException e) {
    e.printStackTrace();
}

Since:1.0


相关知识

概念术语

  1. APDU
    Application protocol Data Unit,应用协议数据单元。(在此直接贴维基百科上的内容)
    这里写图片描述
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16683次
    • 积分:323
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:3篇
    • 评论:11条
    最新评论