掉电读卡器 - 设计文档_v0.1
作者:互联网
掉电读卡器设计文档
版本V0.1
深圳融卡科技有限公司
公 司 网 址:http://rongcard.com
公 司 电 话:0755-86032937
地 址:深圳市南山区软件产业基地5B303
版本历史
版本 | 日期 | 版本描述 |
V1.0 | 2021/12/03 | 初次发布版本 |
目录
2.4.2. CMD_SET_SLAVE_EXE_TIME_LIMIT
1. 概述
为了搭建 SE 的自动化测试环境,需要设计一种高契合度的读卡器:
l 为了在性能测试中得到更精准的执行时间,它具有计时功能;
l 为了在掉电测试中模拟更真实的用户场景,它提供一套掉电测试接口;
l 为了解决 SE 异常时总需要物理拔插的问题,它能根据在执行测试之前预设的策略模拟人为操作,并会以事先约定好的方式告知测试脚本,使测试可以更好地自动化;
它还可以在兼顾上述特性的同时,满足 SE 测试不同协议的需求,以确保测试环境的一致性。
图 1.1 是一种支持自动化的测试环境示意图。
图 1.2 是上述读卡器的框图。
图 1.1 | 图 1.2 |
本读卡器在同一时刻只支持连接一个主机和一个从机。
2. 模块设计
本读卡器共有5个模块,分别是:主机通讯模块、私有指令处理模块、掉电指令处理模块、内核模块、从机驱动模块。
工程文件结构可能如下:
2.1. 主机通讯模块
该模块负责与主机通讯,定义了主机通过读卡器操作从机的一些命令,以及主机与读卡器之间的通讯协议。
2.1.1. 主机命令
名称 | 命令 |
冷复位 | FE FE FE FE |
热复位 | FE FE FE FD |
断电 | FE FE FE FC |
注意,连接的操作等同于冷复位,与复位的区别在于主机显不显示复位应答的值。
2.1.2. URAT协议
2.1.2.1. 通讯报文格式
接口 类型 | 后续 长度 | 数据 Tag | 数据 Len | 数据 Value | 时间 Tag | 时间 Len | 时间 Value | |
长度(字节) | 1 | 2 | 1 | 2 | X | 1 | 1 | X |
值 | XX | XXXX | 00 | XXXX | XXXXX | 01 | XX | XXXXX |
2.1.2.2. 接口类型
接口名称 | 值 |
ISO7816 | 0x00 |
SPI | 0x01 |
I2C | 0x02 |
... |
2.1.2.3. 通讯交互示例
--> 表示主机下发至读卡器
<-- 表示读卡器响应至主机
2.1.2.3.1. ISO7816冷复位
--> 00 0009 00 0004 FEFEFEFE 01 00
<-- 00 0017 00 0010 3B1D968117081212003D17060000C300 01 02 0108
2.1.2.3.1. ISO7816热复位
--> 00 0009 00 0004 FEFEFEFD 01 00
<-- 00 0017 00 0010 3B1D968117081212003D17060000C300 01 02 0054
2.1.2.3.1. ISO7816断电
--> 00 0009 00 0004 FEFEFEFC 01 00
<-- 00 0017 00 0002 9000 01 02 0012
2.2.3. RFU
保留扩展其它主机协议。
2.2. 内核模块
该模块充当主机和从机之间的“中间人”,使得它们之间无需实现对方的通讯协议,所有的交互均通过读卡器完成,包括一些基本的从机异常管理机制,以及记录从机的执行时间。
由于允许主机和从机支持多种通讯协议,因此该模块的实现方式可能是:主机和从机协议侧的接口定义为函数指针,协议切换时指向对应的协议实现函数,内核模块可以直接通过函数指针调用。
2.3. 从机驱动模块
该模块负责与从机通讯,定义了从机与读卡器之间的通讯协议。
2.3.1. ISO7816
略
2.3.2. SPI
略
2.3.3. I2C
略
2.3.4. RFU
保留扩展其它从机协议。
2.4. 私有指令处理模块
该模块定义了一些供主机使用的私有指令。
2.4.1. CMD_SET_WORKING_MODE
2.4.1.1. 命令描述
设置读卡器的工作模式。
2.4.1.2. 命令格式
编码 | 值(HEX) |
CLA | FF |
INS | CC |
P1 | 00 |
P2 | 00 |
LC | 02 |
DATA | 见数据域 |
2.4.1.3. 命令数据域
DATA_1 | DATA_2 | 说明 |
01 | 00 | 正常模式 |
01 | 01 | 保留 EMV |
01 | 02 | 保留 Memory card mode |
01 | 04 | 保留 NFC Test Mode |
01 | 80 | 掉电模式 |
2.4.1.4. 响应状态码
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
2.4.2. CMD_SET_SLAVE_EXE_TIME_LIMIT
2.4.2.1. 命令描述
设置读卡器支持从机执行一条命令的最长时间。在达到该限制时间后,读卡器主动使从机下电。
2.4.2.2. 命令格式
编码 | 值(HEX) |
CLA | FF |
INS | CC |
P1 | 01 |
P2 | 00 |
LC | 04 |
DATA | 见数据域 |
2.4.2.3. 命令数据域
四字节无符号整数,详见表 7.1 定义的 g_SlaveExeTimeLimit 全局变量。
2.4.2.4. 响应状态码
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
2.4.3. RFU
保留扩展其它私有指令。
2.5. 掉电指令处理模块
与在程序中设置掉电桩的测试方法不同,掉电读卡器更加贴近用户场景,其原理是先执行一遍需要测试的指令,得到执行时间之后设置一个掉电时间的步长(例如1ms)和预期掉电的执行时间,然后再次执行测试指令,当测试指令执行到指定时间段后,掉电读卡器控制从机下电,返回掉电状态字给主机,然后主机可通过掉电读卡器让从机上电,进行一些掉电测试验证。
打桩掉电与掉电读卡器的主要区别在于前者可以精准测试上层逻辑,但无法在类似Flash擦写的过程中掉电,而后者可以覆盖任意时间段。
2.5.1. Init_PD_parameter
2.5.1.1. 命令描述
初始化掉电相关参数配置。
2.5.1.2. 命令格式
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 00 |
P2 | 00 |
LC | 00:默认时间系数为 1.0 |
DATA | 见数据域 |
LE |
2.5.1.3. 命令数据域
一字节时间系数的整数 + 一字节时间系数的小数。
由读卡器组合,例如 00 + 05 = 0.5
2.5.1.4. 响应状态码
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
2.5.2. Get_PD_count
2.5.2.1. 命令描述
获取上一条指令的执行时间。
2.5.2.2. 命令格式
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 01 |
P2 | 00 |
LE | 03 |
2.5.2.3. 响应数据域
三字节无符号数值:表示上一条指令的执行时间,单位ms。
2.5.2.4. 响应状态码
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
2.5.3. Set_PD_PageWriteCnt
2.5.3.1. 命令描述
设置掉电时间的参数(启动掉电测试)
2.5.3.2. 命令格式
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 02 |
P2 | 00 |
LC | 03 |
DATA | 见数据域 |
2.5.3.3. 命令数据域
DATA_1 | DATA_2 | DATA_3 | 说明 |
XX | 时间参数的高字节 | 时间参数的低字节 | 读卡器应忽略 DATA_1,在附录A中定义时间参数 |
2.5.3.4. 响应状态码
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
2.5.4. Get_COS_info
2.5.4.1. 命令描述
获取卡片信息(已废弃)。
2.5.4.2. 命令格式
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 03 |
P2 | 00 |
LE | FF |
2.5.4.3. 响应数据域
2 字节 map 计数 + 4 字节 used_addr_no + 2 字节 RTR_ADDR + 247 字节用户地址所在页有效数据
2.5.4.4. 响应状态码
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
2.5.5. RFU
保留扩展其它掉电指令
3. 流程
3.1. 基本逻辑
图 3.1.1
3.2. 主机通讯流程
图 3.2.1
3.2.1. 拦截特殊指令
图 3.2.2 读卡器只有一个掉电子功能的场景
3.2.2. 处理特殊命令
图 3.2.3
3.2.3. 主机协议解析失败
图 3.2.4
3.2.3. 主机通讯超时
图 3.2.5
3.3. 从机通讯流程
图 3.3.1
3.3.2. 从机通讯超时处理
图 3.3.2
3.3.3. 从机协议解析失败
图 3.3.3
3.4. 掉电测试流程
图 3.4.1
3.4.1. 从机命令未能按预期触发掉电
这种情况读卡器将直接返回从机的响应数据,所以只需关闭掉电定时器。
图 3.4.2
4. 函数接口
以下协议接口将被定义为函数指针,由设置从机协议时读卡器完成切换协议实现函数。
4.1. 读卡器管理接口
4.1.1. 读卡器初始化
表 4.1.1.1
接口名称 | Reader_Init | ||
接口描述 | 执行一些初始化操作 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.1.2. 读卡器配置
表 4.1.2.1
接口名称 | Reader_config | ||
接口描述 | 根据主机下发的命令参数和附带的数据执行私有命令 | ||
类别 | 名称 | 类型 | 描述 |
参数 | cmd_type | u8 | 命令类型 |
cmd_para | u32 | 命令参数 | |
返回值 | void | 无返回 |
4.1.3. 主机消息分发
表 4.1.3.1
接口名称 | Reader_handleHostCommand | ||
接口描述 | 处理主机侧命令 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 待执行的主机消息 |
host_bufL | u16 | 待执行的主机消息长度 | |
返回值 | void | 无返回 |
4.1.4. 打开指定的定时器
表 4.1.4.1
接口名称 | Reader_timerOpen | ||
接口描述 | 计算掉电时间并打开定时器中断 | ||
类别 | 名称 | 类型 | 描述 |
参数 | calc_mode | u8 | 详见附录A定义的计算掉电时间 |
need_timer | u8 | 0:等待时间定时器 | |
返回值 | void | 无返回 |
4.1.5. 关闭指定的定时器
表 4.1.5.1
接口名称 | Reader_timerClose | ||
接口描述 | 关闭定时器中断 | ||
类别 | 名称 | 类型 | 描述 |
参数 | need_timer | u8 | 0:等待时间定时器 |
返回值 | void | 无返回 |
4.1.6. 关闭所有定时器
表 4.1.6.1
接口名称 | Reader_timerCloseAll | ||
接口描述 | 关闭所有定时器中断 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.1.7. 从机超时管理
表 4.1.7.1
接口名称 | Reader_slaveTimerOutManage | ||
接口描述 | 由从机超时中断处理函数调用,负责完成一些与协议无关的超时处理。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.2. 主机侧协议接口
4.2.1. 侦听主机消息
暂时由读卡器直接调用指定主机协议类型的侦听接口,后续可能需要支持自动识别。
表 4.2.1.1
接口名称 | Reader_listenHost | ||
接口描述 | 侦听主机下发的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 存储主机侧下发的消息 |
返回值 | message_length | u16 | 收到的消息长度 |
4.2.2. 主机侧协议解析
表 4.2.2.1
接口名称 | Reader_resolveHostPackage | ||
接口描述 | 解析主机侧下发的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 待解析的主机消息 |
host_bufL | u16 | 待解析的主机消息长度 | |
返回值 | result | boolean | 解析结果 |
4.2.3. 读卡器响应数据封包
表 4.2.3.1
接口名称 | Reader_packResp | ||
接口描述 | 将需要返回给主机的信息进行协议封包 | ||
类别 | 名称 | 类型 | 描述 |
参数 | reader_buf | u8 * | 读卡器的响应数据 |
reader_bufL | u16 | 读卡器响应数据的长度 | |
host_buf | u8 * | 存储待响应给主机的消息 | |
返回值 | message_length | void | 待响应给主机的消息长度 |
4.2.4. 响应主机消息
表 4.2.4.1
接口名称 | Reader_response | ||
接口描述 | 将协议包发送给主机 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 待响应给主机的消息 |
host_bufL | u16 | 待响应给主机的消息长度 | |
返回值 | result | boolean | 通讯结果 |
4.3. 从机侧协议接口
4.3.1. 侦听从机消息
表 4.3.1.1
接口名称 | Reader_listenSlave | ||
接口描述 | 侦听从机响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 存储从机侧响应的消息 |
返回值 | message_length | u16 | 收到的消息长度 |
4.3.2. 从机侧协议解析
表 4.3.2.1
接口名称 | Reader_resolveSlavePackage | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | slave_buf | u8 * | 待解析的从机消息 |
slave_bufL | u16 | 待解析的从机消息长度 | |
返回值 | result | boolean | 解析结果 |
4.3.3. 读卡器下发数据封包
表 4.3.3.1
接口名称 | Reader_packCommand | ||
接口描述 | 将需要下发给从机的信息进行协议封包 | ||
类别 | 名称 | 类型 | 描述 |
参数 | reader_buf | u8 * | 读卡器的命令数据 |
reader_bufL | u16 | 读卡器命令数据的长度 | |
slave_buf | u8 * | 存储待下发给从机的消息 | |
返回值 | message_length | void | 待下发给从机的消息长度 |
4.3.4. 下发从机消息
表 4.3.4.1
接口名称 | Reader_send | ||
接口描述 | 将协议包发送给从机 | ||
类别 | 名称 | 类型 | 描述 |
参数 | slave_buf | u8 * | 待响应给主机的消息 |
slave_bufL | u16 | 待响应给主机的消息长度 | |
返回值 | result | boolean | 通讯结果 |
4.3.5. 从机上电
表 4.3.5.1
接口名称 | Reader_slavePowerON | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.3.6. 从机冷复位
表 4.3.6.1
接口名称 | Reader_slaveColdReset | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.3.7. 从机热复位
表 4.3.7.1
接口名称 | Reader_slaveWarmReset | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.3.8. 从机下电
表 4.3.8.1
接口名称 | Reader_slavePowerOFF | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.3.9 从机响应特殊状态字封包
表 4.3.9.1
接口名称 | Reader_packSlaveRecv | ||
接口描述 | 将需要模拟从机响应的特殊状态字进行协议封包。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | slave_buf | u8 * | 存储从机消息 |
special_sw | u16 | 待封包的特殊状态字 | |
返回值 | slave_bufL | u16 | 存储从机消息的长度 |
4.3.10. 维护从机响应的等待时间
表 4.3.10.1
接口名称 | Reader_slaveWTX | ||
接口描述 | 读卡器将在下发从机命令之后,在侦听从机消息之前调用该接口,以处理协议中的延长等待时间操作。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
4.3.11. 从机超时中断处理
表 4.3.11.1
接口名称 | Reader_slaveTimerOutIRQHandle | ||
接口描述 | 读卡器在协议规定时间内未接收到从机发送的延长等待时间消息时,触发从机超时中断,进入该中断处理函数,完成与协议相关的超时处理之后,调用第 4.1.7 章节定义的从机超时管理接口。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
附录A 掉电时间计算公式
时间参数用于控制预期掉电的执行时间;时间系数用于微调掉电时间。
简单模式:掉电时间(ms) = 时间参数 * 时间系数
附录B 常量
表 6.1
常量名 | 常量值 | 描述 |
SW_POWER_OFF | 0x6FFF | 成功触发掉电定时器 |
附录C 全局变量
表 7.1
变量名 | 类型 | 长度 | 描述 |
g_ReaderMode | u8 | 1 | 读卡器工作模式 |
g_ReaderState | u8 | 1 | 读卡器状态,详见第 3.2 章节 |
g_PowerOffTimePara | u16 | 2 | 掉电时间参数,详见附录A |
g_PowerOffTimeFactor | float | 2 | 掉电时间系数,详见附录A |
g_PowerOffFlag | boolean | 1 | 掉电测试开关 0:默认值,表示没有特殊操作 1:表示启动掉电测试,详见第 3.2.5 章节 |
g_MessageBuf | u8 数组 | 1024 | 存储消息数据 |
g_CommandRespBuf | u8 数组 | 1024 | 存储命令和响应数据 |
g_SlaveExeTimeLimit | u32 | 4 | 设置从机执行一条命令的最长时间(ms) |
来自为知笔记(Wiz)
附件列表
标签:4.3,主机,掉电,接口,从机,读卡器,v0.1 来源: https://www.cnblogs.com/sunchukun/p/15674489.html