以下JSR257介绍部分摘自http://java.sun.com/developer/technicalArticles/javame/nfc/
只做了部分翻译
JSR 257: Contactless Communication API 非接触式通信API
JSR 257提供了以非接触方式访问智能卡和条形码的接口,支持NFC三种通信模式中的两种(阅读器模式和卡模拟模式),非接触通信API 为邻近非接触更新定义了一套API接口,这些API包括五个JAVA包:
Javax.microedition.contactless 必须 所有目标侦测和公用类
Javax.microedition.contactless.ndef 可选 NDEF格式数据标签的通信
Javax.microedition.contactless.rf 可选 RFID标签的通信
Javax.microedition.contactless.sc 可选 与外部智能卡通信
Javax.microedition.contactless.visual 可选 读取/产生可视标签
MIDlet为运行与移动电话上的java应用程序,MIDlet应用JSR 257接口规范与SIM 卡/智能卡以及可通过NFC芯片与外部读卡器/外部SE(安全单元)/外部标签通信。但一般 与内卡交互使用JSR 177(不是很确定)
据悉:世界知名的通信协议软件提供商 Stollmann采用意法半导体提供的芯片已经实现了JSR 257接口规范。
一个典型的非接触通信应用流程如下:
1. 第一步是应用程序侦测手机支持的目标类型
2. 对于每个支持的目标类型,应用程序可以注册一个目标监听器从而接收活动通知。或应用可注册一个PushRegistry,支持卡模拟模式中的NDEF和SE的目标活动
3. 目标接近邻近场便被侦测到,轮流通过调用活动监听器通知应用,或PushRegistry激活MIDlet
4. 对于每一种被侦测到的目标,应用程序可以查到目标属性(target’s properties)
5. 应用程序可以与侦测到的目标进行连接,读,写和交换数据(目标是指such as NDEF tags, RFID tags, and external smartcards)
6. 完成后释放资源,应用程序关闭所有打开的连接
以下为JSR 257内部结构图:
由上图可见,DiscoveryManager为最重要的类,它负责管理监听器(注册监听器到DiscoveryManager),监听器包括目标监听器,事务监听器,NDEF记录监听器。
目标监听器TargetListener,可在对应事件中获取到目标属性及目标类型,根据目标属性,可以使用对应的目标连接。
ISO1443Connection接口继承自TagConnection,被用于符合ISO14443-4的非接触智能卡
PlainTagConnection接口继承自TagConnection,被用于RFID标签(非NFC)的连接
NDEFTagConnection接口继承自TagConnection,被用于NFC论坛格式的RFID标签和非接触智能卡
VisualConnection接口被用于可视标签(如条形码)的无线通信
使用卡模拟模式活动订阅通知
在卡模拟模式下,设备上的SE(安全单元)与一个外部读写卡器之间进行通信和交易。在交易发生时,应用程序被通知(唤醒),但应用程序并不参与。
如下图所示:
1. 内部SE和外部读写卡器交互
2. 应用程序(MIDlet)当外部读写卡器被侦测到时被唤醒
3. 如果需要,应用程序和SE通信,使用ISO14443Connection接口与SE通信,或者使用JSR 177实现SATSA与内部SE通信。但是这与外部读写卡器和内部SE之间的通信无关。
SE与外部读写卡器的通信对于应用程序来说是透明的。 与外部读写卡器和JAVA CARD通信一样,SE与外部读写卡器之间使用APDU命令。
一张取自java card技术介绍part1的图片:
1. 在非接触手机上,左侧是内部读写卡器,MIDlet或外部读写卡器(卡模拟模式)
2. 右侧是卡片部分,可能为内部SE或者外部SE,可通过SATSA或JSR 257访问。
3. 所有通信都是用APDU命令
注册和处理卡模拟活动
如前所述,当在卡模拟模式下,当外部读写卡器被侦测到时,应用程序(即MIDlet)被唤醒(通知),但是应用程序本身并不参与外部读写卡器与内部SE之间的业务。如果需要,应用程序可以使用APDU命令与内部SE通信,这个应用程序必须知道SE上的APPLET(即应用)。注册卡模拟活动订阅通知需要实现接口javax.microedition.contactless.TransactionListener 和它的方法externalReaderDetected(byte slot)。调用DiscoveryManager的dm.addTransactionListener(…)来注册监听器。以下为代码说明:
Listing 5 - Registering and Processing Card Emulation Activity
|
||
import javax.microedition.contactless.TransactionListener;
: :
// Register Transaction Listener try { dm.addTransactionListener(this); } catch (IllegalStateException e) { ... } catch (Exception e) { ... }
: :
/** * Called by the platform, when a card emulation event * has happened on the RFID hardware. * * @param slot is the slot needed to open the APDUConnection defined * in JSR 177 to the external secure element, may be * UNKNOWN_SLOT constant defined in this interface, if the * slot can not be identified. */ public void externalReaderDetected(byte slot) {
// Based on slot number above, using ISO14443Connection or SATSA // connect to applet, query applet, update screen, etc. ... } |
||