当前位置: 首页 > news >正文

IC卡的传输协议(2)-块传输协议T=1续【转】

转自:http://bbs.ednchina.com/BLOG_ARTICLE_172025.HTM

(3)容错操作

    先来看一下容错的规则定义。

   * 复位应答后,第一个数据块是由终端发往IC卡的,而且只能是一个I块或S块。
   
   * 若终端不希望使用长度为32Byte的IFSD初始值,则应向IC卡发送一个S块(IFS请求),S块(IFS请求)的PCB应具有值CI以表明是一个改变IFSD的请求。INF域包含一个字节,其值表示在所要求的IFSD的字节数,取值为0x20-0xFE。IC卡应向终端回送一个S块(IFS响应),确认终端更改IFSD的大小,其中S块(
IFS响应)的PCB应为0xE1,INF域应具有与请求改变S块的INF域相同的值。

   * 若IC卡希望改变在复位应答后制定的IFSC的大小,应向终端发送一个S块(IFS请求),S块(IFS请求)的PCB应具有值CI以表明是一个改变IFSD的请求。INF域包含一个字节,其值表示在所要求的IFSD的字节数,取值为0x10-0xFE。终端应向IC卡回送一个S块(IFS响应),确认终端更改IFSD的大小,其中S块(
IFS响应)的PCB应为0xE1,INF域应具有与请求改变S块的INF域相同的值。

   * 若要改变节点地址,由终端发出的第一个SAD和DAD将被设定为整个卡片操作过程中要使用的值。若不采用节点地址,则将其设为零。

   * 卡片操作过程中,只有满足以上定义的块才能相互传送。半双工块传输协议包含了终端和IC卡之间传送的情况。当发送方传送完一个完整的数据块后,就应切换到接收状态。

   * 当接收方所收到的字符数与LEN和EDC的值一致时,接收方取得发送权。

   * 若接收方需要确认由发送方传来的I块,则应在回送给发送方的I块序列号中指明。若使用链接,则在R块的序列号中指明(链接的最后一个数据块除外)。

   * 若响应中收到的I块序列号与前一个已收到的I块序列号不同,发送方即可认为I块已被确认。若前面没有收到过I块,响应中的I块序列号应该是0。

   * 在链接情况下,当响应中收到的R块的序列号与已确认的I块序列号不同时,发送方即可认为I块已被确认。

   * 若IC卡需要比BWT长的时间来处理已收到的I块,则应发送一个等待时间扩展请求S块(WTX请求),其中之一的INF域包含有1Byte的二进制整数,其值为所请求的BWT值的倍数。终端应发送一个INF中具有相同值的等待时间扩展请求S块(WTX响应),以表示对延时请求的确认。取得的时间从S块(WTX响应)的最后一个字符的上升沿开始算起。

   * S块总是配对使用的,一个S请求总是对应一个S响应块。

    如果出现不满足以上定义的情况,则终端和IC卡将检测到错误。

(4)链接

    当发送方需要传送的数据长度超过IFSC和IFSD所定义的字符数时,就要将其分成几个连续的I块。传送多个I块数据时,使用链接功能。

    I块的链接由PCB的b6位编码定义。
    b6=0表示是块链的最后一块
    b6=1表示后面还有后续的数据块

    由此可知,b6=1的任何一个I块都需要被一个R块确认。

    如果接收正确,对应b6=0的链上的最后一个数据块会被一个I块确认。否则,就会被一个R块确认。

    * 链接规则
  
    IC卡和TTL都支持链接,链接只能沿一个方向进行,其规则如下。

    a.当终端是接收方时,只要来自IC卡的每个块的长度不大于IFSD字节,终端应能够接收一组链接的I块。

    b.当终端是接收方时,如果IC卡发送的I块的长度大于IFSD,终端应通过发送一个R块来表示拒绝,R块的PCB的b1~b4位的值为2。

    c.当IC卡为接收方时,只要来自终端的每个块的长度不大于IFSD字节,IC卡应能够接收一组链接的I块。

    d.当IC卡是接收方时,如果终端发送的I块的长度大于IFSD,IC卡应通过发送一个R块来表示拒绝,R块的PCB的b1~b4位的值为2。

    e.当IC卡是发送方时,IC卡应能发送每个块长度不大于IFSD字节的链接I块。

    f.当终端是发送方时,终端应能发送每个块长度不大于IFSD字节的链接I块。

    * 链接块的构造

    C-APDU包含在I块的INF域中,并从TTL传送到IC卡。如果一个C-APDU因太长而不能放在一个数据块中时,可以通过如下的方法用几个链接块传送。

    Block (1) 
             CLA  INS  P1  P2  LC  Data  Data 
    Block (2)- Block (n-1)
             Data   Data   Data 
    Block (n) 
             Data   Data   Data    LC 

    如果由 IC 卡回送的数据和状态码因太长而不能放在一个块中,可以按照下述方法通过几个I块来处理。 

    Block (1)- Block (n-1)
             Data   Data   Data 
    Block (n) 
             Data   Data   Data    SW1  SW2

    示例只是针对命令一种情况,仅显示链接块的 INF 域。每个块还有一个头域和一个尾域。如果IC卡是发送方,全部链接块都应包含一个长度范围1到IFSD字节的INF域。如果终端是发送方,则包含一个长度范围1到IFSC字节的INF域。

