当前位置:首页 > JAVA card
用程序。后端应用程序如何开发超出了本文的范围。
2、在卡外,驻留在一个卡片终端上,主应用程序使用许多用于卡片访问的接口之一来访问智能卡上的小应用程序,例如Java Card RMI、OpenCard Framework应用编程接口或者Security and Trust Services应用编程接口( SATSA)。
3、读卡器,卡片终端或者卡片接收设备,提供主应用程序和卡上小应用程序之间的物理接口。
4、卡上的是Java Card小应用程序和Java Card框架。注意,在访问小应用程序之前,主应用程序必须提供证书并且验证自己。
编写一个主应用程序-访问你的小应用程序
客户端上的主应用程序处理用户、JavaCard小应用程序和供应商的后端应用程序之间的通讯。主程序访问你的小应用程序提供的服务。它存在于终端或者卡片接收设备上,例如一个工作站、一个售货点( POS)终端、一个手提电话或者一个机顶盒。回想一下一个主机应用程序和小应用程序使用ISO - 7816 APDU命令经由读卡器或终端进行交互。
传统的读卡端应用程序使用C语言编写,但是主机程序可以使用Java程序语言或者其他语言编写,只要它能够与小应用程序交换有效的ISO - 7816 APDU命令。
现在部署的大部分的手提电话整合一个智能卡阅读器访问捆绑在它上面的SIM卡。使用即将到来的JSR 177、用于J2ME的安全和信任服务应用编程接口(SATSA)和J2ME设备的广泛采用,我们可以想象有许多主应用程序将使用移动设备上的Java技术编写。SATSA的意图是启动一个运行在基于J2ME的设备上的Java Card主应用程序。JSR 177目前处在JCP团体审查阶段。
当你编写客户端应用程序的时候,有三个主要的应用程序编程接口可用:OpenCard Framework、JavaCard RMI Client应用编程接口和安全与信任服务应用编程接口( SATSA)。我们将依次看看这些应用程序编程接口。 OpenCard框架介绍
智能卡供应商一般不仅提供开发工具箱,而且提供支持读取端应用程序和JavaCard小应用程序的应用程序编程接口。许多供应商支持OpenCard框架( OCF),这是一套基于Java的应用程序编程接口,把一些来自不同的供应商的与读卡器交互的细节隐藏起来。
OpenCard联盟是一群推动OpenCard框架定义与采用的公司,目前OpenCard框架是1.2版本。OCF的目标是提供给主机端应用程序的开发者跨不同的卡片读取器供应商工作的应用编程接口。
OCF为你定义许多标准卡服务。其中两个是FileAccessCardService和
SignatureCardService。一个特殊的类型是ApplicationManagerCardService,提供了在卡上安装、注册和删除小应用程序的生命周期管理方法。
当编写一个主机端基于OCF的应用程序时,你基本上要把它分离成两个部分:
1、和终端或者读取器交互的主应用程序对象(初始化OCF,等待卡片插入并且终止OCF),并且能够显露高级的卡片访问方法,例如getBalance ()。
2、一个实现实际的低级通道管理和APDU输入/输出的小应用程序代理。当把APDU细节从应用程序中隐藏起来的时候,这个代理(Proxy)设计模式允许你显露一个面向对象接口。
Figure 2. OCF应用程序的结构
总之,一个典型的OCF应用程序具有一个或多个main对象,都是在主机上创建,可能再它们的自己执行的线程上。这些main应用程序对象显露了高级的特定应用程序调用,这些最终都被委托给小应用程序代理。它们使用SmartCard对象,这是应用程序到OCF的入口点,启动应用程序来初始化并且关闭OCF,并且等待卡片被插入。main对象可以实现一个CTListener,你不久将看到,这个监听者提供了诸如卡片插入和拔出等事件的异步标志信息。
你可以使用一个同步或者异步模型编写你的应用程序。
在同步模型中,你的主应用程序初始化OCF,然后等待卡片被插入。然后它执行你的main应用程序逻辑,并且在完成的时候关闭OCF:
... try {
// Initialize OCF SmartCard.start(); // Wait for a smart card
CardRequest cr = new CardRequest(CardRequest.NEWCARD, null, OCFCardAccessor.class);
SmartCard myCard = SmartCard.waitForCard(cr);
// Main client work is done here... ...
} catch (Exception e){ // Handle exception } finally { try {
// Shut down OCF SmartCard.shutdown(); } catch (Exception e) { e.printStackTrace(); } } ...
列表⒈一个同步OCF应用程序的典型结构
如果你喜欢使用异步的途径,你的类必须实现CTListener接口,并且,在初始化阶段,注册它自己用于诸如插入和拔出等卡片终端事件的通知。下面的应用程序骨架以初始化OCF和注册监听者开始,然后定义了用于有效事件的回调方法。
public class MyHostSideApp implements CTListener ... public MyHostSideApp() { try { // Initialize the framework SmartCard.start (); // Register this as a Card Terminal Event Listener CardTerminalRegistry.getRegistry().addCTListener(this); } catch (Exception e) { // handle error... } }
public void cardInserted(CardTerminalEvent ctEvent) { ... }
public void cardRemoved(CardTerminalEvent ctEvent) { ... } ... }
列表2、一个异步OCF应用程序的典型结构
当一张卡片被插入时,运行时间调用cardInserted ()方法,并且当卡片被拔出时,运行时间调用cardRemoved()方法。在下面的代码中,插入卡片初始化小应用程序代理的创建,并且拔出卡片触发小应用程序代理的清除。代码列表还说明了信用卡余额请求代理。
import opencard.core.event.CTListener; import opencard.core.event.CardTerminalEvent; import opencard.core.service.SmartCard; import opencard.core.service.CardService; ...
public class MyHostSideApp implements CTListener {
public void MyHostSideApp() { try {
// Initialize the framework SmartCard.start ();
// Register this as a Card Terminal Event Listener CardTerminalRegistry.getRegistry().addCTListener(this); } catch (Exception e) { // Handle error. ... } } /**
* Card insertion event. Get new card and card service * @param ctEvent The card insertion event.
共分享92篇相关文档