图1中说明的消息传递模型是所有java card通信的基础。它的核心就是应用程序协议数据单元(apdu),cad和java card框架之间交换的一个逻辑数据包。javacard框架接收任何cad发送进来的apdu命令并且传送到相应的小应用程序中。小应用程序处理apdu命令,然后返回一个响应apdu。那些apdu遵守国际标准规格iso/iec 7816 - 3和7816 - 4。

图1使用消息传递模型通讯
读卡器和卡之间的通信通常基于下面两种连接协议的一种,面向字节的t = 0,或者面向数据块的t = 1。还可能会用到被称为t = usb和t = rf的替换协议。jcre apdu类向应用程序隐藏了一些协议细节,但不是全部,因为t = 0协议相当的复杂。
⒈apdu命令
一个apdu命令的结构由它的第一个字节的值控制,大部分情况下看上去如下所示:

图2、apdu命令
一个apdu命令有一个必须有的头和一个可选的体,包含:
? cla(1字节):这个必要的字段识别指令的一个特定应用程序类。有效的cla值在iso 7816 - 4规范中定义:
表格1、iso 7816 cla值
cla 值 | 指令类 |
0x0n, 0x1n | iso 7816 - 4卡指令,比如文件存取和安全操作 |
20 to 0x7f | 保留 |
0x8n or 0x9n | 你可以用作你的特定的应用程序指令的iso/iec 7816 - 4格式,根据标准解释' x ' |
0xan | 特定的应用程序或者供应商的指令 |
b0 to cf | 你可以用作特定应用程序的iso/iec 7816 - 4格式 |
d0 to fe | 特定的应用程序或者供应商的指令 |
ff | 保留给协议类型选择 |
? 理论上,你可以使用所有的cla值0x80或者更高值来用于特定应用程序指令,但是在许多现在的java card实现中,只有黑体显示的是实际认可的。
? ins(1字节):这个必需的字段指明cla字段中标示的指令类中的一个特定指令。iso 7816 - 4标准指定用于访问卡上的数据的基本指令,当它根据在像标准中定义的卡上的文件系统那样结构化的时候。附加功能已经在这个标准中的其它地方说明,其中一些是安全功能。表2中是一个iso 7816指令的列表。只有当使用一个相应的cla字节值时,你才可以根据标准定义你自己的特定应用程序的ins值,。
表格2、当 cla = 0x时的iso 7816 - 4 ins值
ins 值 | 命令描述 |
0e | erase binary |
20 | verify |
70 | manage channel |
82 | external authenticate |
84 | get challenge |
88 | internal authenticate |
a4 | select file |
b0 | read binary |
b2 | read record(s) |
c0 | get response |
c2 | envelope |
ca | get data |
d0 | write binary |
d2 | write record |
d6 | update binary |
da | put data |
dc | update record |
e2 | append record |
? p1(1字节):这个必需的字段定义指令参数1。你可以使用这个字段来检验ins字段,或者用于输入数据。
? p2(1字节):这个必需的字段定义指令参数⒉你可以使用这个字段来检验ins字段,或者用于输入数据。
? lc(1字节):这个可选的字段是命令的数据字段的字节数。
? 数据字段(可变的,字节lc数):这个可选的字段保存命令数据。
? le(1字节):这个可选的字段指定在期望响应的数据字段中的极限字节数。
取决于命令数据的存在与否以及相应是否必须,命令apdu有四种变化。只有在你使用协议t = 0时,你才需要关心这些变化:
图3、apdu命令的四个可能的结构
一个典型的应用程序将以不同的结构方式使用不同的apdu命令。
2、响应apdu
响应apdu的格式很简单的:

图4、响应apdu
和一个apdu命令相似,响应apdu有可选择的和必要的字段:
? 数据字段(可变长度,由apdu命令中的le确定):这个可选择的字段包含小应用程序返回的数据。
? sw1(1字节):这个必要的字段是状态字1。
? sw2(1字节):这个必要的字段是状态字2。
这些状态字的值在iso 7816 - 4规范中定义:

图5、响应状态码
java card框架应用编程接口中的iso7816 java接口定义了许多常数来帮助规范返回错误代码。
3、过程apdu
每当有一个进入的apdu用于所选择的小应用程序,jcre就调用小应用程序的process ()方法,把进入的apdu作为一个参数传送。这个小应用程序必须解析apdu命令,处理数据、生成一个响应apdu,然后把控制权返回给jcre。
rmi(jcrmi)通讯模型
第二种通信模型依靠j2se rmi分布式对象模型的一个子集。
在rmi模型中,一个服务器应用程序创建并生成可访问的远程对象,并且一个客户应用程序获得到远程对象的远程引用,然后调用它们的远程方法。在jcrmi中,java card小应用程序是服务器,而主应用程序是客户端。
jcrmi由类rmiservice提供到扩展程序包javacardx.rmi中。jcrmi消息被封装到传入rmiservice方法的apdu对象中,换句话说,jcrmi提供了一个基于apdu消息传递模型的分布式对象模型机制,通过这个机制服务器和客户端通信,来回传送方法信息、参数和返回值。