2.5 T="1协议的错误检测与纠错"

    TTL应能检测以下错误:

    * 传输错误(非法的奇偶校验和EDC错误)或BWT超时; 
    * 同步失调(字符数目的超出或不足); 
    * 协议错误; 
    * 终止链接块请求。

    按照下述方法进行错误恢复:

    方法1:TTL以下列的次序按照下述技术方法进行纠错。

    * 块的重发; 
    * 使IC卡触点处于静止状态。

    方法2:IC卡以下列的次序按照下述技术方法进行纠错。

    * 块的重发; 
    * 处于不响应状态。

    错误处理和更正要满足如下规则。在任意一种情况下,当发送一个R块时,低半字节必须按照定义给定一个合适的值。

    a.当IC卡在复位应答后接收到的第一个块无效时,就应回送一个R块给TTL,并置b5=0和NAD=0。

    b.如果TTL发送的任何块在BWT时间内没有得到IC卡的响应,TTL将通过使IC卡的触点处于静止状态来结束卡片操作过程。

    c.如果响应I块的无效块被收到,发送方应发送一个R块,其中的b5位设为期望I块的编号。

    d. 如果响应R块的无效块被收到,发送方应重发R块。

    e.如果响应 S 块(XX请求)的 S(XX响应)块没有收到,发送方应重发一个 S(XX请求)块。

    f.如果响应 S(XX响应)块的应答中收到无效块,发送方应发出一个 R 块,b5 位设为下一个期望I块的编号。

    g.如果TTL连续三次发送一个块,或IC卡连续两次发送一个块,而没有得到一个有效的响应,TTL将通过使IC卡的触点处于静止状态来结束卡片操作过程。如果对于某些终端需要支持同步,它可以在结束卡片操作过程前通过发送一个S块(再同步请求)从IC卡获得一个有效的响应S块(再请求响应)来实现同步。

    h.在传输前,如接收方检测到传输不足或超出时,应等待一段时间(取 CWT 和BWT的最大值)。

    i. IC卡最多连续三次发送一个S(IFS请求)块,以便从TTL上得到一个有效的S(IFS响应)块。三次尝试失败后,IC卡即进入接收状态。

    j. TTL 一般主动发送一个 S(放弃请求)块。如果 TTL 从 IC 卡收到一个 S(放弃请求)块,TTL将通过使IC卡的触点处于静止状态来结束卡片操作过程。

    特别注意,在具体的应用中,不一定要求终端和IC卡支持交易中止功能。如果终端或IC卡需要交易中止的话,可以通过发送一个S块(放弃请求)来进行,此时,如果接收方不支持交易中止功能的话,可能会收到一个无效的响应,但终端将仍然结束卡片的操作过程。

【作者】 张昺华
【出处】 http://www.cnblogs.com/sky-heaven/
【博客园】 http://www.cnblogs.com/sky-heaven/
【新浪博客】 http://blog.sina.com.cn/u/2049150530
【知乎】 http://www.zhihu.com/people/zhang-bing-hua
【我的作品---旋转倒立摆】 http://v.youku.com/v_show/id_XODM5NDAzNjQw.html?spm=a2hzp.8253869.0.0&from=y1.7-2
【我的作品---自平衡自动循迹车】 http://v.youku.com/v_show/id_XODM5MzYyNTIw.html?spm=a2hzp.8253869.0.0&from=y1.7-2
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

相关文章:

  • Elasticsearch 2.3.0 老版本升级指南
  • java web
  • Office online server 部署
  • JRE与JDK简介
  • ConcurrentHashMap
  • Oracle语句异常
  • jmeter 302请求测试
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • Scrum4.0
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 打印出100到999的水仙花数
  • HDOJ/HDU 2568 前进(简单题)
  • java实现上传图片进行切割
  • XNA游戏开发之滚动背景
  • Java程序中添加播放MIDI音乐功能
  • 10个最佳ES6特性 ES7与ES8的特性
  • golang中接口赋值与方法集
  • Javascript编码规范
  • MySQL主从复制读写分离及奇怪的问题
  • PHP 小技巧
  • Python 基础起步 (十) 什么叫函数?
  • Ruby 2.x 源代码分析:扩展 概述
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Xmanager 远程桌面 CentOS 7
  • 基于HAProxy的高性能缓存服务器nuster
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端路由实现-history
  • 如何解决微信端直接跳WAP端
  • 小程序01:wepy框架整合iview webapp UI
  • 小程序测试方案初探
  • 小程序开发之路(一)
  • 一文看透浏览器架构
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $ git push -u origin master 推送到远程库出错
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (c语言)strcpy函数用法
  • (k8s中)docker netty OOM问题记录
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法设计与分析)第一章算法概述-习题
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .bat批处理出现中文乱码的情况
  • .Net(C#)自定义WinForm控件之小结篇
  • .Net环境下的缓存技术介绍
  • .NET轻量级ORM组件Dapper葵花宝典
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @ResponseBody
  • @Transactional 详解
  • [ C++ ] 继承
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [100天算法】-目标和(day 79)