Class CardChannel

java.lang.Object
javax.smartcardio.CardChannel

public abstract class CardChannel extends Object
与智能卡建立的逻辑通道连接。用于与智能卡交换APDU。可以通过调用方法Card.getBasicChannel()Card.openLogicalChannel()来获取CardChannel对象。
自版本:
1.6
参见:
  • Constructor Details

  • Method Details

    • getCard

      public abstract Card getCard()
      返回与此通道关联的智能卡。
      返回:
      与此通道关联的智能卡
    • getChannelNumber

      public abstract int getChannelNumber()
      返回此CardChannel的通道号。通道号为0表示基本逻辑通道。
      返回:
      此CardChannel的通道号。
      抛出:
      IllegalStateException - 如果此通道已被关闭或者对应的智能卡已被断开连接
    • transmit

      public abstract ResponseAPDU transmit(CommandAPDU command) throws CardException
      传输指定的命令APDU到智能卡,并返回响应APDU。

      命令APDU的CLA字节会自动调整以匹配此CardChannel的通道号。

      请注意,此方法不能用于传输MANAGE CHANNEL APDU。逻辑通道应该使用Card.openLogicalChannel()CardChannel.close()方法进行管理。

      实现应该透明地处理传输协议的特性。例如,在使用T=0协议时,应按照ISO/IEC 7816-4中描述的进行以下处理:

      • 如果响应APDU的SW1为61,则实现应使用SW2作为Le字段发出GET RESPONSE命令。只要接收到61,就重复此过程。这些交换的响应体将连接在一起形成最终的响应体。

      • 如果响应APDU为6C XX,则实现应使用XX作为Le字段重新发出命令。

      此方法返回的ResponseAPDU是在执行此处理后的结果。

      参数:
      command - 命令APDU
      返回:
      从卡中接收到的响应APDU
      抛出:
      IllegalStateException - 如果此通道已被关闭或者对应的智能卡已被断开连接
      IllegalArgumentException - 如果APDU编码了MANAGE CHANNEL命令
      NullPointerException - 如果command为null
      CardException - 如果卡操作失败
    • transmit

      public abstract int transmit(ByteBuffer command, ByteBuffer response) throws CardException
      传输存储在命令ByteBuffer中的命令APDU,并在响应ByteBuffer中接收响应APDU。

      命令缓冲区必须包含从command.position()开始的有效命令APDU数据,APDU必须为command.remaining()字节长。返回时,命令缓冲区的位置将等于其限制;其限制不会改变。输出缓冲区将接收到响应APDU字节。其位置将根据接收到的字节数前进,这也是此方法的返回值。

      命令APDU的CLA字节会自动调整以匹配此CardChannel的通道号。

      请注意,此方法不能用于传输MANAGE CHANNEL APDU。逻辑通道应该使用Card.openLogicalChannel()CardChannel.close()方法进行管理。

      有关处理具有SW1值616C的响应APDU的讨论,请参见transmit()

      参数:
      command - 包含命令APDU的缓冲区
      response - 应从卡中接收响应APDU的缓冲区
      返回:
      接收到的响应APDU的长度
      抛出:
      IllegalStateException - 如果此通道已被关闭或者对应的智能卡已被断开连接
      NullPointerException - 如果command或response为null
      ReadOnlyBufferException - 如果响应缓冲区是只读的
      IllegalArgumentException - 如果command和response是同一个对象,如果response可能没有足够的空间来接收响应APDU,或者如果APDU编码了MANAGE CHANNEL命令
      CardException - 如果卡操作失败
    • close

      public abstract void close() throws CardException
      关闭此CardChannel。通过发出应使用格式[xx 70 80 0n]MANAGE CHANNEL命令来关闭逻辑通道,其中n是此通道的通道号,xx是编码此逻辑通道的CLA字节,所有其他位均设置为0。此方法返回后,调用此类中的其他方法将引发IllegalStateException。

      请注意,基本逻辑通道不能使用此方法关闭。可以通过调用Card.disconnect(boolean)来关闭它。

      抛出:
      CardException - 如果卡操作失败
      IllegalStateException - 如果此CardChannel表示与基本逻辑通道的连接